react之可控组件与不可控组件

一、不可控组件

1 <input type="text" defaultvalue="Hello React" />

如上:defaultvalue的值是固定的,这就是一个不可控组件

如果要获取input的value值,只有使用ref获取节点来获取值

二、可控组件

1 <input type="text" defaultvalue={this.state.value} />

如上:defaultvalue的值是根据状态确定的,只需要拿到this.state.value的值就可以了,

这里需要注意一下:使用value的值是不可以修改的,defaultValue的值是可以修改的

三、可控组件的优点

1、符合React的数据流

2、数据存储在state中,便于获取

3、便于处理数据

 1 import React from 'react';
 2 import ReactDOM from 'react-dom';
 3  
 4 // 不可控组建,要是使用refs属性对DOM节点进行操作
 5 class UnControll extends React.Component {
 6     submitData = (e)=> {
 7         var userInput1 = ReactDOM.findDOMNode(this.refs.userInput1).value;
 8         var userInput2 = ReactDOM.findDOMNode(this.refs.userInput2).value;
 9         alert(userInput1);
10         alert(userInput2)
11         e.preventDefault();
12     }
13     render(){
14         return (
15             <form onSubmit={this.submitData}>
16                 {/*
17                     在表单中,使用value是无法改变的,需要使用defaultValue
18                     checked与defaultChecked同上
19                 */}
20                 <input
21                     type="text"
22                     value="不可控组件"
23                     ref="userInput1"
24                 />
25                 <input
26                     type="text"
27                     defaultValue="不可控组件"
28                     ref="userInput2"
29                 />
30                 <button>提交</button>
31             </form>
32         )
33     }
34 }
35  
36 // 可控组建,不需要对DOM进行操作
37 class Controll extends React.Component {
38     state = { value:'可控组件' }
39     submitData = (e)=> {
40         alert(this.state.value);
41         e.preventDefault();
42     }
43     handleChange = (e)=>{
44         this.setState({
45             value:e.target.value
46         })
47     }
48     render() {
49         return (
50             <form onSubmit={this.submitData}>
51                 <input
52                     type="text"
53                     defaultValue={this.state.value}
54                     onChange={this.handleChange}
55                 />
56                 <button>提交</button>
57             </form>
58         );
59     }
60 }
61  
62 export default Controll;