组件是React的核心,构建大型项目时多个组件之间需要进行协同使用。可以从横向和纵向两个角度来实现组件的协同使用,纵向的协同使用就是组件嵌套,横向的协同使用就是Mixin(抽取公共方法)。下面介绍两种方式

组件协同使用介绍


        当组件越来越多的时候,我们就需要对组件进行管理。
        组件的协同本质上是对组件的一种组织、管理方式。
        目的:
        逻辑清晰
        代码模块化
        封装细节
        代码可复用

        实现组件的协同的方式有:组件嵌套、Mixin(抽离)。

组件嵌套


        组件嵌套的本质是父子关系。
        父子之间的通讯
        

        优点:
        逻辑清晰:父子关系和人类社会的父子关系对应,易于理解
        代码模块化:每个模块对应一个功能,不同的模块可以同步开发
        封装细节:开发者只需要关注组件的功能,不用关心组件的实现细节

        缺点:
        编写难度高:父子关系的具体实现需要经过深思熟虑,贸然编写将导致关系混乱、代码难以维护
        无法掌握所有细节:使用者只知道组件用法,不知道实现细节,遇到问题难以修复
<script type="text/babel">
//child
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>
}
});
ReactDOM.render(<SignupForm></SignupForm>, document.body);
</script>

Mixin 编写和使用


        Mixin = 一组方法
        Mixin的目的是横向抽离出组件的相似代码
        相似概念:面向切面编程、插件

        优点:
        代码复用:抽离出通用代码,减少开发成本,提高开发效率
        即插即用:可以直接使用许多现有的Mixin来编写自己的组件
        适应性强:改动一次代码,影响多个组件

        缺点:
        编写难度高:Mixin 可能被用在各种环境中,兼容多种环境就需要更多的逻辑和代码,通用的代价是提高复杂度
        降低代码可读性:组件的优势在于将逻辑和界面直接结合在一起,Mixin本质上会分散逻辑,理解起来难度更大

原始的代码
var BindingExample = React.createClass({
getInitialState: function() {
return {
text: ''
}
},
handleChange: function(event) {
this.setState({text: event.target.value})
},
handleChange2: function(event) {
this.setState({text2: event.target.value})
},
render: function() {
return (
<div>
<input type="text" placeholder="请输入内容" onChange={this.handleChange} />
<p>{this.state.text}</p>
<input type="text" placeholder="请输入内容" onChange={this.handleChange2} />
<p>{this.state.text2}</p>
</div>
)
}
});
ReactDOM.render(<BindingExample></BindingExample>, document.body);
使用Minxin方式后的代码
var BindingMixin = {
handleChange: function(key) {
var that = this;
var newState = {};
return function(event) {
newState[key] = event.target.value;
that.setState(newState);
}
}
};
var BindingExample = React.createClass({
mixins: [BindingMixin],
getInitialState: function() {
return {
text: '',
text2: '',
}
},
render: function() {
return (
<div>
<input type="text" placeholder="请输入内容" onChange={this.handleChange('text')} />
<p>{this.state.text}</p>
<input type="text2" placeholder="请输入内容" onChange={this.handleChange('text2')} />
<p>{this.state.text2}</p>
</div>
)
}
});
ReactDOM.render(<BindingExample></BindingExample>, document.body);
使用React自带的Mixin方式
var BindingExample = React.createClass({
mixins: [React.addons.LinkedStateMixin],
getInitialState: function() {
return {
text: '',
text2: '',
}
},
render: function() {
return (
<div>
<input type="text" placeholder="请输入内容" valueLink={this.linkState('text')} />
<p>{this.state.text}</p>
<input type="text2" placeholder="请输入内容" valueLink={this.linkState('text2')} />
<p>{this.state.text2}</p>
</div>
)
}
});
ReactDOM.render(<BindingExample></BindingExample>, document.body);

