React + Antd v5 更新状态后元素不变的问题?
用的是 React
和 Antd v5
为什么在改了 state
之后元素还是没变化呢
const [editLock, setEditLock] = useState(false);
const MenuAction = () => <Flex justify={`space-around`} align={`center`}>
<Tooltip title="编辑子系统" placement="top">
<UnlockOutlined onClick={() => setEditLock(true)} />
</Tooltip>
</Flex>
const menuDefault: MenuProps['items'] = [
{ label: <MenuAction />, key: 'top' },
];
const formatMenu = (data: any) => data.map((item: any) => ({
key: item.id,
children: [],
label: <>
{!editLock && <SwitcherOutlined />}
</>,
}))
<Menu
mode="inline"
items={menu}
selectedKeys={[current]}
defaultOpenKeys={['pages']}/>
问过 GPT 但是没有结果
回复
1个回答

test
2024-06-24
useState
之类的 hooks
只能在自定义 hook
或者函数组件内使用,不能在顶层作用域使用。不过神奇的是这样写居然能编译,我在 TS + React 环境下试了试,直接过不了 lint 检测。
并且 React 没有响应式属性的概念,因此无法在两个独立的组件之间共享 state
,要实现类似的功能,可以使用 sustand
。
安装
npm install zustand
使用:
import { create } from "zustand";
const useStore = create((set) => ({
editLock: false,
setEditLock: (value) => set(() => ({ editLock:value })),
}));
const MenuAction = () => {
const { editLock, setEditLock } = useStore((state) => state);
return (<Flex justify={`space-around`} align={`center`}>
<Tooltip title="编辑子系统" placement="top">
<UnlockOutlined onClick={() => setEditLock(true)} />
</Tooltip>
</Flex>)
}
const formatMenu = (data: any) => data.map((item: any) => ({
key: item.id,
children: [],
label: () => {
const { editLock } = useStore((state) => state);
return !editLock? <SwitcherOutlined />: null
},
}))
这里的 label 要作为组件传递和使用,而不是作为 JSX.Element
。
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容