切换反应状态

时间:2019-01-22 06:16:55

标签: javascript reactjs

将此视为我的反应状态

state = {
a: true,
b: false,
c: false,
d: false,
e: false 
}

现在,我想在单击按钮时切换状态,如果事件等于我状态下的键(a,b,c,d,e),则我希望它为true并保持为false。目前我正在做的是..

someEvent = (event) => {
if (event === "a") this.setState({a: true, b: false, c: false, d: false, e: false})
if (event === "b")this.setState({a: false, b: true, c: false, d: false, e: false})
....
....
....
}

我希望给定的事件等于键,使其在我的状态下具有真实值,而其他所有条件都不是,而不是将每个状态都设置为false

我该怎么办?

7 个答案:

答案 0 :(得分:4)

您可以通过以下代码进行操作:

this.setState({
  a: event === "a",
  b: event === "b",
  c: event === "c",
  d: event === "d",
  e: event === "e"
});

答案 1 :(得分:4)

这里有一线。

使用Object.keys()从对象获取键数组,然后遍历该数组以检查事件是否等于状态。如果找到,则状态为真,否则为假;

let event = 'c'
let state = { a: true, b: false, c: false, d: false, e: false }
Object.keys(state).forEach(s => state[s] = s === event)
console.log(state)

答案 2 :(得分:3)

您可以这样做

Object.keys( this.state )
        .map( Key => {
            if(event === this.state[Key]){
              this.setState({this.state[Key] : true});
            }else{
              this.setState({this.state[Key] : false});
            }
     } );
 })

答案 3 :(得分:2)

另一种方法

let updateObject = [...this.state];
Object.keys( this.state )
        .map( Key => {
            if(event === this.state[Key]){
              updateObject[key] = true;
            }else{
              updateObject[key] = false;
            }
     } );
 });

this.setState({...this.state,updateObject});

答案 4 :(得分:1)

您可以将所有状态初始化为false的对象初始化

const obj = {};
for (let char = 'a'; char <= 'e'; char++) obj[char] = false;

或基于this.state对象中的键

for (let key in this.state) obj[key] = false;

接下来将条件成立的状态设置为true

obj[event] = true;

现在设置状态

this.setState(obj);

PS:由于我还没有添加验证,因此您应该在这里处理可能会破坏代码的错误和事件。

PS(2):这样可以节省时间,而不必自己编写每个if / else或switch语句。

答案 5 :(得分:1)

好吧,你可以那样做。

someEvent = (event) => {
    this.setState({ [event]: true })
}

因此,如果event ===“ a”,则它将仅setState for a 对于b,c,d和e同样,这一条件将为您设置所有状态。

答案 6 :(得分:1)

听起来您可能在对状态进行低效建模-如果始终存在一个真实值,而其他所有内容都是错误的,则只需执行以下操作即可:

state = {
  currentlyTrue: a
}
someEvent = (event) => {
  this.setState({currentlyTrue: event})
}

如果您设置了当前状态模型,这应该可以工作。这是一个fiddle

someEvent = (event) => {
  this.setState((previousState) => {
    Object.keys(previousState).forEach((v) => { previousState[v] = false })
    previousState[event] = true
    return previousState;
  })
}