React + Antd v5 更新状态后元素不变的问题?

作者站长头像
站长
· 阅读数 21

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