React 组件协同关系
组件协同的两种方法,1种是纵向的协同,就是组件嵌套,重点在于代码的封装,2种是横向协同也就是Mixin,组件抽离,重点在于代码复用
1、组件嵌套,父组件通过属性向子组件,子组件可以通过事件处理函数以委托的方式想父组件发送数据
1 <!DOCTYPE html>2 <html>
3 <head>
4 <meta http-equiv='Content-type' content='text/html; charset=utf-8'>
5 <title>daomul's example</title>
6 <link rel="stylesheet" href="../shared/css/base.css" />
7 </head>
8 <body>
9 <h1>Text demo</h1>
10 <div id="container">
11
12 </div>
13
14 <script src="../shared/thirdparty/es5-shim.min.js"></script>
15 <script src="../shared/thirdparty/es5-sham.min.js"></script>
16 <script src="../shared/thirdparty/console-polyfill.js"></script>
17 <script src="../../build/react.js"></script>
18 <script src="../../build/JSXTransformer.js"></script>
19 <script type="text/jsx">
20
21 //选择组件
22 var GenderSelect = React.createClass({
23
24 render:function(){
25 console.log("render,4");
26 return <select onChange = {this.props.handleSelect}>
27 <option value = "0">男</option>
28 <option value = "1">女</option>
29 </select>;
30 },
31 });
32
33 //表单组件
34 var SignupForm = React.createClass({
35 getInitialState:function(){
36 return {
37 name :'',
38 password:'',
39 gender:0,
40 };
41 },
42 handleChange:function(name,event){
43 var newState = {};
44 newState[name] = event.target.value;
45 this.setState(newState);
46 },
47 handleSelect:function(event){
48 this.setState({gender:event.target.value});
49 },
50 render:function(){
51 console.log(this.state);
52 return <form>
53 <input type = "text" placeholder = "请输入用户名" onChange = {this.handleChange.bind(this,'name')} ></input>
54 <input type = "text" placeholder = "请输入密码" onChange = {this.handleChange.bind(this,'password')} ></input>
55 <GenderSelect type="text" handleSelect = {this.handleSelect}></GenderSelect>
56 </form>;
57 },
58 });
59
60 React.render(<SignupForm></SignupForm> ,document.body);
61
62 </script>
63 </body>
64 </html>
2、Mixin就是 横向抽离相似的代码
1 <!DOCTYPE html>2 <html>
3 <head>
4 <meta http-equiv='Content-type' content='text/html; charset=utf-8'>
5 <title>daomul's example</title>
6 <link rel="stylesheet" href="../shared/css/base.css" />
7 </head>
8 <body>
9 <h1>Text demo</h1>
10 <div id="container">
11
12 </div>
13
14 <script src="../shared/thirdparty/es5-shim.min.js"></script>
15 <script src="../shared/thirdparty/es5-sham.min.js"></script>
16 <script src="../shared/thirdparty/console-polyfill.js"></script>
17 <script src="../../build/react.js"></script>
18 <script src="../../build/JSXTransformer.js"></script>
19 <script type="text/jsx">
20
21 //Mixin
22 var BindMixin = {
23 handleChange:function(key){
24 //先将this保存起来是因为在js中,方法内部再调用函数的话会使得this的丢失
25 var self = this
26 //这个变量如果放在function内部的话会加大构建的内存损耗
27 var newState = {}
28 return function(event){
29 //这里不能直接使用self.setState({key:event.targe.value})
30 //因为key是作为'key'字符串的存在传入的
31 newState[key] = event.target.value
32 self.setState(newState)
33 }
34 }
35 }
36 var TextClass = React.createClass({
37
38 //这里就是作为对Mixin的使用
39 mixins : [BindMixin],
40 getInitialState:function(){
41 return {
42 name :'',
43 password:'',
44 };
45 },
46 render:function(){
47 return <div>
48 <input type = "text" placeholder = "请输入用户名" onChange = {this.handleChange('name')} ></input>
49 <input type = "text" placeholder = "请输入密码" onChange = {this.handleChange('password')} ></input>
50 <p>{this.state.name}</p>
51 <p>{this.state.password}</p>
52 </div>;
53 },
54 });
55
56 React.render(<TextClass></TextClass> ,document.body);
57
58 </script>
59 </body>
60 </html>
以上是 React 组件协同关系 的全部内容, 来源链接: utcz.com/z/381990.html