在 render 方法的 eventHandler 中调用 setState
Calling setState in an eventHandler in the render method
在使用 React 时,我了解到在组件的 render 方法中调用 setState 是一种不好的做法;而是保持这种方法的纯净。但是,如果我需要根据链接到组件的事件更新状态,我该怎么做?
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {isToggleOn: true};
// This binding is necessary to make `this` work in the callback
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn
}));
}
render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
}
以上代码来自React官方教程。如我们所见,事件处理程序绑定到 onClick 属性,并且在该事件处理程序内部,组件的状态已更改,因此我们可能会在从渲染方法调用时更新状态。因此,我有点迷茫为什么可以这样做但不在渲染方法中显式调用 setState?它与 React 如何包装普通 html-事件有关吗?
有一个函数没有调用,只通过了:
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
不好的做法是在 render 方法中显式调用 setState
,因为 render 方法应该能够 运行 多次而没有任何副作用(不影响渲染之外的任何东西)本身)
在上面的代码块中,setState
被绑定到一个点击处理程序,这意味着它只在按钮被点击时被调用,而不是在调用 render 方法时被调用,所以这是完全没问题的.
回顾一下:
在 render 方法中使用更新状态的事件处理程序很好,只要它们仅在触发该事件时调用。
不好有setState
或者在render
函数中直接调用setState
的函数
示例
doSomthing = () => {
this.setState({ foo: 'bar' });
}
render() {
return (
<button onClick={this.doSomething}>Click Me</button>
);
}
// this code is GOOD
上面的例子是OK
doSomething = () => {
this.setState({ foo: 'bar' });
}
render() {
this.doSomething();
return (
<button>Click Me</button>
);
}
// this code is BAD
上面的例子是BAD
render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
{this.setState(() => ({}))}
);
}
当您尝试执行上述操作时。它会导致渲染问题。
想想setState()
的目的是什么。显然要改变组件的状态。现在想想当你的状态改变时会发生什么。是的,您的组件再次呈现。现在想想如果一个组件正在渲染并且它再次找到 setState()
那么它会导致渲染出现故障。
Now over to your issue of event handler a good practice of using
setState()
这是一个简单的概念,我们在事件调用中使用引用,这意味着当组件呈现时它不会立即触发它,而是等待有人调用。很明显,当有人要调用调用时,只会更改状态,不会对 render()
造成任何问题,并且可以正常工作
在使用 React 时,我了解到在组件的 render 方法中调用 setState 是一种不好的做法;而是保持这种方法的纯净。但是,如果我需要根据链接到组件的事件更新状态,我该怎么做?
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {isToggleOn: true};
// This binding is necessary to make `this` work in the callback
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn
}));
}
render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
}
以上代码来自React官方教程。如我们所见,事件处理程序绑定到 onClick 属性,并且在该事件处理程序内部,组件的状态已更改,因此我们可能会在从渲染方法调用时更新状态。因此,我有点迷茫为什么可以这样做但不在渲染方法中显式调用 setState?它与 React 如何包装普通 html-事件有关吗?
有一个函数没有调用,只通过了:
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
不好的做法是在 render 方法中显式调用 setState
,因为 render 方法应该能够 运行 多次而没有任何副作用(不影响渲染之外的任何东西)本身)
在上面的代码块中,setState
被绑定到一个点击处理程序,这意味着它只在按钮被点击时被调用,而不是在调用 render 方法时被调用,所以这是完全没问题的.
回顾一下:
在 render 方法中使用更新状态的事件处理程序很好,只要它们仅在触发该事件时调用。
不好有setState
或者在render
函数中直接调用setState
的函数
示例
doSomthing = () => {
this.setState({ foo: 'bar' });
}
render() {
return (
<button onClick={this.doSomething}>Click Me</button>
);
}
// this code is GOOD
上面的例子是OK
doSomething = () => {
this.setState({ foo: 'bar' });
}
render() {
this.doSomething();
return (
<button>Click Me</button>
);
}
// this code is BAD
上面的例子是BAD
render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
{this.setState(() => ({}))}
);
}
当您尝试执行上述操作时。它会导致渲染问题。
想想setState()
的目的是什么。显然要改变组件的状态。现在想想当你的状态改变时会发生什么。是的,您的组件再次呈现。现在想想如果一个组件正在渲染并且它再次找到 setState()
那么它会导致渲染出现故障。
Now over to your issue of event handler a good practice of using
setState()
这是一个简单的概念,我们在事件调用中使用引用,这意味着当组件呈现时它不会立即触发它,而是等待有人调用。很明显,当有人要调用调用时,只会更改状态,不会对 render()
造成任何问题,并且可以正常工作