专栏名称: tenor
目录
相关文章推荐
潇湘晨报  ·  麻六记紧急回应! ·  昨天  
新闻株洲  ·  3月1日起,领“红包”! ·  昨天  
湖南日报  ·  突发7.6级地震,震源深度10公里 ·  2 天前  
湖南日报  ·  张兰名下7家公司均已吊销或注销 ·  3 天前  
潇湘晨报  ·  被批吃软饭!具俊晔惊人资产公开 ·  3 天前  
51好读  ›  专栏  ›  tenor

React 之受控组件和非受控组件

tenor  · 掘金  ·  · 2018-07-02 02:26

正文

阅读 43

React 之受控组件和非受控组件

在React中,所谓受控组件和非受控组件,是针对表单而言的。

表单受控组件

  • 表单元素依赖于状态,表单元素需要默认值实时映射到状态的时候,就是受控组件,这个和双向绑定相似.
  • 受控组件,表单元素的修改会实时映射到状态值上,此时就可以对输入的内容进行校验.
  • 受控组件只有继承React.Component才会有状态.
  • 受控组件必须要在表单上使用onChange事件来绑定对应的事件.
class Control extends React.Component {
    // 这样的写法也是声明在实例上的对象
    state = {// 给组件状态设置默认值,在实时修改时进行校验
        username: "zf",
        pwd: "123"
    }

    // e为原生的事件绑定对象
    handleChange = (e) => {
        // 获取原生对象上的属性
        let name = e.target.name;
        // 根据表单元素的name名称进行匹配,比如用户名的name是username,那新输入的值将更新原来的值
        this.setState({
            [name]: e.target.value
        })
    }

    render() {
        return (
            <div>
                <p>{this.state.username}</p>
                用户名:<input
                    name="username"
                    type="text"
                    value={this.state.username}
                    onChange={this.handleChange} /> <br />

                <p>{this.state.pwd}</p>
                密码:<input
                    name="pwd"
                    type="text"
                    value={this.state.pwd}
                    onChange={this.handleChange} /> <br />
            </div>
        )
    }
}

受控组件显示结果

怎么样,这个效果是不是和双向绑定很相似?

注意:

  • 在受控组件中,如果没有给输入框绑定onChange事件,将会收到react的警告
  • 并且此时输入框除了默认值,是无法输入其他任何参数的
class Control extends React.Component {
    constructor() {
        super();
        this.state = {
            username: "zds",
            age: 10
        }
    }
    render() {
        return (
            <div>
                username:<input
                    type="text"
                    name="username"
                    value={this.state.username} /><br />
                age:<input
                    type="text"
                    name="age"
                    value={this.state.age} />
            </div>
        )
    }
}

结果可以从如下图中看出:

  • 输入框没有绑定onChange事件无法修改输入框中的值
  • 会触发react警告

非受控组件

  • 非受控组件即不受状态的控制,获取数据就是相当于操作DOM。
  • 非受控组件的好处是很容易和第三方组件结合。

获取输入框中的值的两种方法

  • ref 功能是一样,只是写法不一样,可以让我们操作DOM

第一种方式是函数

  • 在虚拟DOM节点上使用ref,并使用函数,将函数的参数挂载到实例的属性上
handleSubmit = (e) => {
    // 阻止原生默认事件的触发
    e.preventDefault();
    console.log(this.username.value);
}
render






请到「今天看啥」查看全文