React Mixin
为什么使用 Mixin ?
React
为了将同样的功能添加到多个组件当中,你需要将这些通用的功能包装成一个mixin
,然后导入到你的模块中。 可以说,相比继承而已,React
更喜欢这种组合的方式。
写一个简单的 Mixin
现在假设我们在写一个app,我们知道在某些情况下我们需要在好几个组件当中设置默认的name
属性。
现在,我们不再是像以前一样在每个组件中写多个同样的getDefaultProps
方法,我们可以像下面一样定义一个mixin
:
var DefaultNameMixin = {
getDefaultProps: function () {
return {name: "Skippy"};
}
};
它没什么特殊的,就是一个简单的对象而已。
加入到 React 组件中
为了使用mixin
,我们只需要简单得在组件中加入mixins
属性,然后把刚才我们写的mixin
包裹成一个数组,将它作为该属性的值即可:
var ComponentOne = React.createClass({
mixins: [DefaultNameMixin],
render: function() {
return <h2>Hello {this.props.name}</h2>;
}
}); React.renderComponent(<ComponentOne />, document.body);
重复使用
就像你想象的那样,我们可以在任何其他组件中包含我们的mixin
:
var ComponentTwo = React.createClass({
mixins: [DefaultNameMixin],
render: function () {
return (
<div>
<h4>{this.props.name}</h4>
<p>Favorite food: {this.props.food}</p>
</div>
);
}
});
生命周期方法会被重复调用!
如果你的mixin
当中包含生命周期方法,不要焦急,你仍然可以在你的组件中使用这些方法,而且它们都会被调用:
两个getDefaultProps
方法都将被调用,所以我们可以得到默认为Skippy
的name
属性和默认为Pancakes
的food
属性。任何一个生命周期方法或属性都会被顺利地重复调用,但是下面的情况除外:
render
:包含多个render
方法是不行的。React 会跑出异常:displayName
:你多次的对它进行设置是没有问题的,但是,最终的结果只以最后一次设置为准。
需要指出的是,mixin
是可以包含在其他的mixin
中的:
var UselessMixin = {
componentDidMount: function () {
console.log("asdas");
}
}; var LolMixin = {
mixins: [UselessMixin]
}; var PantsOpinion = React.createClass({
mixins: [LolMixin],
render: function () {
return (<p>I dislike pants</p>);
}
}); React.renderComponent(<PantsOpinion />, document.body);
程序会在控制台打印出asdas
。
包含多个 Mixins
我们的mixins
要包裹在数组当中,提醒了我们可以在组件中包含多个mixins
:
var DefaultNameMixin = {
getDefaultProps: function () {
return {name: "Lizie"};
}
}; var DefaultFoodMixin = {
getDefaultProps: function () {
return {food: "Pancakes"};
}
}; var ComponentTwo = React.createClass({
mixins: [DefaultNameMixin, DefaultFoodMixin],
render: function () {
return (
<div>
<h4>{this.props.name}</h4>
<p>Favorite food: {this.props.food}</p>
</div>
);
}
});
注意事项
这里有几件事需要引起我们的注意,当我们使用mixins
的时候。 幸运地是,这些看起来并不是什么大问题,下面是我们在实践当中发现的一些问题:
设置相同的 Prop 和 State
如果你尝试在不同的地方定义相同的属性时会异常:
设置相同的方法
在不同的mixin
中定义相同的方法,或者mixin
和组件中包含了相同的方法时,会抛出异常:
var LogOnMountMixin = {
componentDidMount: function () {
console.log("mixin mount method");
this.logBlah()
},
// add a logBlah method here...
logBlah: function () {
console.log("blah");
}
}; var MoreLogOnMountMixin = {
componentDidMount: function () {
console.log("another mixin mount method");
},
// ... and again here.
logBlah: function () {
console.log("something other than blah");
}
};
异常信息同多次定义rander
方法时抛出的异常一样:
多个生命周期方法的调用顺序
如果我们的组件和mixin
中都包含了相同的生命周期方法的话会怎样呢?
我们的
mixin
方法首先会被调用,然后再是组件的中方法被调用。
那当我们的组件中包含多个mixin
,而这些mixin
中又包含相同的生命周期方法时,调用顺序又是如何?
它们会根据
mixins
中的顺序从左到右的进行调用。
实例代码:
var LogOnMountMixin = {
componentDidMount: function () {
console.log("mixin mount method");
}
}; var MoreLogOnMountMixin = {
componentDidMount: function () {
console.log("another mixin mount method");
}
};
var ComponentOne = React.createClass({
mixins: [MoreLogOnMountMixin, LogOnMountMixin],
componentDidMount: function () {
console.log("component one mount method");
},
... var ComponentTwo = React.createClass({
mixins: [LogOnMountMixin, MoreLogOnMountMixin],
componentDidMount: function () {
console.log("component two mount method");
},
...
控制台将输出:
another mixin mount method
mixin mount method
component one mount method mixin mount method
another mixin mount method
component two mount method
总结
Mixin 使你React程序变得更为可重用,It's a Good Thing.
React Mixin的更多相关文章
- React.js 常用技术要点
最近在公司的一个移动端WEB产品中使用了React这个框架(并不是React-Native),记录一下在开发过程中遇到的各种问题以及对应的解决方法,希望能对读者有所帮助. React原则 React不 ...
- React-代码复用(mixin.hoc.render props)
前言 最近在学习React的封装,虽然日常的开发中也有用到HOC或者Render Props,但从继承到组合,静态构建到动态渲染,都是似懂非懂,索性花时间系统性的整理,如有错误,请轻喷~~ 例子 以下 ...
- react创建组件的几种方式及其区别
react创建组件有如下几种方式 ①.函数式定义的无状态组件 ②.es5原生方式React.createClass定义的组件 ③.es6形式的extends React.Component定义的组 ...
- React创建组件的三种方式及其区别
内容转载于http://www.cnblogs.com/wonyun/p/5930333.html React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归; 具体的三种方式: ...
- 使用react常见的坑
触摸事件 React中的触摸事件仅用三种,touchstart, touchend, touchend,可是这种会有问题,有时候我需要滚动页面的时候,很容易触发某一个元素的touchend事件,为此笔 ...
- 【03】react 之 创建component
React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归:具体的三种方式: 函数式定义的无状态组件 es5原生方式React.createClass定义的组件 es6形式的ext ...
- React 代码共享最佳实践方式
任何一个项目发展到一定复杂性的时候,必然会面临逻辑复用的问题.在React中实现逻辑复用通常有以下几种方式:Mixin.高阶组件(HOC).修饰器(decorator).Render Props.Ho ...
- react-native-android之初次相识
作为一名Android开发者,我的感觉就是,一步一卡,卡的潇洒. 但是我还是要学react-native,不要问我为什么,因为我相信一门解决了原生app,开发周期长,开发成本高,升级代价大的语言一定会 ...
- 301-React Ext-React创建组件的三种方式及其区别
一.概述 React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归:具体的三种方式: 函数式定义的无状态组件 es5原生方式React.createClass定义的组件 es6形 ...
随机推荐
- 最短路径算法(II)
什么??你问我为什么不在一篇文章写完所有方法?? Hmm…其实我是想的,但是博皮的加载速度再带上文章超长图片超多的话… 可能这辈子都打不开了吧… 上接https://www.cnblogs.com/U ...
- [转载]Java集合框架的常见面试题
http://www.jfox.info/40-ge-java-ji-he-lei-mian-shi-ti-he-da-an 整理自上面链接: Java集合框架为Java编程语言的基础,也是Java面 ...
- Linux内核设计笔记11——定时器
定时器与时间管理笔记 内核中的时间 时钟中断:内核中的系统定时器以某种频率触发中断,该频率可以通过编程预定. 节拍率HZ:时钟中断的频率称为节拍率. 节拍:相邻两次中断的时间间隔称为节拍,1/节拍率. ...
- 阿里云服务器 操作实战 部署C语言开发环境(vim配置,gcc) 部署J2EE网站(jdk,tomcat)
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 博客总结 : 设置SecureCRT ...
- scrapy(1)——scrapy介绍
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.所谓网络爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这种说 ...
- lintcode-171-乱序字符串
171-乱序字符串 给出一个字符串数组S,找到其中所有的乱序字符串(Anagram).如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中. 注意事项 所有的字符串都只包 ...
- iOS- xib(nib) 的重用(在有些情况下有利于加快项目功能的实现)
0.前言 在项目开发中,我们经常会碰到,某些视图View 内部基本空间都一样,只是数据不同,这时,我们可以用xib来将这个视图封装起来多次重用, (例如,大小固定 控件固定的TableViewCell ...
- iOS开发Interface Builder技巧
1.使view的Size与view中的Content相适应:选中任意的一个view,然后Editor->Size to Fit Content,或者简单的按 ⌘=接着就会按照下面的规则对选中vi ...
- matlab的二维卷积操作(转)
MATLAB的conv2函数实现步骤(conv2(A,B)): 其中,矩阵A和B的尺寸分别为ma*na即mb*nb ① 对矩阵A补零,第一行之前和最后一行之后都补mb-1行,第一列之前和最后一列之后都 ...
- vector中数据进行去重和排序
, , , , , , ,}; std::vector<int> vec(a, a+sizeof(a)/sizeof(int) ); std::sort(vec.begin(), vec. ...