javascript - 如何在反应js中单击添加活动类
问题描述
我已经阅读并尝试了许多解决方案,但我是 React 新手,我无法弄清楚单击 div 时如何添加类 {s.highlighted}。有人可以向我解释一下吗?这是我的代码,但不是我写的。我更喜欢在单击时将 {s.highlighted} 添加到“ListItem”,并将其从之前处于活动状态的元素中删除。
看起来以前的开发人员开始做某事,但它不能正常工作。目前只有“测试助手”链接始终突出显示。这段代码有什么问题?
const useStyles = makeStyles((theme) =>
createStyles({
link: {
textDecoration: 'none',
color: theme.palette.grey[900],
},
highlighted: {
backgroundColor: lighten(green[500], 0.5),
},
})
)
// eslint-disable-next-line
//@ts-nocheck
export const MenuItems: React.FC = () => {
const s = useStyles()
return (
<div>
<Link to="/dashboard/proxies" className={s.link}>
<ListItem>
<ListItemIcon>
<CloudDone />
</ListItemIcon>
<ListItemText primary="Proxies" />
</ListItem>
</Link>
<Link to="/dashboard/permissions" className={s.link}>
<ListItem>
<ListItemIcon>
<VerifiedUser />
</ListItemIcon>
<ListItemText primary="Permissions" />
</ListItem>
</Link>
<Link to="/dashboard/test-helpers" className={classnames(s.link)}>
<ListItem className={s.highlighted}>
<ListItemIcon>
<Help />
</ListItemIcon>
<ListItemText primary="Test Helpers" />
</ListItem>
</Link>
<Link to="/dashboard/plans" className={s.link}>
<ListItem>
<ListItemIcon>
<FormatListNumbered />
</ListItemIcon>
<ListItemText primary="Plans" />
</ListItem>
</Link>
<Link to="/dashboard/user-management" className={s.link}>
<ListItem>
<ListItemIcon>
<Person />
</ListItemIcon>
<ListItemText primary="User Management" />
</ListItem>
</Link>
<Link to="/dashboard/activate-subscription" className={s.link}>
<ListItem>
<ListItemIcon>
<PersonAdd />
</ListItemIcon>
<ListItemText primary="Activate Subscription" />
</ListItem>
</Link>
<Link to="/dashboard/user-plan-limits" className={s.link}>
<ListItem>
<ListItemIcon>
<BarChartIcon />
</ListItemIcon>
<ListItemText primary="User Plan Limits" />
</ListItem>
</Link>
</div>
)
}
解决方案
您可以改用NavLink
of 组件react-router-dom
,它接受一些可以让您实现主动路由行为的道具,就像您试图实现的那样。
然后你可以传递s.highlighted
给activeClassName
prop 并修改 css 以定位它的第一个子元素,该子元素将以ListItem
组件为目标。
这是您更新的代码:
const useStyles = makeStyles((theme) =>
createStyles({
link: {
textDecoration: 'none',
color: theme.palette.grey[900],
},
highlighted: {
'& > div': {
backgroundColor: lighten(green[500], 0.5)
}
},
})
)
// eslint-disable-next-line
//@ts-nocheck
export const MenuItems: React.FC = () => {
const s = useStyles()
return (
<div>
<NavLink activeClassName={s.highlighted} to="/dashboard/proxies" className={s.link}>
<ListItem>
<ListItemIcon>
<CloudDone />
</ListItemIcon>
<ListItemText primary="Proxies" />
</ListItem>
</NavLink>
<NavLink activeClassName={s.highlighted} to="/dashboard/permissions" className={s.link}>
<ListItem>
<ListItemIcon>
<VerifiedUser />
</ListItemIcon>
<ListItemText primary="Permissions" />
</ListItem>
</NavLink>
<NavLink activeClassName={s.highlighted} to="/dashboard/test-helpers" className={classnames(s.link)}>
<ListItem>
<ListItemIcon>
<Help />
</ListItemIcon>
<ListItemText primary="Test Helpers" />
</ListItem>
</NavLink>
<NavLink activeClassName={s.highlighted} to="/dashboard/plans" className={s.link}>
<ListItem>
<ListItemIcon>
<FormatListNumbered />
</ListItemIcon>
<ListItemText primary="Plans" />
</ListItem>
</NavLink>
<NavLink activeClassName={s.highlighted} to="/dashboard/user-management" className={s.link}>
<ListItem>
<ListItemIcon>
<Person />
</ListItemIcon>
<ListItemText primary="User Management" />
</ListItem>
</NavLink>
<NavLink activeClassName={s.highlighted} to="/dashboard/activate-subscription" className={s.link}>
<ListItem>
<ListItemIcon>
<PersonAdd />
</ListItemIcon>
<ListItemText primary="Activate Subscription" />
</ListItem>
</NavLink>
<NavLink activeClassName={s.highlighted} to="/dashboard/user-plan-limits" className={s.link}>
<ListItem>
<ListItemIcon>
<BarChartIcon />
</ListItemIcon>
<ListItemText primary="User Plan Limits" />
</ListItem>
</NavLink>
</div>
)
}
推荐阅读
- javascript - 登录后反应重新渲染 - 以及异步调用后
- python - 如何绘制按日期聚合的熊猫数据框
- java - Thymeleaf in IntelliJ: cannot resolve variables
- node.js - 是否可以使用客户端呈现的应用程序和会话进行身份验证?
- nginx - 不同物理机如何使用 Nginx?
- ios - 如果手机内存已满,如何处理 SQLite db?
- asp.net - 如何在 ASP.NET Core 2.0 Razor 页面中获取域名
- xamarin - Xamarin Native Android HttpClient,它位于哪里?
- node.js - 构建运行时的 webpack 错误。'错误:找不到模块'@webassemblyjs/ast''
- post - 不好的做法?在客户端到客户端调用的标头中获取一些数据