清除状态 es6 React

IT技术 javascript reactjs
2021-04-14 16:11:14

我正在尝试清除组件,state但找不到 es6 语法的参考。我正在使用:

this.replaceState(this.getInitialState());

但是这不适用于 es6 类语法。

我将如何达到相同的结果?

6个回答

据我所知,React 组件不会保留初始状态的副本,因此您只需要自己完成即可。

const initialState = {
    /* etc */
};

class MyComponent extends Component {
    constructor(props) {
        super(props)
        this.state = initialState;
    }
    reset() {
        this.setState(initialState);
    }
    /* etc */
}

请注意,该行this.state = initialState;要求您永远不要改变您的状态,否则您会污染initialState并无法重置。如果无法避免突变,则需要initialState在构造函数中创建一个副本(或initialState根据getInitialState().)

最后,我建议您使用setState()而不是replaceState().

这不能正常工作,因为如果您更改state它,它也会更改,initialState因为它是通过引用分配的。因此,当您调用 reset 时,它实际上不会重置为initialState. 没有什么变化,你必须深复制initialStatestate
2021-05-24 16:11:14
这是我使用的方法。我确实想评论replaceState在这种情况下完全没问题,因为它确保整个状态对象返回到一组已知的值。
2021-06-01 16:11:14
实际上,replaceState()当使用 ES6 类时它甚至不可用。自从我发布这个答案以来,我才意识到这一点。
2021-06-01 16:11:14
请注意,setState合并状态。如果组件向状态添加了不在 中的字段,则initialState这些字段不会被清除。
2021-06-03 16:11:14
如果您要向状态添加未在初始状态中定义的字段,那么您就做错了。
2021-06-20 16:11:14

问题

接受的答案

const initialState = {
    /* etc */
};

class MyComponent extends Component {
    constructor(props) {
        super(props)
        this.state = initialState;
    }
    reset() {
        this.setState(initialState);
    }
    /* etc */
}

不幸的是不正确

initialState作为对 的引用传递this.state,因此每当您更改时,state您也会更改initialStateconst在这里并不重要)。结果是你再也回不去了initialState

解决方案

你必须深复制 initialStatestate,然后它会起作用。要么自己写一个深拷贝函数,要么像这样使用一些现有的module

除非您自己改变状态(也就是代码异味),否则使用相同的initialState对象引用完全没问题。
2021-05-25 16:11:14
我有个疑问?为什么我们不能在构造函数中初始化一个空状态,然后在componentDidMount 中更新我们的initialState?使用生命周期方法会导致任何问题吗?如果这有效,那么我们稍后可以轻松更新 initialState。
2021-05-31 16:11:14
如果这个答案是正确的,那么当我将状态设置为初始状态然后再次尝试重置它时,我会遇到问题。但这根本没有发生。对这个答案投票的用户并不真正了解发生了什么。我现在非常沮丧,以至于很多人都被这种可疑的理解所欺骗,尤其是因为它很容易测试。
2021-06-04 16:11:14
在幕后,React 正在做一个Object.assign({}, nextState, partialState);. 所以,没必要对initialState 做深拷贝,因为this.state 永远是setState 之后的新对象。好吧,Object.assign 只克隆一个级别......但是所有使用 setState 方法保存的状态都应该没有改变状态,传递一个带有更改的新副本。
2021-06-06 16:11:14
你说的对。这也是 Immutable.js(和其他不可变库)存在的原因。
2021-06-08 16:11:14

这是作为函数实现的解决方案:

Class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = this.getInitialState();
  }

  getInitialState = () => ({
    /* state props */
  })

  resetState = () => {
     this.setState(this.getInitialState());
  }
}
使用此选项,我不需要进行深拷贝。
2021-05-31 16:11:14

this.state直接涉及设置的解决方案在 React 16 中对我不起作用,所以这是我为重置每个键所做的:

  const initialState = { example: 'example' }
  ...
  constructor() {
      super()
      this.state = initialState
  }
  ...
  reset() {
    const keys = Object.keys(this.state)
    const stateReset = keys.reduce((acc, v) => ({ ...acc, [v]: undefined }), {})
    this.setState({ ...stateReset, ...initialState })
  }
类选择状态的变体 const keys = Object.keys(this.state); const stateReset = keys.reduce((acc, v) => ({ ...acc, [v]: false }), {}); this.setState(stateReset);
2021-05-25 16:11:14
与上面投票较高的答案不同,该解决方案实际上清除了在初始状态中不再声明的任何状态元素。荣誉!
2021-05-31 16:11:14
是的,这是一个很好的答案,如果你不这样做,初始化后设置的其他状态仍然存在。
2021-06-20 16:11:14

首先,在使用componentWillMount()组件生命周期中函数时,您需要存储初始状态

componentWillMount() {
    this.initialState = this.state
}

这会存储您的初始状态,并可用于在您需要时通过调用重置状态

this.setState(this.initialState)