I have this component and I want to be able to call a function with a given item id, but the problem is that when I call cancelItem with given parameter, it always returns the id of the last item from the array. I think it has something to do with the scope, but I cannot think of a solution.
Edit 1: Uploaded a minimal reproducible example
import * as React from "react";
import {
Typography,
Button,
Dialog,
DialogActions,
DialogContent,
DialogContentText,
DialogTitle,
ListItem,
ListItemText,
ListItemButton,
Box
} from "@mui/material";
interface IItem {
item_id: number;
name: string;
}
interface ItemEditModel {
itemId: number;
}
let items: IItem[] = [
{ item_id: 0, name: "first item" },
{ item_id: 1, name: "second item" },
{ item_id: 3, name: "third item" }
];
export default function App() {
const [open, setOpen] = React.useState(false);
const cancelItem = (item_id: number) => {
let newItem: ItemEditModel = { itemId: item_id };
console.log(newItem);
setOpen(false);
// do cancel item
};
const handleClickOpen = () => {
setOpen(true);
};
const handleClose = () => {
setOpen(false);
};
return (
<>
{items.map((item: IItem, index: number) => (
<Box key={index}>
<ListItem>
<Typography>
{" "}
<b>Item {item.name}</b>
</Typography>
<ListItemButton onClick={handleClickOpen}>
<ListItemText primary="Cancel" />
</ListItemButton>
<Dialog
open={open}
onClose={handleClose}
aria-labelledby="alert-dialog-title"
aria-describedby="alert-dialog-description"
>
<DialogTitle id="alert-dialog-title">Cancel</DialogTitle>
<DialogContent>
<DialogContentText id="alert-dialog-description">
Are you sure?
</DialogContentText>
</DialogContent>
<DialogActions>
<Button variant="contained" onClick={handleClose}>
No
</Button>
<Button
variant="contained"
onClick={() => cancelItem(item.item_id)}
autoFocus
>
Yes
</Button>
</DialogActions>
</Dialog>
<ListItemButton onClick={() => console.log(item.item_id)}>
<ListItemText primary="Edit" />
</ListItemButton>
</ListItem>
</Box>
))}
</>
);
}
Here is a link to a sandbox.