不要直接改变国家。使用setState()react / no-direct-mutation-state

时间:2017-06-16 14:05:58

标签: javascript reactjs

我有这段代码:

constructor(props) {
    super(props)
    this.state = {
        loginButton: '',
        benchmarkList: ''
    }
    if (props.username == null) {
        this.state.loginButton = <GoogleButton></GoogleButton>
    } else {

    }
}

它给了我一个ESLint警告:

  

不要直接改变状态。使用setState()   反应/无直接突变状态。

现在我应该做什么,因为我无法在setState内直接使用constructor,因为它会创建error并且像这样更新会给我带来错误。

4 个答案:

答案 0 :(得分:5)

constructor(props) {
    super(props)
    this.state = {
      loginButton: props.username == null? <GoogleButton></GoogleButton>: '',
      benchmarkList: ''
    }
  }

或者您可以在componentWillMount()

中使用setState
componentWillMount(){
   let loginButton = props.username == null? <GoogleButton></GoogleButton>: '';
   this.setState({loginButton: loginButton});
}

答案 1 :(得分:5)

首先,我们不应该将ui组件存储在状态变量中,状态应该只包含数据。所有ui部分都应该在render方法内。

如果您想根据任何数据render某个组件,请使用conditional rendering。检查this.state.loginButton的值,如果是null,则再渲染该按钮。

像这样:

constructor(props) {
    super(props)
    this.state = {
        loginButton: props.username,
        benchmarkList: ''
    }
}

render(){
    return(
        <div>
            {!this.state.loginButton ? <GoogleButton></GoogleButton> : null}
        </div>
    )
}

理想情况下,我们不应将props值存储在state中,因此请直接使用this.props.username,我这样做是因为不了解完整代码。

答案 2 :(得分:0)

  

如何在ReactJS中更新constructor内的状态?

创建数据结构,根据需要进行修改,并在完成所有操作后最终分配给状态:

constructor(props) {
    super(props)
    let state = {
        loginButton: '',
        benchmarkList: ''
    }
    if (props.username == null) {
        state.loginButton = true
    } else {
        state.loginButton = false
    }
    this.state = state
}

答案 3 :(得分:0)

只需添加 setState

import numpy as np
import gym
from baselines.common.vec_env.subproc_vec_env import SubprocVecEnv

env_name = 'your-env-name'
nproc = 8
T=10

def make_env(env_id, seed):
    def _f():
        env = gym.make(env_id)
        env.seed(seed)
        return env
    return _f

envs= [make_env(env_name, seed) for seed in range(nproc)]

envs = SubprocVecEnv(envs)

Xt = envs.reset()

for t in range(T):
    ut = np.stack([envs.action_space.sample() for _ in range(nproc)])
    xtpl, rt, done, info = envs.step(ut)