gpt4 book ai didi

javascript - 在 React 中的现有状态转换错误期间无法更新

转载 作者:数据小太阳 更新时间:2023-10-29 06:14:42 26 4
gpt4 key购买 nike

在我的渲染 return() 中,我有这些:

<button onClick={ this.selectTimeframe('Today') }
className={ this.setActiveIf('Today') } type="button">Today</button>

这是什么函数:

selectTimeframe(timeframe) {
// this.setState({ timeframe });
}

^ 我现在必须注释掉 setState 否则我会收到我在上面发布的错误并且应用程序中断。

我的构造函数中有这个:

this.selectTimeframe = this.selectTimeframe.bind(this);

我找到了这个 answer here ,但这没有意义,我应该如何传递变量?或者他是说每个独特的按钮都需要独特的功能?至于避免在渲染内部调用它?

完整代码

import React from 'react';

export class TimeframeFilter extends React.Component {

constructor(props) {
super(props);

this.state = {
timeframe: 'Today'
};

this.selectTimeframe = this.selectTimeframe.bind(this);
this.setActiveIf = this.setActiveIf.bind(this);
}

componentDidMount() {
console.log('%c TimeframeFilter componentDidMount', 'background: #393939; color: #bada55', this.state);
}

selectTimeframe(timeframe) {
// this.setState({ timeframe });
}

setActiveIf(timeframe) {
return this.state.timeframe === timeframe ? 'btn btn-default active' : 'btn btn-default';
}

render() {
return (
<div className="fl">
<span className="label label-default mr10">Timeframe</span>
<div className="btn-group btn-group-sm mr20" role="group">
<button onClick={ this.selectTimeframe('Today') }
className={ this.setActiveIf('Today') } type="button">Today</button>
<button onClick={ this.selectTimeframe('Week') }
className={ this.setActiveIf('Week') } type="button">Week</button>
<button onClick={ this.selectTimeframe('Month') }
className={ this.setActiveIf('Month') } type="button">Month</button>
<button onClick={ this.selectTimeframe('Year') }
className={ this.setActiveIf('Year') } type="button">Year</button>
<button onClick={ this.selectTimeframe('All') }
className={ this.setActiveIf('All') } type="button">All</button>
</div>
</div>
);
}
}

export default TimeframeFilter;

最佳答案

您应该使用 箭头函数或绑定(bind)方法 将值传递给 onClick 函数,否则它每次都会执行以将值返回给 onClick发生重新渲染,如果您在其中使用 setState,它将调用 rerender 和再次调用的函数,从而重复该过程。

照做

<button onClick={ ()=> this.selectTimeframe('Today') }
className={ this.setActiveIf('Today') } type="button">Today</button>

<button onClick={ this.selectTimeframe.bind(this, 'Today') }
className={ this.setActiveIf('Today') } type="button">Today</button>

希望我能够向您解释清楚。 :)

编辑:虽然上述方法解决了问题,但由于性能原因并不是最佳方法。我们应该避免在 render 中绑定(bind)方法,因为在重新渲染期间它会创建新方法而不是使用旧方法,这会影响性能。

How to avoid binding inside the render method 上查看此答案

关于javascript - 在 React 中的现有状态转换错误期间无法更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44009524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com