Основная проблема для вещей, которые не обновляются, заключается в том, что вы изменяете состояние.
React не будет обновлять состояние, пока не обнаружит разницу, и он использует строгие проверки на равенство для быстрой проверки.Итак, вам нужно убедиться, что вы возвращаете новый объект, и вам нужно убедиться, что вы что-то возвращаете, когда выполняете вызов функции для setState.Вот ваш move
метод с несколькими встроенными комментариями
move = () => {
this.setState((state, props) => {
// foreach does not return anything
state.position.forEach((item, index) => {
let i = item;
// these next two lines mutate the array in place
i[0] += 20;
i[1] += 1;
console.log(i);
})
});
};
Как правило, когда вы вызываете setState
, вы действительно хотите установить состояние, так что сделайте это здесь с map
вместоforEach
и вернуть новые массивы.
move = () => {
// setState expects a new object for a state, below the `prev => ({})` syntax
// implicitly returns a new object
this.setState(prev => ({
// spread the previous state
...prev,
// map returns a new array, and our implementation, here, returns new sub-arrays and uses some destructuring to make the code easier to read.
position: prev.position.map(([x, y], index) => [x + 20, y + 1]),
}));
};