как справиться с потоком событий в React

#javascript #reactjs #material-ui

Вопрос:

Я хочу создать событие onBlur на левой панели, чтобы оно автоматически закрывалось, когда пользователь нажимает на панель справа. Я попытался использовать onMouseLeave событие, но анимация закрытия не является плавной. Я также хотел, чтобы они могли нажать кнопку на правой панели, она закрывает левую панель, одновременно выполняя функцию кнопки, которая запрещает использование прослушивателя на расстоянии щелчка.

все это работает с включенным размытием, но проблема в том, как остановить запуск события при нажатии на его дочерний компонент

введите описание изображения здесь

код левой панели

       const options = [
        {
           title: 'System Config',
           icon: Settings,
           list: [
             { name: 'General Settings', to: path },
             { name: 'Product Defaults', to: `${url}/pDefaults` },
             { name: 'Inventory Impects', to: `${url}/invImpects` },
           ],
        },{
          title: 'dashboard',
          icon: Dashboard,
          list: [{ name: 'Reports', to: `${url}/reports` }],
        },
      ];

       <Drawer onBlur={() => setOpen(false)}>
         <Box>
           <IconButton onClick={handleDrawer}>
            {!open ? <ChevronRightIcon /> : <ChevronLeftIcon />}
          </IconButton>
          <Divider />
       </Box>
       <List>{options.map((opt, i) =>(
         <ListItem button key={opt}>
           <NavLink activeClassName={classes.activeTab} to={opt.to}>
             <ListItemIcon className={classes.listItemIcon}>
               <Icon />
             </ListItemIcon>
             <ListItemText className={classes.listItemText} primary={opt.title} />
           </NavLink>
         </ListItem>
        ))}
       </List>
       </Drawer>
 

код правой панели

      <Box className={classes.content}>
        <Switch>
          <Route exact path={path} component={GeneralSettings} />
          <Route path={`${path}/pDefaults`} component={ProductDefaults} />
        <Switch>
     </Box>
 

Комментарии:

1. Вы пробовали event.stopPropagation()?

2. const closeDrawer = (event) => { event.stopPropagation(); setOpen(false)}; я попытался создать подобную функцию и прикрепить ее к onBlur, но по-прежнему ничего

Ответ №1:

В MaterialUI есть ClickAwayListener компонент, похоже, это то, что вам нужно.

Ответ №2:

Один из вариантов решения этой проблемы-использовать крючок, который определяет, когда вы нажимаете за пределами элемента. Вот пример такого крючка. Ссылка должна быть назначена самому верхнему элементу React на вашей левой панели

Комментарии:

1. Я попытался прикрепиться к компоненту ящика Mui, но к нему было прикреплено событие, l затем поместил родительский элемент без прикрепленных событий, но он все еще делает то же самое, и мой onBlur все еще прикреплен к ящику Mui, я сильно чувствую useOnClickOutside , что работает, но мне чего-то не хватает @Victor