I have the code below for a React Native app using Javascript and Im creating an array of objects that are data for a context menu.
When the user selects a project from the menu it should call handleSelectedProject which it does and pass the selected project object but I get undefined for the project variable.
Any ideas what the syntax should be to get the selected project object.
Thanks in advance.
export default MobileMenu = () => {
const projects = useSelector(getPickerList);
const [menuItems, setMenuItems] = useState([]);
useEffect(() => {
loadMenuItems();
}, [projects]);
const handleNewProject = () => {
console.info("New Project");
};
const handleSelectedProject = (project) => {
console.info("Project...", project);
};
const loadMenuItems = () => {
let items = [];
items.push({
label: "New Project",
onPress: handleNewProject,
seperator: false,
});
items.push({ seperator: true });
for (var i = 0; i < projects.length; i++) {
items.push({
label: projects[i].project_name,
onPress: () => handleSelectedProject(projects[i]),
seperator: false,
});
}
setMenuItems(items);
};
return (
<ScrollView>
<View style={styles.container}>
<ContextMenu items={menuItems} />
</View>
</ScrollView>
);
};
Advertisement
Answer
The problem is with your for loop. The onPress callback will reference the loop variable when the loop is already finished, at which time i is out of range, so projects[i] will evaluate to undefined.
The easy solution is to use a block scoped variable i, so that projects[i] really references the variable that was created for that loop’s iteration specifically. You do this by replacing var i with let i.