createClass
語法是創建React組件的原始方法,但似乎它正逐步被淘汰,轉而支持class
語法和無狀態功能組件。
如果您要從createClass
a class
升級組件,有幾個關鍵區別需要注意。
初始狀態&默認道具
隨着createClass
你可以聲明,將返回初始狀態和默認屬性給定組件的方法。
React.createClass({
getInitialState() {
return { foo: 'bar' };
},
getDefaultProps() {
return { baz: 'qux' };
},
componentDidMount() {
console.log(
this.state, // => { foo: 'bar' }
this.props // => { baz: 'qux' }
);
}
});
對於類語法都進行了更改。相反,您可以在構造函數中分配初始狀態。
class extends React.Component {
constructor() {
super();
this.state = { foo: 'bar' };
}
}
而你聲明默認道具爲靜態屬性。
class Qux extends React.Component {}
Qux.defaultProps = { baz: 'qux' };
混入
的createClass
語法支持一個名爲混入的概念,它允許您提供哪些是擴充現有的生命週期方法的其他代碼。
const logOnMount = {
componentWillMount() {
console.log('Mounted!', new Date());
}
};
React.createClass({
mixins: [logOnMount]
});
使用logOnMount
混入每當它被安裝將記錄的時間戳到控制檯的任何組分。
不支持混合使用class
語法,但可以使用higher-order components來實現相同的目的。
function logOnMount(Component) {
return function(props) {
console.log('Mounted!', new Date());
return (
<Component {...props} />
);
}
}
自動綁定
的createClass
語法提供了一些方便的自動綁定,讓你可以安全地通過組件的方法作爲回調,而不必擔心與錯誤的上下文this
結束了。
React.createClass({
bar() {
return true;
},
foo() {
this.bar();
},
render() {
return <button onClick={this.foo}>Click</button>;
}
});
的onClick
處理程序會嘗試與this
設置爲觸發的事件調用this.foo
,但由於this.foo
被autobound有正確的情況下,有沒有錯誤。
下面是同樣的例子,但有類。
class extends React.Component {
bar() {
return true;
}
foo() {
this.bar(); // Error - undefined is not a function
}
render() {
return <button onClick={this.foo}>Click</button>;
}
}
foo
的方法與this
組的事件,該事件不具有bar
屬性結束。
爲了解決這個問題,您需要顯式綁定構造函數中的方法,或者從箭頭函數內部調用方法。
constructor() {
this.foo = this.foo.bind(this);
}
// or
render() {
return <button onClick={e => this.foo()}>Click</button>;
}
「而不僅僅是」---這些是不可互換的。 – zerkms