reactjs 为什么在数组State上Map时使用索引传递给MenuItem onClick时,索引总是最后一个索引?

flvtvl50  于 2023-01-25  发布在  React
关注(0)|答案(2)|浏览(91)

在名为talkes的状态中设置一个对象生命数组

[
    {
        "firstName": "B",
        "lastName": "W",
        "day": "2022-09-30T23:06:26.000Z",
        "reasons": [
            "Car related questions"
        ],
        "description": ""
    },
    {
        "firstName": "Kevin",
        "lastName": "L",
        "day": "2022-09-30T23:06:26.000Z",
        "reasons": [
            "Car related questions"
        ],
        "description": ""
    },
    {
        "firstName": "M",
        "lastName": "K",
        "day": "2022-09-30T23:06:26.000Z",
        "reasons": [
            "Car related questions"
        ],
        "description": ""
    }
]

有一个map函数将状态的单个对象Map到Card组件

talks.map((talk, index) => {
          return
            <Card>
              <CardHeader
                avatar={
                  <Avatar sx={{ bgcolor: 'secondary.main' }} aria-label="recipe">
                    {talk.firstName.charAt(0)}
                  </Avatar>
                }
                action={
                  <div>
                    <IconButton onClick={(e) => setCardMoreOpen(e.currentTarget)} aria-label="settings">
                      <MoreVertIcon />
                    </IconButton>
                    <StyledEngineProvider injectFirst>
                      <Menu
                        elevation={1}
                        id="basic-menu"
                        anchorEl={cardMoreOpen}
                        open={Boolean(cardMoreOpen)}
                        onClose={() => setCardMoreOpen(null)}
                      >
                        <MenuItem key={index} onClick={menuUpdate(index)}>Edit</MenuItem>
                        <MenuItem onClick={() => setCardMoreOpen(null)}>Delete</MenuItem>
                      </Menu>
                    </StyledEngineProvider>
                  </div>
                }
                title={title}
                subheader={time}
              />
              <CardContent>
                {
                  reasons.map(
                    (reason, index) => (
                      reason === 'Other' ?
                        <Typography key={index} variant="body2">
                          {description}
                        </Typography> :
                        <Typography key={index} variant="body2">
                          {reason}
                        </Typography>
                    )
                  )
                }
              </CardContent>
            </Card>

理想情况下,<MenuItem key={index} onClick={menuUpdate(index)}>Edit</MenuItem>内部的menuUpdate(index)可以更新状态变量,因此每个卡组件都与state数组中的每个对象相关联,并且具有更新状态对象的能力。

const menuUpdate = index => e=> {
    console.log(index)
  }

但是,索引始终是状态数组的最后一个索引。我还尝试在onClick、onClick={()=>menuUpdate(index)}和回调函数中使用箭头函数,如

const menuUpdate = (index) => {
    console.log(index)
  }

运气不好。有人能给予吗?困在这里很久了。先谢了!

mkh04yzy

mkh04yzy1#

我自己想出了答案。我需要将卡片提取到另一个组件中,并将索引作为 prop 传递,这样我就可以单独更新它。希望这能有所帮助。

mwkjh3gx

mwkjh3gx2#

函数必须是这样的

const menuUpdate = (index) => {
  console.log(index)
}

和onClick必须是回调函数,以便添加参数

onClick={()=>{menuUpdate(index)}}

相关问题