useState hook, setState function. Accessing previous state value

后端 未结 2 1384
感情败类
感情败类 2021-01-11 12:29

Are these two equivalent? If not which is best and why?

const [count, setCount] = useState(initialCount);
相关标签:
2条回答
  • 2021-01-11 12:45

    If the next state value depends on the previous value, as in this example of an increment button, it's better to use the functional version of setState (setCount(prevCount => prevCount + 1)).

    You can run into errors if you're passing the setter function into a callback function, like an onChange or HTTP Request response handler.

    As an explicit example, in the below page, if you click "Delayed Counter (basic)" and then click "Immediate Counter", the count will only increment by 1. However, if you click "Delayed Counter (functional)", followed by "Immediate Counter", the count will eventually increment by 2.

    import React, { useState } from "react";
    import ReactDOM from "react-dom";
    
    function Counter() {
      const [count, setCount] = useState(0);
    
      return (
        <div>
          <h1>{count}</h1>
          <button onClick={() => setTimeout(() => setCount(count + 1), 2000)}>
            Delayed Counter (basic)
          </button>
          <button onClick={() => setTimeout(() => setCount(x => x + 1), 2000)}>
            Delayed Counter (functional)
          </button>
          <button onClick={() => setCount(count + 1)}>Immediate Counter</button>
        </div>
      );
    }
    
    const rootElement = document.getElementById("root");
    ReactDOM.render(<Counter />, rootElement);
    
    0 讨论(0)
  • 2021-01-11 12:50

    Both examples are valid and work the same. However, I suspect that a primitive operates the same as a function because JavaScript supports first-class/higher order functions. This means that functions are threated as any other variables, allowing to pass them as arguments, assign them to variables, and return them within any other function.

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