概要

image.png

前言

image.png

  • 不可控组件

image.png

  • 可控组件

image.png

  • 可控组件的好处

image.png

源码

  1. 不可控组件 使用的是 defaultValue 属性 ``` //不可控组件 defaultValue var HelloMassage = React.createClass({ //设置默认状态 getInitialState: function() {
    1. return {
    2. data: this.props.data
    3. }
    }, //组件被渲染之后 componentDidMount: function() {
    1. var me = this;
    2. setTimeout(function() {
    3. // 修改属性值
    4. //这个因为下面使用的是 defaultValue 所以这个是不会生效的,只能通过下面的赋值的写死的方法来改变,这个就是不可控组件
    5. me.setState({
    6. data: 123
    7. });
    8. console.log("我已渲染完毕");
    9. }, 1000);
    10. ReactDOM.findDOMNode(this.refs.uname).value = "123";
    }, render: function() {
    1. return <input ref="uname" defaultValue={this.state.data} type="text"/>
    }, }); ReactDOM.render( , document.getElementById(“example”) )
  1. - 浏览器效果图
  2. > ![image.png](http://upload-images.jianshu.io/upload_images/9064013-6f5f6507fdf880d6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  3. 2. 可控组件 使用的是 `value` `onChange` 属性

//可控组件 value 和 onChange 属性 var HelloMassage = React.createClass({ //设置默认状态 getInitialState: function() { return { data: this.props.data } }, //组件被渲染之后 componentDidMount: function() { var me = this; setTimeout(function() { // 修改属性值
//这个因为下面使用的是 defaultValue 所以这个是不会生效的,只能通过下面的赋值的写死的方法来改变,这个就是不可控组件 me.setState({ data: 123 }); console.log(“我已渲染完毕”); }, 1000); // ReactDOM.findDOMNode(this.refs.uname).value = “123”; }, //自定义的方法可以在里面什么都不写的,不写的话 下面的 input 的值就不可编辑了,所以还是需要在下面补全方法的 onchange: function(e) { var me = this; me.setState({ data: e.target.value }); }, render: function() { return }, }); ReactDOM.render( , document.getElementById(“example”) );

```

总结:

React 的数据流是通过 state 状态来进行驱动的