组件是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. 【Miller-Rabin随机判素数算法】

    实用性介绍: #include<bits/stdc++.h> #define go(i,a,b) for(int i=a;i<=b;i++) #define T 5 #define ...

  2. [3.24校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...

  3. 最近i学习微信卡券中的会员卡功能,弄清楚不容易 ,分享一下。

    创建会员卡接口 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283 [4.1 创建会员卡接口] { " ...

  4. VS2017+xamain开发安卓(Addroid)应用

    Visual Studio 2017下载地址: https://www.visualstudio.com/zh-hans/ 安卓模拟器官网下载:  https://www.visualstudio.c ...

  5. 如何使用 TeamViewer 配置QuickConnect按钮?

    QuickConnect作为TeamViewer中一个比较重要的部分,得到了很多用户的认可.那么在实际运用中,怎么才能设置网页或单个程序的QuickConnect呢?所以小编以此问题为例,教大家如何配 ...

  6. gulp将多张小图自动合成雪碧图

    最近一直在做移动端的改版项目,做之前老大就跟我说了好几次,说这次改版一定要用雪碧图减少一个页面的图片的请求次数,能加快页面的加载速度就一定要加快,我说可以.因为之前的项目开发时间过短,也没有时间去慢慢 ...

  7. 电子凭证 : Java 生成 Pdf

    来源:蛙牛, my.oschina.net/lujianing/blog/894365 如有好文章投稿,请点击 → 这里了解详情 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中 ...

  8. eclipse中创建完整的maven项目

    使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 ...

  9. 单页应用动态设置页面title

    1.适用场景:所有通过router路由的单页应用. 2.示例代码:本文以vue-router为例. 在router.js中: let router = new Router({ routes: [ { ...

  10. 加解密、PKI与CA基础

    介绍 这门知识如果以前尝过的各位想必都知道:枯燥无比!因此在文中我会尽量讲的生动些,举一些例子,并试图以一个完整的例子来贯穿整个讲述过程.今年又恰逢莎翁逝世400周年,一方面也为了纪念这位伟大的作家. ...