5. React 组件的协同使用 组件嵌套和Mixin的更多相关文章

  1. React.js 小书 Lesson8 - 组件的组合、嵌套和组件树

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson8 转载请注明出处,保留原文链接和作者信息. 继续拓展前面的例子,现在我们已经有了 Heade ...

  2. React 深入系列2:组件分类

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列2:组件分类 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助大家加 ...

  3. React进阶之高阶组件

    前言 本文代码浅显易懂,思想深入实用.此属于react进阶用法,如果你还不了解react,建议从文档开始看起. 我们都知道高阶函数是什么, 高阶组件其实是差不多的用法,只不过传入的参数变成了react ...

  4. React中的高阶组件,无状态组件,PureComponent

    1. 高阶组件 React中的高阶组件是一个函数,不是一个组件. 函数的入参有一个React组件和一些参数,返回值是一个包装后的React组件.相当于将输入的React组件进行了一些增强.React的 ...

  5. react(二):组件的通信

    对于组件来说,通信无非两种,父子组件通信,和非父子组件通信 一.父子父子组件通信 1.父组件给子组件传值 对于父组件来说,props是他们之间的媒介 class Parent extends Comp ...

  6. WijmoJS V2019.0 Update2发布:再度增强 React 和 Vue 框架的组件功能

    前端开发工具包 WijmoJS 在2019年的第二个主要版本 V2019.0 Update2 已经发布,本次发布涵盖了React 和 Vue 框架下 WijmoJS 前端组件的功能增强,并加入更为易用 ...

  7. 封装React AntD的dialog弹窗组件

    前一段时间分享了基于vue和element所封装的弹窗组件(封装Vue Element的dialog弹窗组件),今天就来分享一个基于react和antD所封装的弹窗组件,反正所使用的技术还是那个技术, ...

  8. react第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参)

    第六单元(react组件通信-父子组件通信-子父组件通信-跨级组件的传参方式-context方式的传参) #课程目标 1.梳理react组件之间的关系 2.掌握父子传值的方法 3.掌握子父传值的方法 ...

  9. React 世界的一等公民 - 组件

    猪齿鱼Choerodon平台使用 React 作为前端应用框架,对前端的展示做了一定的封装和处理,并配套提供了前端组件库Choerodon UI.结合实际业务情况,不断对组件优化设计,提高代码质量. ...

随机推荐

  1. NOIP 2013

    Prob.1 转圈游戏 找到循环节,然后快速幂.代码: #include<cstdio> #include<cstring> #include<iostream> ...

  2. bzoj 3174: [Tjoi2013]拯救小矮人

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  3. (MariaDB/MySQL)之DML(2):数据更新、删除

    本文目录:1.update语句2.delete语句 2.1 单表删除 2.2 多表删除3.truncate table 1.update语句 update用于修改表中记录. # 单表更新语法: UPD ...

  4. day4 liaoxuefeng--调试、线程、正则表达式

    一.错误.调试和测试 二.进程和线程 三.正则表达式

  5. Python作业之购物车

    作业之购物车 购物车的要求如下: 输入总金额 选择购买的商品,金额足够时,把选择的商品添加到购物车,金额不足时,进行提示,商品将不会添加到购物车 随时可以退出程序,同时输出已购买的商品 具体代码如下: ...

  6. C语言第二次作业-----顺序结构

    一:改错题 (1)输出指定信息: 将给定源代码输入编译器: 执行编译命令,发现编译器报错,错误信息如下: 经检查,发现源程序将"stdio.h"误拼为"stido.h&q ...

  7. 在 Mac OS X 上安装 TensorFlow

    在 Mac OS X 上安装 TensorFlow 这个文档说明了如何在 Mac OS X 上安装 TensorFlow. 注意:从 1.2 版本开始,在 Mac OS X 上 TensorFlow ...

  8. 数组的遍历你都会用了,那Promise版本的呢

    这里指的遍历方法包括:map.reduce.reduceRight.forEach.filter.some.every因为最近要进行了一些数据汇总,node版本已经是8.11.1了,所以直接写了个as ...

  9. java客户端Jedis操作Redis Sentinel 连接池

    pom配置: <dependency> <groupId>org.springframework.data</groupId> <artifactId> ...

  10. 深入理解Lambda函数及其用法

    Lambda函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可. 先来看个简单lambda函数 ...