Как использовать псевдо-селекторы в material-ui?

Я пытался достичь простой вещи. Я пытался показать / скрыть мой <TreeMenu/> компонент в материале UI v1 с псевдо-селекторами, но как-то не работает. Вот код : CSS:

      root: {
        backgroundColor: 'white',
        '&:hover': {
          backgroundColor: '#99f',
        },
      },

  hoverEle: {
    visibility: 'hidden',
    '&:hover': {
      visibility: 'inherit',
    },
  },
      rootListItem: {
        backgroundColor: 'white',
        display: 'none',
        '&:hover': {
          display: 'block',
          backgroundColor: '#99f',
        },
      },
      '@global': {
        'li > div.nth-of-type(1)': {
          display: 'block !important',
          backgroundColor: "'yellow',",
        },
      },

корневой класс css отлично работает в списке, но rootListItem или даже селектор @global li не работает. Я не уверен, что я делаю неправильно с селекторами.Я прочитал material - UI docs и сказал, что V1 поддерживает псевдо селекторы.

JSX:

<div>
      {props.treeNode.map(node => (
        <ListItem
          key={`${node.Type}|${node.NodeID}`}
          id={`${node.Type}|${node.NodeID}`}
          className={(classes.nested, classes.root)}
          button
          divider
          disableGutters={false}
          dense
          onClick={() => props.onNodeClick(node.Type, node.NodeID, node.NodeName)}
          title={props.adminUser ? node.NodeID : ''}
          onMouseOver={() => props.onMouseOver(node.Type, node.NodeID)}
        >
          <ListItemIcon>{props.listIcon}</ListItemIcon>
          <ListItemText primary={node.NodeName} />
          <ListItemSecondaryAction classes={{ root: classes.rootListItem }}>
            <TreeMenu />
          </ListItemSecondaryAction>
          <div className={classes.hoverEle}>
            <TreeMenu />
          </div>
        </ListItem>
      ))}
    </div>

посмотрите, пожалуйста <TreeMenu > компонент. Я применил 3 разных трюка: 1) класс hoverEle с '&:hover' селектор. 2) попытался переопределить корневой класс по умолчанию <ListItemSecondaryAction> мой класс rootListItem 3) используя другие псевдо селекторы на Li.Вижу 'li > div.nth-of-type(1)':

1 ответов


через некоторое время борьбы за ваш код и работает я нашел, что не так с вашим кодом.

кажется, все в порядке, селектор для rootListItem работает прямо из коробки, проблема в том, что вы не можете использовать псевдо-селектор :hover на элементе, который имеет display: none. Вместо этого вы должны использовать opacity: 0 and opacity: 1, он скроет вашу ListItemSecondaryAction, но в то же время он позволит вам парить. Итак, элементы с дисплеем: нет, технически не отображается и таким образом, вы не можете парить над ними.

о вашем псевдо селекторе в global, вы просто написали его неправильно. Использование двоеточия вместо точки после div и изменение backgroundColor на "желтый" вместо "желтый","

'li > div:nth-of-type(1)': {
        display: 'block !important',
        backgroundColor: 'yellow',
    },

Я не знал, как выглядит Ваш TreeMenu как компонент, поэтому я просто создал список с узлами ul / li / div.

const styles = {
root: {
    backgroundColor: 'white',
    '&:hover': {
        backgroundColor: '#99f',
    },
},
hoverEle: {
    visibility: 'hidden',
    '&:hover': {
        visibility: 'inherit',
    },
},
rootListItem: {
    backgroundColor: 'white',
    opacity: 0,
    '&:hover': {
        opacity: 1,
        backgroundColor: '#99f',
    },
},
'@global': {
    'li > div:nth-of-type(1)': {
        display: 'block !important',
        backgroundColor: "yellow",
    },
},
};

и:

<div>
    {treeNode.map(node => (
        <ListItem
            key={`${node.Type}|${node.NodeID}`}
            id={`${node.Type}|${node.NodeID}`}
            className={classes.root}
            button
            divider
            disableGutters={false}
            dense
            onClick={() => {}}
            title={''}
            onMouseOver={() => {}}
        >
            <ListItemText primary={node.NodeName} />
            <ListItemSecondaryAction classes={{ root: classes.rootListItem }}>
                <ul><li><div>Elem 1</div></li><li><div>Elem 2</div></li></ul>
            </ListItemSecondaryAction>
            <div className={classes.hoverEle}>
                <ul><li><div>Elem 1</div></li><li><div>Elem 2</div></li></ul>
            </div>
        </ListItem>
    ))}
</div>

*Я использую treeNode, который является массивом для меня, и я удалил остальную часть функции и TreeMenu.