MaterialUI Tabs点击无响应 状态更新后视图未切换问题求助
问题根因
你在组件内部构造完Tabs元素后直接调用ReactDOM.render挂载,这一挂载逻辑仅会在组件首次渲染时执行一次。后续value状态更新触发组件重渲染时,不会重新执行挂载逻辑更新root节点下的内容,所以视图始终停留在首次渲染的结果,和已更新的状态不同步。
另外你通过map生成Tab、TabPanel列表时没有添加唯一key属性,React无法正确追踪列表元素变更,也可能引发更新异常。
修复方案
- 不要在业务组件内手动调用
ReactDOM.render,把Tabs相关的逻辑作为组件返回值交给React的默认渲染流程处理。如果是根组件逻辑,调整为如下写法,全局仅调用一次ReactDOM.render挂载根组件即可:
// 全局根渲染逻辑仅执行一次 const Root = () => { const [value, setValue] = React.useState(0); const handleChange = (event, newValue) => { setValue(newValue); }; // json_links为提供用户信息的对象数组 const ListOfTabs = json_links.map((link, index) => ( <Tab key={index} value={index} label={link['userName']} {...a11yProps({index})} /> )) // TabPanel来自Material UI Tabs官方示例 const ListOfTabPanels = json_links.map((link, index) => ( <TabPanel key={index} value={value} index={index}> <Profile imagelist={link['images']} username={link['userName']}/> </TabPanel> )) return ( <div> <AppBar id="tabsAppBar" position="static"> <Tabs value={value} onChange={handleChange} aria-label="simple tabs example"> {ListOfTabs} </Tabs> </AppBar> {ListOfTabPanels} </div> ) } ReactDOM.render(<Root />, document.getElementById("root"))
- 所有map生成的列表元素补充
key属性,保证React可以正确追踪元素变更。
修改完成后状态更新会触发根组件重渲染,返回最新的Tabs配置,MUI的Tabs组件就能拿到最新的value值自动切换选中状态和对应内容展示。
内容的提问来源于stack exchange,提问作者idan b
相关产品推荐
相关产品推荐

