(翻译)React.createClass对比extends React.Component
这两种方式都是实现的同一个功能.React一开始用React.createClass方法来创建一个组件类,然后又在以后的更新中提供了一个小小的语法糖来允许我们使用ES6的心特性---我们可以用extends React.Component来代替createClass方法. 两者之间有几处差别,有一些还是挺有意思的,值得一探究竟.你可以看完本文的对比之后再做出适合自己的选择 (译者注:还是用es6的新特性吧,毕竟未来) 语法差别
import React from 'react'; const Contacts = React.createClass({ render() { return ( <div></div> ); } }); export default Contacts;
import React from 'react'; class Contacts extends React.Component { constructor(props) { super(props); } render() { return ( <div></div> ); } } export default Contacts; 在这里面,我们用到了constructor(构造器),并且调用了super()方法把props传递给了React.Component 通过这种改变,同样是定义一个Contacts类,我们减少了React样本文件的引用,而更多的是用了JS代码.这是一个重要的改变. propTypes and getDefaultProps(prop指属性,state状态)在声明默认props和state的时候,这两者之间有很大的不同
import React from 'react'; const Contacts = React.createClass({ propTypes: { },getDefaultProps() { return { }; },render() { return ( <div></div> ); } }); export default Contacts;
import React from 'react'; class Contacts extends React.Component { constructor(props) { super(props); } render() { return ( <div></div> ); } } Contacts.propTypes = { }; Contacts.defaultProps = { }; export default Contacts; state(状态)差别state的改变挺有意思,现在我们用构造器来实现初始状态的改变 1. getInitialState只是返回了一个初始状态的对象 2. 我们只需要在constructor(构造器)里面简洁的声明一下就可以了. import React from 'react'; class Contacts extends React.Component { constructor(props) { super(props); this.state = { }; } render() { return ( <div></div> ); } } export default Contacts; this 的差别createClass 会自动为我们把"this"绑定给正确的值,但是使用ES6中的"类"声明的时候,就不一样了
import React from 'react'; const Contacts = React.createClass({ handleClick() { console.log(this); // React Component instance },render() { return ( <div onClick={this.handleClick}></div> ); } }); export default Contacts;
import React from 'react'; class Contacts extends React.Component { constructor(props) { super(props); } handleClick() { console.log(this); // null } render() { return ( <div onClick={this.handleClick}></div> ); } } export default Contacts; 我们可以用其他的方法实现把this绑定到正确的上下文中,比如这样,在 import React from 'react'; class Contacts extends React.Component { constructor(props) { super(props); } handleClick() { console.log(this); // React Component instance } render() { return ( <div onClick={this.handleClick.bind(this)}></div> ); } } export default Contacts; 我们也可以在构造器中改变this.handleClick的上下文 import React from 'react'; class Contacts extends React.Component { constructor(props) { super(props); this.handleClick = this.handleClick.bind(this); } handleClick() { console.log(this); // React Component instance } render() { return ( <div onClick={this.handleClick}></div> ); } } export default Contacts; mixins在ES6中,React不用mixins了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |