Когда вы используете 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>