【发布时间】:2021-03-06 19:03:25
【问题描述】:
我有 3 个 div。当我单击特定按钮时,每个人都会激活课程。他们中的每个 div 都有一个状态变量,只要它是真的我将 className='active' 添加到连接到它的 div 中:
当我点击按钮时,状态发生变化,但 div 没有激活类
async activeLang(e) {
let lang = e.target.getAttribute('lang');
for (const key in this.state.status) {
if (key === lang) {
await this.setState(state => {
state.status[key] = true
})
}else{
await this.setState(state => {
state.status[key] = false
})
}
}
console.log(this.state.status);
}
当我将功能更改为此它可以工作:
activeLang(e) {
let lang = e.target.getAttribute('lang');
this.setState({
status:{
en: false,
ar: false,
fr: false,
}
})
this.setState(state => {
state.status[lang] = true
})
console.log(this.state.status);
}
================================================ =
<ul>
<li lang="en" onClick={this.activeLang} className={this.state.status.en ? 'active' : '' }>EN</li>
<li lang="ar" onClick={this.activeLang} className={this.state.status.ar ? 'active' : ''}>AR</li>
<li lang="fr" onClick={this.activeLang} className={this.state.status.fr ? 'active' : ''}>FR</li>
</ul>
================================================ =
<div className={this.state.status.en ? 'to-input en active' : 'to-input en'}>
<input required type='text' onKeyUp={this.onInputChange} />
<label title='Category name' placeholder='Ex. Business Cards'></label>
</div>
<div className={this.state.status.ar ? 'to-input ar active' : 'to-input ar'}>
<input required type='text' onKeyUp={this.onInputChange} />
<label title='اسم الفئة' placeholder='مثال: كروت العمل'></label>
</div>
<div className={this.state.status.fr ? 'to-input fr active' : 'to-input fr'}>
<input required type='text' onKeyUp={this.onInputChange} />
<label title='Nom de catégorie' placeholder='Ex. Cartes de visite'></label>
</div>
【问题讨论】:
-
您不能在循环中使用 setState。 setState 不是 即时的,它会获取计划,并且 - 这是重要的部分 - 只有 last setState 在状态更新实际运行时“获胜”。所以永远不要在循环中使用 setState 。进行数据转换和所有其他工作,然后只使用新状态调用 setState once。这就是 setState 的意义所在:它将您的组件从之前的状态更新到新的状态。不要将其用于任何中介。
标签: javascript reactjs web