javascript - react : Edit and Delete from a pop-up menu on a list item

标签 javascript reactjs material-ui

我有一个列表容器组件,它是父级。它映射出列表行。在列表行组件(即子项)上,每个项目都有一个用于切换弹出菜单的按钮,该菜单有一个用于编辑的按钮和一个用于删除的按钮。菜单本身是列表行的兄弟,因为如果我将它包含在列表行组件中,每一行都会呈现一个菜单,并且在切换时,它们都会相互叠加。编辑和删除按钮可以切换表单进行编辑,或者直接删除项目。
我目前拥有的是:

// Parent / Container

  const [itemID, setItemID] = useState(null);

  const handleMenuOpen = (id) => (e) => {
    setAnchorEl(e.currentTarget); // for menu placement
    setItemID(id);
  };

  const handleItemDelete = () => {
    dispatch(deleteItem(itemID));
  };

<List>
  <ListRow handleMenuOpen={handleMenuOpen} />
  <Menu handleItemDelete={handleItemDelete}  itemID={itemID} />
</List>;


// List Row

<Button onClick={handleMenuOpen(item.id)} />;

// Menu

<MenuItem onClick={() => handleModalOpen(itemID)} />;

<MenuItem onClick={() => handleItemDelete()} />;
编辑按钮工作正常,但无论我如何尝试,我都无法从列表项的 onClick 中获取 setItemID。它总是作为 null 的初始值出现。我在控制台记录了函数参数中的 ID 正确显示,但 setState Hook 不起作用。
我尝试将 useState 放在列表项上并通过 useContext 传递 ID,但在调用handledItemDelete 时出现未定义。
我尝试在 child 上使用 ref 从 parent 那里获取 ID,这也是未定义的。
我想不出如何使用 useEffect 来检查 handleMenuOpen 参数的变化。
我没主意了。任何人都知道问题是什么以及如何解决它?

最佳答案

您可能应该只传递 handleMenuOpen 函数并依赖所选元素,然后将其 id 存储在 itemID 变量中。

const handleMenuOpen = (e) => {
    setAnchorEl(e.currentTarget); // for menu placement
    setItemID(e.currentTarget.id);
};
  
  
<MenuItem onClick={handleMenuOpen} />;

关于javascript - react : Edit and Delete from a pop-up menu on a list item,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65343246/

相关文章:

javascript - 使用 React 的 Material UI

javascript - jquery jTable 中的表单布局?

javascript - 如何使用 Postman 测试 Passport.js 的基本承载策略

javascript - 从 C# 检索多个值到 JavaScript

javascript - 在 Create React App 中设置导入的全局服务

reactjs - 使用 Next.js 和 Material-UI 首次加载时未应用样式

javascript - ReactJS 中未处理的拒绝

javascript - 如何使用 JavaScript 查找并替换 HTML DOM 元素中的字符串

javascript - 直接键访问和对象解构之间的性能

javascript - Redux Action 调度不起作用