React.createClass和extends Component的区别
React.createClass和extends Component的区别主要在于:
语法区别React.createClass import React from 'react'; const Contacts = React.createClass({ render() { return ( <div></div> ); } }); export default Contacts; React.Component import React from 'react'; class Contacts extends React.Component { constructor(props) { super(props); } render() { return ( <div></div> ); } } export default Contacts; 后一种方法使用ES6的语法,用 propType 和 getDefaultPropsReact.createClass:通过 import React from 'react'; const Contacts = React.createClass({ propTypes: { name: React.PropTypes.string },getDefaultProps() { return { }; },render() { return ( <div></div> ); } }); export default Contacts; React.Component:通过设置两个属性 import React form 'react'; class TodoItem extends React.Component{ static propTypes = { // as static property name: React.PropTypes.string }; static defaultProps = { // as static property name: '' }; constructor(props){ super(props) } render(){ return <div></div> } } 状态的区别React.createClass:通过 import React from 'react'; let TodoItem = React.createClass({ // return an object getInitialState(){ return { isEditing: false } } render(){ return <div></div> } }) React.Component:通过 import React from 'react'; class TodoItem extends React.Component{ constructor(props){ super(props); this.state = { // define this.state in constructor isEditing: false } } render(){ return <div></div> } } this区别React.createClass:会正确绑定 import React from 'react'; const Contacts = React.createClass({ handleClick() { console.log(this); // React Component instance },render() { return ( <div onClick={this.handleClick}></div>//会切换到正确的this上下文 ); } }); export default Contacts; React.Component:由于使用了 ES6,这里会有些微不同,属性并不会自动绑定到 React 类的实例上。 import React from 'react'; class TodoItem extends React.Component{ constructor(props){ super(props); } handleClick(){ console.log(this); // null } handleFocus(){ // manually bind this console.log(this); // React Component Instance } handleBlur: ()=>{ // use arrow function console.log(this); // React Component Instance } render(){ return <input onClick={this.handleClick} onFocus={this.handleFocus.bind(this)} onBlur={this.handleBlur}/> } } 我们还可以在 constructor 中来改变 this.handleClick 执行的上下文,这应该是相对上面一种来说更好的办法,万一我们需要改变语法结构,这种方式完全不需要去改动 JSX 的部分: 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.createClass:使用 React.createClass 的话,我们可以在创建组件时添加一个叫做 import React from 'react'; let MyMixin = { doSomething(){} } let TodoItem = React.createClass({ mixins: [MyMixin],// add mixin render(){ return <div></div> } }) 参考文章1 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |