React组件协同使用

组件协同的本质是对组件的一种组织、管理方式。

1.组件嵌套

2.Mixin(混入,把一段代码混到组件中)


一、组件嵌套

本质是父子关系。

父组件 —(属性)—子组件

子组件—(事件处理函数(委托))—父组件

优点:

逻辑清晰:父子关系

代码模块化:同步开发

封装细节

缺点:

编写难度高:处理父子关系

无法掌握细节


实例代码如下:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>父子关系</title>
</head>
<body>
<script src="./build/react.js"></script>
<script src="./build/JSXTransformer.js"></script>
<script type="text/jsx">
    var GenderSelect = React.createClass({
        render: function() {
            return <select onChange={this.props.handleSelect}>
                <option value="0"></option>
                <option value="1"></option>
            </select>
        }
    })
    var SignupForm = React.createClass({
        getInitialState: function() {
            return {
                name: '',password: '',gender: '',}
        },handleChange: function(name,event) {
            var newState = {}
            newState[name] = event.target.value  this.setState(newState)
        },handleSelect: function(event) {
            this.setState({gender: event.target.value})
        },render: function() {
            console.log(this.state)
            return <form>
                <input type="text" placeholder="请输入用户名" onChange={this.handleChange.bind(this,'name')} />
                <input type="password" placeholder="请输入密码" onChange={this.handleChange.bind(this,'password')} />
                <GenderSelect handleSelect={this.handleSelect}></GenderSelect>
            </form>
        }
    })
    React.render(<SignupForm></SignupForm>,document.body);
</script>
</body>
</html>

二、Mixin编写和使用

Mixin=一组方法

Mixin的目的是横向抽离出组件的相似代码

相似概念:面向切面编程、插件

优点:

代码复用

即插即用

适应性强

缺点:

编写难度高

降低代码可读性

代码如下:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Mixin</title>
</head>
<body>
<script src="./build/react.js"></script>
<script src="./build/JSXTransformer.js"></script>
<script type="text/jsx">
    /*var BindingExample = React.createClass({  getInitialState:function () {  return {  text:''  }  }, handleChange:function (event) {  this.setState({text:event.target.value});  }, render:function () {  return <div>  <input type="text" placeholder="请输入内容" onChange={this.handleChange}/>  <p>{this.state.text}</p>  </div>  }  });*/  var BindingMixin = {
        handleChange:function (key) {
            var that = this;
            return function () {
                var newState = {};
                newState[key] = event.target.value;
                that.setState(newState);
            }
        },};
    var BindingExample = React.createClass({
        mixins:[BindingMixin],getInitialState:function () {
            return {
                text:'',comment:''  }
        },render:function () {
            return <div>
                <input type="text" placeholder="请输入内容" onChange={this.handleChange('text')}/>
                <textarea onChange={this.handleChange('comment')}></textarea>
                <p>{this.state.text}</p>
                <p>{this.state.comment}</p>
            </div>
        }
    });
    React.render(
            <BindingExample></BindingExample>,document.body  );
</script>
</body>
</html>

相关文章

react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接...
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc ...