为何CountBadge组件仅切换至fullView时挂载?如何避免重复挂载?
解决CountBadge组件重复挂载与API重复调用问题
问题根源
当前子组件通过viewType === 'fullView' && ...的条件渲染逻辑控制badge显示:当viewType切换为非fullView时,React会直接卸载包含CountBadge的<Box>组件;切回fullView时又重新挂载该组件,导致组件内部的计数API每次切换都会被重复调用。
解决方案
方案1:用CSS控制显示/隐藏(推荐)
放弃条件渲染,改用CSS的display属性控制组件的显示与隐藏,让组件始终保持挂载状态:
修改子组件代码:
<Box sx={{ pr: 3, display: viewType === 'fullView' ? 'block' : 'none' }}> {item.notification} </Box>
这种方式下,CountBadge组件不会被卸载,只是在非fullView时隐藏,自然避免了重复调用API的问题。
方案2:父组件维护显示状态,传递给子组件
在父组件中始终挂载CountBadge,通过状态同步viewType的变化,再将显示状态传递给子组件:
父组件代码修改:
import { useState, useEffect } from 'react'; // ...其他代码 const [showBadge, setShowBadge] = useState(false); // 监听viewType变化,更新badge显示状态 useEffect(() => { setShowBadge(viewType === 'fullView'); }, [viewType]); const countBadge = <CountBadgeWithListener id="SID" url={'submenu'} />; return ( <SideMenuWithSubMenu icon={<SubmenuIcon />} headerText="Submenu" subMenuItems={[ { to: '/submenu', text: 'Inbox', notification: countBadge, showNotification: showBadge } ]} /> );
子组件代码修改:
<Box sx={{ pr: 3, display: item.showNotification ? 'block' : 'none' }}> {item.notification} </Box>
额外优化:避免组件不必要重渲染
如果CountBadgeWithListener存在无关状态变化导致的重渲染,可以用React.memo包裹组件,减少不必要的更新:
import { memo } from 'react'; const CountBadgeWithListener = memo(() => { // 组件原有逻辑 }); export default CountBadgeWithListener;
内容的提问来源于stack exchange,提问作者Siva Karthick Rajan K
相关产品推荐
相关产品推荐

