reactjsreact-hooks

Reset to Initial State with React Hooks


I'm currently working on a signup form and the following is a snippet of my code:

const Signup = () => {
    const [username, setUsername] = useState('')
    const [email, setEmail] = useState('')
    const [password, setPassword] = useState('')
    const [passwordConfirmation, setPasswordConfirmation] = useState('')

    const clearState = () => {
        setUsername('')
        setEmail('')
        setPassword('')
        setPasswordConfirmation('')
    }

    const handleSubmit = signupUser => e => {
        e.preventDefault()
        signupUser().then(data => {
            console.log(data)
            clearState() // <-----------
        })
    }

    return <JSX />
}

export default Signup

Each piece of state is used for a controlled input for the form.

Essentially what I want to do is after the user has successfully signed up, I want the state to go back to the initial state with the fields cleared.

It's quite imperative to manually set each piece of state back to empty strings inclearState I was wondering if there is a method or function that comes with React that resets the state back to its initial values?


Solution

  • There is no built-in way to set the state to its initial value, sadly.

    Your code looks good, but if you want to decrease the functions needed you can put your entire form state in a single state variable object and reset to the initial object.

    Example

    const { useState } = React;
    
    function signupUser() {
      return new Promise(resolve => {
        setTimeout(resolve, 1000);
      });
    }
    
    const initialState = {
      username: "",
      email: "",
      password: "",
      passwordConfirmation: ""
    };
    
    const Signup = () => {
      const [
        { username, email, password, passwordConfirmation },
        setState
      ] = useState(initialState);
    
      const clearState = () => {
        setState({ ...initialState });
      };
    
      const onChange = e => {
        const { name, value } = e.target;
        setState(prevState => ({ ...prevState, [name]: value }));
      };
    
      const handleSubmit = e => {
        e.preventDefault();
        signupUser().then(clearState);
      };
    
      return (
        <form onSubmit={handleSubmit}>
          <div>
            <label>
              Username:
              <input value={username} name="username" onChange={onChange} />
            </label>
          </div>
          <div>
            <label>
              Email:
              <input value={email} name="email" onChange={onChange} />
            </label>
          </div>
          <div>
            <label>
              Password:
              <input
                value={password}
                name="password"
                type="password"
                onChange={onChange}
              />
            </label>
          </div>
          <div>
            <label>
              Confirm Password:
              <input
                value={passwordConfirmation}
                name="passwordConfirmation"
                type="password"
                onChange={onChange}
              />
            </label>
          </div>
          <button>Submit</button>
        </form>
      );
    };
    
    ReactDOM.render(<Signup />, document.getElementById("root"));
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    
    <div id="root"></div>