У меня есть компонент с состоянием (использующий реагирующие хуки) и компонент без состояния. Состояние ведет себя неожиданно, так как в 2 функциях, определенных внутри компонента с состоянием, одна получает текущее значение состояния, а другая получает значение состояния по умолчанию.
Версия реагирования: 16.12.0
Фрагмент (полная версия в кодовой песочнице https://codesandbox.io/s/sweet-smoke-tpjge):
import React, { useState } from "react";
import MapLayout from "./MapLayout";
function Map(props) {
const [editMode, setEditMode] = useState(false);
const items = [
{ id: 0, name: "item 0", pos: { x: 0, y: 0 } },
{ id: 1, name: "item 1", pos: { x: 0, y: 100 } }
];
function onItemClick(item) {
if (!editMode) return; // ! Expected to change with state
console.log("On Edit mode"); // ! Never prints
}
function onMapClick(item) {
if (!editMode) return; // ! this works fine
console.log("On Edit mode"); // This prints OK
}
console.log("rerender, editMode value: ", editMode);
return (
<MapLayout
editMode={editMode}
toggleEditMode={() => {
setEditMode(!editMode);
}}
items={items}
onItemClick={onItemClick}
onMapClick={onMapClick}
/>
);
}
export default Map;
Действия для воспроизведения
- Открыть консольный журнал
- Нажмите на любой голубой элемент (должен регистрировать индекс элемента и значение editMode)
- Нажмите на карту (белая область, должен регистрироваться «щелчок MAP» и значение editMode)
- Нажмите кнопку переключения (следует изменить значение editMode на true)
- Нажмите на карту (должно войти то же сообщение плюс «В режиме редактирования»)
- Нажмите на любой голубой элемент (должно войти то же сообщение плюс «В режиме редактирования», это не )
Текущее поведение
Значение EditMode не изменяется для функции "onItemClick", но оно действует внутри функции "onMapClick"
Ожидаемое поведение
Значение EditMode должно вести себя c последовательно во всех определениях функций в пределах своей сферы действия