Push method in React Hooks (useState)?

后端 未结 8 664
無奈伤痛
無奈伤痛 2020-11-29 15:30

How to push element inside useState array React hook? Is that as an old method in react state? Or something new?

E.g. setState push example ?

相关标签:
8条回答
  • 2020-11-29 16:34

    When you use useState, you can get an update method for the state item:

    const [theArray, setTheArray] = useState(initialArray);
    

    then, when you want to add a new element, you use that function and pass in the new array or a function that will create the new array. Normally the latter, since state updates are asynchronous and sometimes batched:

    setTheArray(oldArray => [...oldArray, newElement]);
    

    Sometimes you can get away without using that callback form, if you only update the array in handlers for certain specific user events like click (but not like mousemove):

    setTheArray([...theArray, newElement]);
    

    The events for which React ensures that rendering is flushed are the "discrete events" listed here.

    Live Example (passing a callback into setTheArray):

    const {useState, useCallback} = React;
    function Example() {
        const [theArray, setTheArray] = useState([]);
        const addEntryClick = () => {
            setTheArray(oldArray => [...oldArray, `Entry ${oldArray.length}`]);
        };
        return [
            <input type="button" onClick={addEntryClick} value="Add" />,
            <div>{theArray.map(entry =>
              <div>{entry}</div>
            )}
            </div>
        ];
    }
    
    ReactDOM.render(
        <Example />,
        document.getElementById("root")
    );
    <div id="root"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.1/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.1/umd/react-dom.production.min.js"></script>

    Because the only update to theArray in there is the one in a click event (one of the "discrete" events), I could get away with a direct update in addEntry:

    const {useState, useCallback} = React;
    function Example() {
        const [theArray, setTheArray] = useState([]);
        const addEntryClick = () => {
            setTheArray([...theArray, `Entry ${theArray.length}`]);
        };
        return [
            <input type="button" onClick={addEntryClick} value="Add" />,
            <div>{theArray.map(entry =>
              <div>{entry}</div>
            )}
            </div>
        ];
    }
    
    ReactDOM.render(
        <Example />,
        document.getElementById("root")
    );
    <div id="root"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.1/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.1/umd/react-dom.production.min.js"></script>

    0 讨论(0)
  • 2020-11-29 16:36

    setTheArray([...theArray, newElement]); is the simplest answer but be careful for the mutation of items in theArray. Use deep cloning of array items.

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