React, Material-UI — onClick() всегда получает последний элемент в качестве аргумента

#reactjs #material-ui #jsx

Вопрос:

Я врезался в стену. Проблема в том, что handleDeleteItem() всегда получает последний элемент._id вместо заданного. С другой стороны, goToEdit() работает правильно. До сих пор я пытался разместить ключевое свойство в разных компонентах, удалить node_modules и перестроить приложение. Я понятия не имею, что вызывает эту ситуацию. У меня есть такой компонент, как этот:

 export class List extends Component {
  render() {
    const {
      classes,
      items,
      anchorEl,
      handleDeleteItem,
      openItemMenu,
      closeItemMenu,
      goToEdit,
    } = this.props;
    return (
      <main className={classes.content}>
        <div className={classes.toolbar} />
        <Typography
          variant="h3"
          color="textSecondary"
          gutterBottom
          align="center"
        >
          Items
        </Typography>

        <Grid container spacing={3}>
          <Grid item xs={12} align="right">
            <Button
              variant="outlined"
              color="primary"
              startIcon={<AddIcon />}
              onClick={(e) => goToEdit(e, 0)}
            >
              Add new
            </Button>
          </Grid>
          {!items.length amp;amp; (
            <Grid item xs={12} align="center">
              <Typography variant="overline">
                List empty!
              </Typography>
            </Grid>
          )}
          {items.map((item) => (
            <Grid item key={item._id} xs={12}>
              <Paper
                elevation={3}
                style={{
                  borderLeft: `5px solid ${item.color}`,
                }}
                onClick={(e) => goToEdit(e, item._id)}
                className={classes.paper}
              >
                <Grid container>
                  <Grid item xs={11}>
                    <Typography variant="subtitle1" color="textSecondary">
                      {item.name}
                    </Typography>
                  </Grid>

                  <Grid item xs={1} align="right">
                    <IconButton
                      className={classes.showOnHover}
                      size="small"
                      edge="end"
                      aria-label="delete"
                      onClick={(e) => openItemMenu(e)}
                    >
                      <MoreVertIcon />
                    </IconButton>
                    <Menu
                      id="item-menu"
                      anchorEl={anchorEl}
                      keepMounted
                      open={Boolean(anchorEl)}
                      onClose={(e) => closeItemMenu(e)}
                      TransitionComponent={Fade}
                    >
                      <MenuItem
                        onClick={(e) => handleDeleteItem(e, item._id)}
                      >
                        Usuń bajkę
                      </MenuItem>
                    </Menu>
                  </Grid>

                  <Grid item xs={12}>
                    <Box
                      component="div"
                      my={2}
                      textOverflow="ellipsis"
                      overflow="hidden"
                    >
                      <Typography noWrap variant="body2">
                        {item.description}
                      </Typography>
                    </Box>
                  </Grid>
                </Grid>
              </Paper>
            </Grid>
          ))}
        </Grid>
      </main>
    );
  }
}
 

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

1. как это определяется handleDeleteItem ?

2. Вы визуализируете внутри карты с константой id для Menu — поскольку все они одинаковы id="item-menu" , это может повлиять на то, как материал-пользовательский интерфейс извлекает и передает значение выбранного пункта меню.

3. @ handleDeleteItem(e, id) { e.stopPropagation(); this.closeItemMenu(e); this.deleteItemOnServer(e, id); } buzatto и он привязан в специальном конструкторе

4. если вы введете идентификатор журнала консоли внутри сервера deleteItemOnServer, он всегда будет показывать последний идентификатор?

5. да, он показывает идентификатор последнего элемента