Push-метод в React Hooks (useState)? - PullRequest
       4

Push-метод в React Hooks (useState)?

0 голосов
/ 13 февраля 2019

Как вставить элемент внутрь массива useState React hook?Это как старый метод в состоянии реакции?Или что-то новое?

Например, setState push пример ?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Так же, как вы делаете это с "нормальным" состоянием в компонентах класса React.

пример:

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 голосов
/ 13 февраля 2019

Когда вы используете useState, вы можете получить метод обновления для элемента состояния:

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

, а затем, когда вы хотите добавить новый элемент, вы используете этофункцию и передать новый массив или функцию, которая создаст новый массив.Обычно последнее, так как обновления состояния являются асинхронными и иногда пакетными:

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

Иногда вы можете обойтись без использования этой формы обратного вызова, если вы только обновите массив в обработчиках для определенных конкретныхпользовательские события, такие как click (но не как mousemove):

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

События, для которых React гарантирует, что рендеринг сбрасывается, являются перечисленными «дискретными событиями» здесь .

Пример Live (передача обратного вызова в 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>

Поскольку единственное обновление для theArray там - это событие в событии click (одно из "дискретных" событий), я мог получитьпрочь с прямым обновлением в 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>
...