更改 defaultOpenKeys 值不会重新渲染 antd 菜单组件
on change of defaultOpenKeys values does not rer-ender antd menu component
我想要的:
我想在 change/update defaultOpenKeys
值时打开(展开)特定菜单的子菜单。
我试过的:
const [submenu, setSubmenu] = useState([]);
useEffect(() => {
setSubmenu(["sub1"]);
}, []);
...
<Menu style={{ width: 256 }} defaultSelectedKeys={["4"]} defaultOpenKeys={submenu} mode="inline">
<Menu.Item key="1">Option 1</Menu.Item>
<Menu.Item key="2">Option 2</Menu.Item>
<SubMenu key="sub1" title="Submenu">
<Menu.Item key="3">Option 3</Menu.Item>
<Menu.Item key="4">Option 4</Menu.Item>
</SubMenu>
</Menu>;
在这里,子菜单一开始是一个空数组,但是每当页面加载时,useEffect
确实会更新 submenu
的值并设置为 ["sub1"]
。我认为,只要状态值发生变化,页面就应该重新呈现,所以 <Menu defaultOpenKeys={['sub1']} ...>
应该像这样更新,对吗?
但是在这里,如果我首先传递 <Menu defaultOpenKeys=['sub1'] ... >
那么这会按我预期的那样工作,但是如果我从状态传递 defaultOpenKeys
值,那么这不会像我预期的那样工作(如果 state 的初始值为 ['sub1']
那么它也可以正常工作。
这是代码沙箱,我在其中包含了工作和不工作的演示。
截图如下:
更新:
@HDM91 回答后,
我试过antd提供的另一个道具openKeys
,它一开始确实打开了子菜单,但无法关闭它,甚至它阻止了其他子菜单 opening/closing.
<Menu
style={{ width: 256 }}
defaultSelectedKeys={["4"]}
openKeys={submenu} // blocks other submenu by closing and opening
mode="inline"
>
我刚刚尝试使用 openKeys 并处理 onOpenChange 以将新的 openkeys 设置为子菜单状态,没问题:
const [submenu, setSubmenu] = useState([]);
useEffect(() => {
setSubmenu(["sub1"]);
}, []);
return (
<Menu
style={{ width: 256 }}
defaultSelectedKeys={["4"]}
defaultOpenKeys={submenu}
openKeys={submenu}
onOpenChange={(openKeys) => {
setSubmenu(openKeys);
}}
mode="inline"
>
<Menu.Item key="1">Option 1</Menu.Item>
<Menu.Item key="2">Option 2</Menu.Item>
<SubMenu key="sub1" title="Submenu">
<Menu.Item key="3">Option 3</Menu.Item>
<Menu.Item key="4">Option 4</Menu.Item>
</SubMenu>
</Menu>
);
我想要的:
我想在 change/update defaultOpenKeys
值时打开(展开)特定菜单的子菜单。
我试过的:
const [submenu, setSubmenu] = useState([]);
useEffect(() => {
setSubmenu(["sub1"]);
}, []);
...
<Menu style={{ width: 256 }} defaultSelectedKeys={["4"]} defaultOpenKeys={submenu} mode="inline">
<Menu.Item key="1">Option 1</Menu.Item>
<Menu.Item key="2">Option 2</Menu.Item>
<SubMenu key="sub1" title="Submenu">
<Menu.Item key="3">Option 3</Menu.Item>
<Menu.Item key="4">Option 4</Menu.Item>
</SubMenu>
</Menu>;
在这里,子菜单一开始是一个空数组,但是每当页面加载时,useEffect
确实会更新 submenu
的值并设置为 ["sub1"]
。我认为,只要状态值发生变化,页面就应该重新呈现,所以 <Menu defaultOpenKeys={['sub1']} ...>
应该像这样更新,对吗?
但是在这里,如果我首先传递 <Menu defaultOpenKeys=['sub1'] ... >
那么这会按我预期的那样工作,但是如果我从状态传递 defaultOpenKeys
值,那么这不会像我预期的那样工作(如果 state 的初始值为 ['sub1']
那么它也可以正常工作。
这是代码沙箱,我在其中包含了工作和不工作的演示。
截图如下:
更新:
@HDM91 回答后,
我试过antd提供的另一个道具openKeys
,它一开始确实打开了子菜单,但无法关闭它,甚至它阻止了其他子菜单 opening/closing.
<Menu
style={{ width: 256 }}
defaultSelectedKeys={["4"]}
openKeys={submenu} // blocks other submenu by closing and opening
mode="inline"
>
我刚刚尝试使用 openKeys 并处理 onOpenChange 以将新的 openkeys 设置为子菜单状态,没问题:
const [submenu, setSubmenu] = useState([]);
useEffect(() => {
setSubmenu(["sub1"]);
}, []);
return (
<Menu
style={{ width: 256 }}
defaultSelectedKeys={["4"]}
defaultOpenKeys={submenu}
openKeys={submenu}
onOpenChange={(openKeys) => {
setSubmenu(openKeys);
}}
mode="inline"
>
<Menu.Item key="1">Option 1</Menu.Item>
<Menu.Item key="2">Option 2</Menu.Item>
<SubMenu key="sub1" title="Submenu">
<Menu.Item key="3">Option 3</Menu.Item>
<Menu.Item key="4">Option 4</Menu.Item>
</SubMenu>
</Menu>
);