Push method in React Hooks (useState)?

后端 未结 8 663
無奈伤痛
無奈伤痛 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:11

    The same way you do it with "normal" state in React class components.

    example:

    function App() {
      const [state, setState] = useState([]);
    
      return (
        <div>
          <p>You clicked {state.join(" and ")}</p>
          //destructuring
          <button onClick={() => setState([...state, "again"])}>Click me</button>
          //old way
          <button onClick={() => setState(state.concat("again"))}>Click me</button>
        </div>
      );
    }
    
    0 讨论(0)
  • 2020-11-29 16:19

    Most recommended method is using wrapper function and spread operator together. For example, if you have initialized a state called name like this,

    const [names, setNames] = useState([])

    You can push to this array like this,

    setNames(names => [...names, newName])
    

    Hope that helps.

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

    To expand a little further, here are some common examples. Starting with:

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

    Push element at end of array

    setTheArray(prevArray => [...prevArray, newValue])
    

    Push/update element at end of object

    setTheObject(prevState => ({ ...prevState, currentOrNewKey: newValue}));
    

    Push/update element at end of array of objects

    setTheArray(prevState => [...prevState, {currentOrNewKey: newValue}]);
    

    Push element at end of object of arrays

    let specificArrayInObject = theObject.array.slice();
    specificArrayInObject.push(newValue);
    const newObj = { ...theObject, [event.target.name]: specificArrayInObject };
    theObject(newObj);
    

    Here are some working examples too. https://codesandbox.io/s/reacthooks-push-r991u

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

    if you want to push after specific index you can do as below:

       const handleAddAfterIndex = index => {
           setTheArray(oldItems => {
                const copyItems = [...oldItems];
                const finalItems = [];
                for (let i = 0; i < copyItems.length; i += 1) {
                    if (i === index) {
                        finalItems.push(copyItems[i]);
                        finalItems.push(newItem);
                    } else {
                        finalItems.push(copyItems[i]);
                    }
                }
                return finalItems;
            });
        };
    
    0 讨论(0)
  • 2020-11-29 16:26
    // Save search term state to React Hooks with spread operator and wrapper function
    
    // Using .concat(), no wrapper function (not recommended)
    setSearches(searches.concat(query))
    
    // Using .concat(), wrapper function (recommended)
    setSearches(searches => searches.concat(query))
    
    // Spread operator, no wrapper function (not recommended)
    setSearches([...searches, query])
    
    // Spread operator, wrapper function (recommended)
    setSearches(searches => [...searches, query])
    

    https://medium.com/javascript-in-plain-english/how-to-add-to-an-array-in-react-state-3d08ddb2e1dc

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

    I tried the above methods for pushing an object into an array of objects in useState but had the following error when using TypeScript:

    Type 'TxBacklog[] | undefined' must have a 'Symbol.iterator' method that returns an iterator.ts(2488)

    The setup for the tsconfig.json was apparently right:

    {
       "compilerOptions": {
       "target": "es6",
       "lib": [
          "dom",
          "dom.iterable",
          "esnext",
          "es6",
    ],
    

    This workaround solved the problem (my sample code):

    Interface:

       interface TxBacklog {
          status: string,
          txHash: string,
       }
    

    State variable:

        const [txBacklog, setTxBacklog] = React.useState<TxBacklog[]>();
    

    Push new object into array:

        // Define new object to be added
        const newTx = {
           txHash: '0x368eb7269eb88ba86..',
           status: 'pending'
        };
        // Push new object into array
        (txBacklog) 
           ? setTxBacklog(prevState => [ ...prevState!, newTx ])
           : setTxBacklog([newTx]);
    
    0 讨论(0)
提交回复
热议问题