【发布时间】:2020-05-01 11:02:42
【问题描述】:
我有一个有状态的组件(使用反应钩子)和一个无状态的布局组件。 状态的行为出乎意料,就像在有状态组件内部定义的 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 值)
- 点击地图(白色区域,应记录“地图点击”和editMode值)
- 单击切换按钮(应将 editMode 值更改为 true)
- 点击地图(应该记录相同的消息加上“编辑模式”)
- 点击任何青色项目(应该记录相同的消息加上“在编辑模式”,它没有)
当前行为
EditMode 值不会在“onItemClick”函数上改变, 但它确实在“onMapClick”函数中
预期行为
EditMode 值应该在其范围内的所有函数定义中表现一致
【问题讨论】:
-
一方面,当您需要旧值时,状态挂钩的设置器使用 lambda。
setEditMode(editMode => !editMode) -
onItemClick不设置editMode状态。只是在toggleEditMode设置状态时检查它。 -
@MoshFeu 这就是重点,它只是为了记录和检查。并且支票总是出现
false,即使其他支票出现true
标签: javascript reactjs react-hooks