React学习之进阶非ES6(十六)
2017-03-20 10:49
489 查看
平时我们写
现在你可以不使用
虽然上面的代码中
1.
非
对于
2.初始化
而在非
而用
如果你觉得上面的代码不够新鲜,那么新鲜得来了
上面的代码注释中说了些话,主要是为了让大家警惕,上面的那个语法属于实验性质的,它最终有可能不会加入到
几点建议
如果你是用
如果你要用箭头函数的话,请在事件绑定中做
能用
4.
但是有时候允许你在
如下的代码即,
使用
下一篇将讲
React组件的时候一般就是直接用类组件
class Greeting extends React.Component { render() { return <h1>Hello, {this.props.name}</h1>; } }
现在你可以不使用
ES6的类语法,而用
React.createClass函数进行处理
var Greeting = React.createClass({ render: function() { return <h1>Hello, {this.props.name}</h1>; } });
虽然上面的代码中
render这个函数基本和
ES6语法的类组件没有多少区别,但是它们的区别个人认为还是比较大的。
1.PropTypes
属性检测和defaultProps
值区别
ES6语法
class Greeting extends React.Component { // ... } Greeting.propTypes = { name: React.PropTypes.string }; Greeting.defaultProps = { name: 'Mary' };
非
ES6语法
var Greeting = React.createClass({ propTypes: { name: React.PropTypes.string }, getDefaultProps: function() { return { name: 'Mary' }; }, // ... });
对于
propTypes大家还好理解,跟类组件基本一样,但是
defaultProps却需要使用一个函数进行返回,这一点大家需要注意。
2.初始化this.state
状态
ES6的语法非常简单,就是在
construtor构造函数中直接对
this.state赋值即可
class Counter extends React.Component { constructor(props) { super(props); this.state = {count: props.initialCount}; } // ... }
而在非
ES6中,我们要用函数
getInitialState函数进行初始化
var Counter = React.createClass({ getInitialState: function() { return {count: this.props.initialCount}; }, // ... });
3.自动绑定机制
在React组件描述为类组件时,它的定义和
ES6语法中类的定义语法是一模一样的,但是这有个非常尴尬的事情,就是内部的函数都不会绑定自我的实例,我们在前面也一直在
constructor构造函数中用
.bind(this)来绑定自身实例
class SayHello extends React.Component { constructor(props) { super(props); this.state = {message: 'Hello!'}; // 必须加,代码实现绑定 this.handleClick = this.handleClick.bind(this); } handleClick() { alert(this.state.message); } render() { return ( <button onClick={this.handleClick}> Say hello </button> ); } }
而用
React.createClass创建的类则非常有意思,它帮你自动绑定了,不需要你用
bind进行绑定。
var SayHello = React.createClass({ getInitialState: function() { return {message: 'Hello!'}; }, handleClick: function() { alert(this.state.message); }, render: function() { return ( <button onClick={this.handleClick}> Say hello </button> ); } });
如果你觉得上面的代码不够新鲜,那么新鲜得来了
class SayHello extends React.Component { constructor(props) { super(props); this.state = {message: 'Hello!'}; } //这个语法够新鲜吧,简直是逆天了,用箭头函数和赋值来定义类内的函数 //然而这个语法更像是个表达式赋值,而不是一个函数声明 //所以如果不是为了装逼,请不要用这个语法 handleClick = () => { alert(this.state.message); } render() { return ( <button onClick={this.handleClick}> Say hello </button> ); } }
上面的代码注释中说了些话,主要是为了让大家警惕,上面的那个语法属于实验性质的,它最终有可能不会加入到
ES语法中,所以最好不要用。
几点建议
如果你是用
ES6语法的类组件,请在
construcotr构造函数中使用
bind函数进行绑定
如果你要用箭头函数的话,请在事件绑定中做
onClick={(e) => this.handleClick(e)}
能用
React.createClass()就用它
4.Mixins
多继承模式
ES6没有推出多继承的语法,而React官方说很多代码库中都有使用
Mixins将多个对象合并为一个对象,然而如果没有必要,它并不推荐你这么做
但是有时候允许你在
React.createClass中使用
mixins处理(
createClass在方法上实现了
mixins多继承机制),比如说,我们可以将摧毁函数共用,用于最终组件摧毁时都会摧毁的资源,
var SetIntervalMixin = { componentWillMount: function() { this.intervals = []; }, setInterval: function() { this.intervals.push(setInterval.apply(null, arguments)); }, componentWillUnmount: function() { this.intervals.forEach(clearInterval); } }; var TickTock = React.createClass({ mixins: [SetIntervalMixin], getInitialState: function() { return {seconds: 0}; }, componentDidMount: function() { this.setInterval(this.tick, 1000); }, tick: function() { this.setState({seconds: this.state.seconds + 1}); }, render: function() { return ( <p> React has been running for {this.state.seconds} seconds. </p> ); } }); ReactDOM.render( <TickTock />, document.getElementById('example') );
如下的代码即,
createClass创建对象时,会将
SetIntervalMixin对象的方法和属性继承过来
mixins: [SetIntervalMixin]
使用
mixins一定要确保最终将所有组件都摧毁了。
下一篇将讲
React中不用
JSX的痛
相关文章推荐
- ReactNative学习十六-View属性及Style
- React学习之进阶JSX语法(十一)
- React_Native 再学习5--TypeScript学习2——进阶语法
- ruby -- 进阶学习(十六)ckeditor去除“浏览服务器”按钮
- React_Native 再学习4——导航进阶之DrawerNavigator
- React_Native 再学习3——导航进阶之TabNavigator
- React学习之进阶类型检查(十二)
- React学习之进阶调解器(十八)
- React学习之进阶非JSX的痛处(十七)
- React学习之进阶上下文
- React进阶学习之组件的解耦之道
- React学习资料+css进阶资料总结
- React学习之进阶性能优化(十五)
- React学习之进阶WEB组件(二十)
- React_Native 再学习2——导航进阶之StackNavigator
- Linux运维学习笔记之十六:LAMP与LNMP加速与缓存优化进阶实战
- React学习之进阶非控制型组件(十四)
- React学习之进阶终临高阶组件(二十一)
- 马哥学习笔记十六——MySQL进阶之事务和隔离级别
- React学习之进阶ref的必要性(十三)