Clearing state es6 React

前端 未结 13 799
独厮守ぢ
独厮守ぢ 2020-12-07 13:04

I am trying to clear a components state but can\'t find a reference for the es6 syntax. I was using:

this.replaceState(this.getInitialState());

相关标签:
13条回答
  • 2020-12-07 13:46

    In most cases you dont need a deep copy, rarely initial state is object of objects, so using spread operator which babel transpiles to the object.assign should be fine.

    So, inside constructor you would have:

        class MyComponent extends Component {
            constructor(props) {
                super(props)
                this.state = {
                    key: value,
                    key2: value
                }
                this.initialState = { ...this.state } 
            }
        }
    

    From there you can use

    this.setState(this.initialState);
    

    to reset. But if for some reason your initial state is more complex object, use some library.

    0 讨论(0)
  • 2020-12-07 13:46

    I will add to the above answer that the reset function should also assign state like so:

    reset() {
      this.state = initialState;
      this.setState(initialState);
    }
    

    The reason being that if your state picks up a property that wasn't in the initial state, that key/value won't be cleared out, as setState just updates existing keys. Assignment is not enough to get the component to re-render, so include the setState call as well -- you could even get away with this.setState({}) after the assignment.

    0 讨论(0)
  • 2020-12-07 13:46

    In some circumstances, it's sufficient to just set all values of state to null.

    If you're state is updated in such a way, that you don't know what might be in there, you might want to use

    this.setState(Object.assign(...Object.keys(this.state).map(k => ({[k]: null}))))
    

    Which will change the state as follows

    {foo: 1, bar: 2, spam: "whatever"} > {foo: null, bar: null, spam: null}
    

    Not a solution in all cases, but works well for me.

    0 讨论(0)
  • 2020-12-07 13:51
    class MyComponent extends Component {
     constructor(props){
      super(props)
       this.state = {
         inputVal: props.inputValue
      }
       // preserve the initial state in a new object
       this.baseState = this.state 
    }
      resetForm = () => {
        this.setState(this.baseState)
      }
    
    }
    
    0 讨论(0)
  • 2020-12-07 13:52
    const initialState = {
        a: '',
        b: '',
        c: ''
    };
    
    class ExampleComponent extends Component {
        state = { ...initialState } // use spread operator to avoid mutation
        handleReset = this.handleReset.bind(this);
    
        handleReset() {
             this.setState(initialState);
        }
     }
    

    Remember that in order to be able to reset the state it is important not to mutate initialState.

    state = {...initialState} // GOOD 
    // => state points to a new obj in memory which has the values of initialState
    
    state = initialState // BAD 
    // => they point to the same obj in memory
    

    The most convenient way would be to use ES6 Spread Operator. But you could also use Object.assign instead. They would both achieve the same.

    state = Object.assign({}, initialState); // GOOD
    state = {...initialState}; // GOOD
    
    0 讨论(0)
  • 2020-12-07 13:54

    Problem

    The accepted answer:

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

    unfortunately is not correct.

    initialState is passed as a reference to this.state, so whenever you change state you also change initialState (const doesn't really matter here). The result is that you can never go back to initialState.

    Solution

    You have to deep copy initialState to state, then it will work. Either write a deep copy function yourself or use some existing module like this.

    0 讨论(0)
提交回复
热议问题