我正在準備升級到React 16的React組件,其中關鍵是要更新與React.createClass
一起使用class
關鍵字的組件。從createClass轉換爲class關鍵字時,如何正確綁定React組件類的事件處理程序?
當我遇到Can only update a mounted or mounting component
錯誤時,遇到引發類方法的事件處理程序時,我遇到了麻煩。使用React.createClass
一個簡單的例子...
原來的分量:
const Foo = React.createClass({
getInitialState() {
return { bar: false };
},
onClick() {
this.setState({ bar: !this.state.bar });
},
render() {
return (
<div>
<p>{this.state.bar ? 'YAY' : 'BOO'}</p>
<button onClick={this.onClick}>CLICK IT</button>
</div>
);
},
});
按預期工作。那麼,這是否,如果我願意忽略一個新的函數對象將與每次調用創建render
:
class Foo extends React.Component {
constructor(props) {
super(props);
this.state = { bar: false };
}
render() {
return (
<div>
<p>{this.state.bar ? 'YAY' : 'BOO'}</p>
<button onClick={() => { this.setState({ bar: !this.state.bar }); }}>CLICK IT</button>
</div>
);
}
}
但是,我不能得到的「在構造函數中結合」的工作方式:
class Foo extends React.Component {
constructor(props) {
super(props);
this.state = { bar: false };
this.onClick = this.onClick.bind(this);
}
onClick() {
this.setState({ bar: !this.state.bar });
}
render() {
return (
<div>
<p>{this.state.bar ? 'YAY' : 'BOO'}</p>
<button onClick={this.onClick}>CLICK IT</button>
</div>
);
}
}
我也不能獲得屬性初始化語法的工作方式:
class Foo extends React.Component {
constructor(props) {
super(props);
this.state = { bar: false };
}
onClick =() => {
this.setState({ bar: !this.state.bar });
}
render() {
return (
<div>
<p>{this.state.bar ? 'YAY' : 'BOO'}</p>
<button onClick={this.onClick}>CLICK IT</button>
</div>
);
}
}
在這兩種這些情況下,每當我按一下按鈕前面提到的錯誤消息顯示了我瀏覽器控制檯。
我希望有人自己已經遇到過這個問題,並且就如何處理它提出了建議。我想,這完全忽略了一些微不足道的東西。 :)
在此先感謝!
你可以嘗試'的onClick(){ this.setState((prevState)=>({吧!prevState.bar})); }' –
這是一個單獨的問題;任何綁定方法都能正常工作 –
要使類屬性有效,您需要對其進行轉換。它們現在不包含在Babel預設中,因爲它們仍然是一個建議。你需要啓用[stage-2](https://babeljs.io/docs/plugins/preset-stage-2/)。 –