Реагирующий поппер с помощью ClickAwayListener запускает onClick всех дочерних компонентов

#reactjs #material-ui

Вопрос:

Поппер с включенным ClickAwayListener запускает все функции onClick дочерних компонентов. Каков был бы правильный способ предотвратить это? Если вам нужна дополнительная информация, пожалуйста, дайте мне знать!

Родительский код:

 <Popper
                    open={Boolean(this.state.openNotification)}
                    anchorEl={this.state.openNotification}
                    placement='bottom-end'
                    disablePortal={true}
                    transition
                >
                    {({TransitionProps, placement}) => (
                        <Grow {...TransitionProps} id="notification-menu-list-grow">
                            <Paper className={classes.notificationsPaper}>

                                <ClickAwayListener onClickAway={this.handleCloseNotification.bind(this)}>
                                    {this.state.notificationList.length > 0 ?
                                        <List>
                                            {
                                                this.state.notificationList.map((notification, index) =>
                                                    <NotificationListItem key={index} id={notification._id}
                                                                          type={notification.type}
                                                                          title={notification.title}
                                                                          read={notification.read}
                                                                          timestamp={notification.timestamp}/>)
                                            }
                                        </List>
                                    :
                                        <Typography className={classes.noNotifText}>Keine Benachrichtigungen</Typography>
                                    }
                                </ClickAwayListener>

                                <IconButton edge="end" aria-label="delete all" className={classes.deleteAllIConButton} onClick={this.deleteAllNotifications()}>
                                    <ClearAllIcon/>
                                </IconButton>
                            </Paper>
                        </Grow>
                    )}
                </Popper>
 

Дочерний компонент:

 return (
        <ListItem id={props.id}>
            <ListItemText className={!props.read ? classes.notificationHeaderTitleUnread : classes.notificationHeaderTitle}
                          primary={props.title} secondary={props.timestamp}/>
            <ListItemSecondaryAction>
                <IconButton edge="end" aria-label="delete" onClick={deleteNotification()}>
                    <DeleteOutlineIcon/>
                </IconButton>
            </ListItemSecondaryAction>
        </ListItem>
    );
 

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

1. Разве ваш onClick не должен быть таким onClick={() => deleteNotification()} ?

2. Работает с этим, в чем разница между ними?

Ответ №1:

Поскольку мой комментарий решил проблему, следовательно, я опубликую его в качестве ответа.

Пожалуйста, измените свой onClick на onClick={() => deleteNotification()} .

  • onClick={() => deleteNotification()} является объявлением функции, т. е. вы передали функцию.
  • Записывая onClick={deleteNotification()} , вы вызываете функцию удаления, а не передаете ее.

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

1. Спасибо вам за ваше объяснение! Ценю это!

2. Пожалуйста. Пожалуйста, отметьте это как ответ.