如何在 Drawer - Material UI 中将 MenuItem 设置为活动状态?

Posted

技术标签:

【中文标题】如何在 Drawer - Material UI 中将 MenuItem 设置为活动状态?【英文标题】:How can I set a MenuItem as active in Drawer - Material UI? 【发布时间】:2017-09-22 14:26:42 【问题描述】:

我有这个代码:

            <Drawer 
                docked = false
                width = 330
                open = this.state.drawerOpen
                onRequestChange = (drawerOpen) => this.setState(drawerOpen)
            >

                    <MenuItem primaryText="Inicio" onTouchTap = this.drawerOpened containerElement = <Link to="/administrador/inicio"/>/>
                    <MenuItem primaryText="Nueva Incidencia" onTouchTap = this.drawerOpened containerElement = <Link to="/administrador/nueva_incidencia"/>/>
                    <MenuItem primaryText="Incidencias Recibidas" onTouchTap = this.drawerOpened containerElement = <Link to="/administrador/incidencias_recibidas"/>/>
                    <MenuItem primaryText="Informes" /*onTouchTap = () => this.currentPages('Informes')*/onTouchTap = this.drawerOpened containerElement = <Link to="/administrador/informes"/>/>
            </Drawer>

我希望当我单击一个 MenuItem 时,它设置为“活动”(如在 Bootstrap 中),背景为浅灰色和类似的样式。我怎么能这样做?问题也是由于 React-Router 导致的,它卸载了组件 Menu 并重新渲染它,因此状态不可用。

谢谢。

【问题讨论】:

没人还有答案吗? 【参考方案1】:

在最新版本的 Material UI(肯定在 v4 中)中,您可以使用 selected 属性,例如这是我的 &lt;ListItemLink&gt; 组件,我正在使用 ListItem 组件,但也适用于 MenuItem。请注意selected=to === location.pathname 处的那一行:

import PropTypes,  InferProps  from 'prop-types'
import React from 'react'
import  Link, useParams, useLocation  from 'react-router-dom'

function ListItemLink( disabled = false, icon, primary, to : InferProps<typeof ListItemLink.propTypes>) 
  const location = useLocation()

  const renderLink = React.useMemo(
    () => React.forwardRef<htmlAnchorElement>((itemProps, ref) => <Link to=to ref=ref ...itemProps />),
    [to],
  )

  return (
    <ListItem
      button
      selected=to === location.pathname
      disabled=disabled ?? false
      component=renderLink
    >
      icon ? <ListItemIcon>icon</ListItemIcon> : null
      <ListItemText primary=primary />
    </ListItem>
  )


ListItemLink.propTypes = 
  icon: PropTypes.element,
  primary: PropTypes.string.isRequired,
  to: PropTypes.string.isRequired,
  disabled: PropTypes.bool


ListItemLink.defaultProps = 
  disabled: false

如果在某些时候,您想自定义默认选择的样式,只需在创建主题时覆盖它:

import  createMuiTheme  from '@material-ui/core/styles'
import  colors  from '@material-ui/core'


const theme = createMuiTheme(
  overrides: 
    MuiListItem: 
      root: 
        "&$selected": 
          color: colors.blue[500],
          backgroundColor: colors.lightBlue[100]
        
      
    
  
)

export default theme

【讨论】:

【参考方案2】:

这是我的解决方法:

定义函数:

isActive = (value) => (location.pathname === value ? 'active' : '')

<MenuItem primaryText="Inicio" onTouchTap = this.drawerOpened 
className=this.isActive('/administrador/inicio')
containerElement = <Link to="/administrador/inicio"/>/>

现在您只是缺少“活动”的 de css 样式。

【讨论】:

【参考方案3】:

如何围绕 MenuItem 创建一个包装组件并接受样式属性,然后将其应用于 MenuItem?

这可能会有所帮助: Toggle background color of list on click react.js

【讨论】:

非常感谢。我已经看到了。但我的问题也是由于我使用 React Router 的 Routes Link,并且组件重新渲染失去了他的状态。 哦,不知道,因为没有提到。我建议您是否可以发布一个单独的问题来使用 React Router 重新渲染来处理状态。 由于卸载和重新渲染组件,状态不可用,它们被设置为默认值。但是,我只有一个状态:opened: true/false,没有了。谢谢。【参考方案4】:

@jpnazar 的答案几乎是正确的。但是, containerElement 属性不再起作用。您现在可以使用上面的代码来指定链接了。

import  Link  from 'react-router-dom';
import MenuItem from '@material-ui/core/MenuItem';

...

<MenuItem component=Link to="/your-path">...</MenuItem>

查看问题。 https://github.com/mui-org/material-ui/issues/204

【讨论】:

以上是关于如何在 Drawer - Material UI 中将 MenuItem 设置为活动状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Drawer - Material UI 中将 MenuItem 设置为活动状态?

如何更改 React Material-ui Drawer 菜单项间距?

Material-UI Drawer 组件的单独触发器

Material UI - 在 AppBar 点击打开 LeftNav / Drawer

Material-UI Drawer 在移动设备上不滚动

Material UI Drawer 不会在 Appbar 下移动