Ant Design Menu组件defaultSelectedKeys不响应React状态变更求助
你遇到的问题根源在于使用了defaultSelectedKeys这个非受控属性——它只会在Menu组件初始化时读取一次值,后续即使React状态select更新,也不会触发Menu选中项的变化。
要实现点击按钮动态切换选中项,需要将Menu切换为受控模式,用selectedKeys替代defaultSelectedKeys:
修改后的完整代码
import React from 'react'; import { AppstoreOutlined, MailOutlined, SettingOutlined } from '@ant-design/icons'; import type { MenuProps } from 'antd'; import { Menu } from 'antd'; type MenuItem = Required<MenuProps>['items'][number]; function getItem( label: React.ReactNode, key: React.Key, icon?: React.ReactNode, children?: MenuItem[], type?: 'group', ): MenuItem { return { key, icon, children, label, type, } as MenuItem; } const items: MenuProps['items'] = [ getItem('Navigation One', 'sub1', <MailOutlined />, [ getItem('Item 1', 'g1', null, [getItem('Option 1', '1'), getItem('Option 2', '2')], 'group'), getItem('Item 2', 'g2', null, [getItem('Option 3', '3'), getItem('Option 4', '4')], 'group'), ]), getItem('Navigation Two', 'sub2', <AppstoreOutlined />, [ getItem('Option 5', '5'), getItem('Option 6', '6'), getItem('Submenu', 'sub3', null, [getItem('Option 7', '7'), getItem('Option 8', '8')]), ]), { type: 'divider' }, getItem('Navigation Three', 'sub4', <SettingOutlined />, [ getItem('Option 9', '9'), getItem('Option 10', '10'), getItem('Option 11', '11'), getItem('Option 12', '12'), ]), getItem('Group', 'grp', null, [getItem('Option 13', '13'), getItem('Option 14', '14')], 'group'), ]; const App: React.FC = () => { const [select, setSelect] = React.useState(['3']) const onClick: MenuProps['onClick'] = (e) => { console.log('click ', e); }; return ( <React.Fragment> <Menu onClick={onClick} style={{ width: 256 }} selectedKeys={select} {/* 这里把defaultSelectedKeys改成selectedKeys */} defaultOpenKeys={['sub1']} mode="inline" items={items} /> <button onClick={() =>{setSelect(['2'])}}>click</button> </React.Fragment> ); }; export default App;
关键区别说明
defaultSelectedKeys:非受控属性,仅在组件首次渲染时生效,适合不需要外部干预选中状态的场景。selectedKeys:受控属性,完全由外部React状态控制,状态更新时Menu会实时同步选中项,适合需要动态修改选中状态的场景。
内容的提问来源于stack exchange,提问作者Nizar
相关产品推荐
相关产品推荐

