这段代码在 React 中重置状态是不好的做法吗?

Is this code bad practice for resetting state in React?

我有一个应用于 4 个不同对象的投票状态,但我的问题是重置方法是否正确,或者我是否应该折射我的 initialState 对象,所以我不需要在重置方法中重复自己。每个对象的增量器和重置按钮在调用时起作用。

class 函数扩展 React.Component {

static initialState = {
    waves : [
        {id: 'Pipeline', votes: 0},
        {id: 'Backdoor', votes: 0},
        {id: 'Froggies', votes: 0},
        {id: 'Waimea', votes: 0}
    ]
}

constructor(props){
    super(props);
    this.state = Functions.initialState;  
}


reset(e) {
    if (e) e.preventDefault();
    
       this.setState({
        waves : [
            {id: 'Pipeline', votes: 0},
            {id: 'Backdoor', votes: 0},
            {id: 'Froggies', votes: 0},
            {id: 'Waimea', votes: 0}
        ]
    });
    
    

}

add (i) {
        let oldWaves = [...this.state.waves]
        oldWaves[i].votes++
        this.setState({waves: oldWaves})
    }   

render() {
return (
    <div className='waves'>
        <h1>Vote for your favorite wave!</h1>
        {this.state.waves.map((wave, i) => 
            <div key={i} className='wave'>
                <div className='voteCount'>
                    {wave.votes}
                </div>
                <div className='waveDetails'>
                    {wave.id}
                    <button onClick={this.add.bind(this, i)}>X</button> 
                </div>
                
            </div>
        )}
        <button onClick={this.reset.bind(this)} className='resetButton'>Reset  </button> 
    </div>
)
}

}

无需再次重复相同的状态对象。正如您所想,改为引用先前的对象会更有意义。

reset(e) {
  if (e) e.preventDefault();
  this.setState(Functions.initialState);
}

但是您的 add 方法也有一个错误 - 您正在改变现有的状态对象,这绝对不应该在 React 中完成。修复它:

add (i) {
  const oldWaves = [...this.state.waves];
  const wave = oldWaves[i];
  oldWaves[i] = { ...wave, votes: wave.votes + 1 };
  this.setState({waves: oldWaves})
}

add (i) {
  const { waves } = this.state;
  const newWaves = [
    ...waves.slice(0, i),
    { ...waves[i], votes: waves[i].votes + 1 },
    ...waves.slice(i + 1)
  ];
  this.setState({ waves: newWaves });
}

您确实可以使用 initialState 来避免重复代码。

reset(e) {
    if (e) {
        e.preventDefault();
    }

    this.setState(this.initialState);
}