从子组件调用 React 中的函数
Call a function in React from child component
在组件内部,有一个用于创建多个元素的映射。单击按钮可以删除每个元素:
const ParentComponent = () => {
...
const [fields, setFields] = useState([{value: 'a', editable: false},
[{value: 'b', editable: true},
[{value: 'c', editable: false}]);
const handleRemoveField = (id) => {
const values = [...fields];
values.splice(id, 1);
setFields(values);
}
...
return (
...
{fields.map((field, id) => {
return (
<div>
...
<button onClick={() => handleRemoveField(id)}>delete</button>
</div>
);
})}
...
);
以上代码运行良好。当删除部分必须从模态组件而不是直接单击按钮来完成时,问题就出现了。
所以我创建了一个新的模态组件:
const DeleteModal = ({ isDeleteModalOpen, closeDeleteModal }) => {
return (
<Modal isOpen={isDeleteModalOpen}>
<ModalTitle handleClose={closeDeleteModal} />
<button onClick={deleteElement}> OK </button>
<button onClick={closeDeleteModal}> cancel </button>
</Modal>
);
};
并在 ParentComponent
中导入了 DeleteModal
。调用 handleRemoveField
时,不是直接删除元素,而是打开模式。
我不知道该怎么做的是在单击模态的确定按钮时删除 de 元素(deleteElement
模态的函数应该这样做)。
修改后的父组件:
const ParentComponent = () => {
...
const [fields, setFields] = useState([{value: 'a', editable: false},
[{value: 'b', editable: true},
[{value: 'c', editable: false}]);
const handleRemoveField = (id) => { // modified the method to call modal
openDeleteModal(id);
};
// added for open/close modal
const [isDeleteModalOpen, setDeleteModalOpen] = useState(false);
const openDeleteModal = () => {
setDeleteModalOpen(true);
};
const closeDeleteModal = () => setDeleteModalOpen(false);
...
return (
...
{fields.map((field, id) => {
return (
<div>
...
<button onClick={() => handleRemoveField(id)}>delete</button>
// imported modal here:
<DeleteModal
isDeleteModalOpen={isDeleteModalOpen}
closeDeleteModal={closeDeleteModal} />
</div>
);
})}
...
);
取消按钮起作用了,它关闭了模式。问题出在必须删除元素的确定按钮上。
如何做到?
您使用变量来保存要删除的项目
const [itemDel,setItemDel] = React.useState(null);
然后,当点击编辑显示模态时,将该项目设置为 itemDel(在 handleRemoveField 函数中)
类似
return (
<>
{fields.map((field, id) => {
return (
<div>
...
<button onClick={() => handleRemoveField(id)}>delete</button>
</div>
);
})}
{
!!itemDel&& <DeleteModal
isDeleteModalOpen={isDeleteModalOpen}
closeDeleteModal={closeDeleteModal} />
}
</>
);
并且,当你完成后,或者想隐藏模态,只需调用 setItemDel(null)
您可以向 Modal
组件添加一个新道具,也许类似于 onDelete
。比你可以传递一个删除你的元素的方法到 Modal
像这样:
<Modal
isDeleteModalOpen={isDeleteModalOpen}
closeDeleteModal={closeDeleteModal}
onDelete={() => deleteElement(id)}
/>
在你的 Modal
组件中你可以调用你的 onDelete
属性来调用 deleteElement(id)
:
const DeleteModal = ({ isDeleteModalOpen, closeDeleteModal, onDelete }) => {
return (
<Modal isOpen={isDeleteModalOpen}>
<ModalTitle handleClose={closeDeleteModal} />
<button onClick={onDelete}> OK </button>
<button onClick={closeDeleteModal}> cancel </button>
</Modal>
);
};
长话短说:您可以使用子组件传递一个方法以从那里调用它。
您可以在打开模态之前保存要删除的ID,并使用它来决定模态是否可见。
const [idToDelete, setIdToDelete] = useState(null);
const handleRemoveField = (id) => {
setIdToDelete(id);
};
...
<DeleteModal isDeleteModalOpen={idToDelete !== null} closeDeleteModal={closeDeleteModal} />
在组件内部,有一个用于创建多个元素的映射。单击按钮可以删除每个元素:
const ParentComponent = () => {
...
const [fields, setFields] = useState([{value: 'a', editable: false},
[{value: 'b', editable: true},
[{value: 'c', editable: false}]);
const handleRemoveField = (id) => {
const values = [...fields];
values.splice(id, 1);
setFields(values);
}
...
return (
...
{fields.map((field, id) => {
return (
<div>
...
<button onClick={() => handleRemoveField(id)}>delete</button>
</div>
);
})}
...
);
以上代码运行良好。当删除部分必须从模态组件而不是直接单击按钮来完成时,问题就出现了。
所以我创建了一个新的模态组件:
const DeleteModal = ({ isDeleteModalOpen, closeDeleteModal }) => {
return (
<Modal isOpen={isDeleteModalOpen}>
<ModalTitle handleClose={closeDeleteModal} />
<button onClick={deleteElement}> OK </button>
<button onClick={closeDeleteModal}> cancel </button>
</Modal>
);
};
并在 ParentComponent
中导入了 DeleteModal
。调用 handleRemoveField
时,不是直接删除元素,而是打开模式。
我不知道该怎么做的是在单击模态的确定按钮时删除 de 元素(deleteElement
模态的函数应该这样做)。
修改后的父组件:
const ParentComponent = () => {
...
const [fields, setFields] = useState([{value: 'a', editable: false},
[{value: 'b', editable: true},
[{value: 'c', editable: false}]);
const handleRemoveField = (id) => { // modified the method to call modal
openDeleteModal(id);
};
// added for open/close modal
const [isDeleteModalOpen, setDeleteModalOpen] = useState(false);
const openDeleteModal = () => {
setDeleteModalOpen(true);
};
const closeDeleteModal = () => setDeleteModalOpen(false);
...
return (
...
{fields.map((field, id) => {
return (
<div>
...
<button onClick={() => handleRemoveField(id)}>delete</button>
// imported modal here:
<DeleteModal
isDeleteModalOpen={isDeleteModalOpen}
closeDeleteModal={closeDeleteModal} />
</div>
);
})}
...
);
取消按钮起作用了,它关闭了模式。问题出在必须删除元素的确定按钮上。
如何做到?
您使用变量来保存要删除的项目
const [itemDel,setItemDel] = React.useState(null);
然后,当点击编辑显示模态时,将该项目设置为 itemDel(在 handleRemoveField 函数中)
类似
return (
<>
{fields.map((field, id) => {
return (
<div>
...
<button onClick={() => handleRemoveField(id)}>delete</button>
</div>
);
})}
{
!!itemDel&& <DeleteModal
isDeleteModalOpen={isDeleteModalOpen}
closeDeleteModal={closeDeleteModal} />
}
</>
);
并且,当你完成后,或者想隐藏模态,只需调用 setItemDel(null)
您可以向 Modal
组件添加一个新道具,也许类似于 onDelete
。比你可以传递一个删除你的元素的方法到 Modal
像这样:
<Modal
isDeleteModalOpen={isDeleteModalOpen}
closeDeleteModal={closeDeleteModal}
onDelete={() => deleteElement(id)}
/>
在你的 Modal
组件中你可以调用你的 onDelete
属性来调用 deleteElement(id)
:
const DeleteModal = ({ isDeleteModalOpen, closeDeleteModal, onDelete }) => {
return (
<Modal isOpen={isDeleteModalOpen}>
<ModalTitle handleClose={closeDeleteModal} />
<button onClick={onDelete}> OK </button>
<button onClick={closeDeleteModal}> cancel </button>
</Modal>
);
};
长话短说:您可以使用子组件传递一个方法以从那里调用它。
您可以在打开模态之前保存要删除的ID,并使用它来决定模态是否可见。
const [idToDelete, setIdToDelete] = useState(null);
const handleRemoveField = (id) => {
setIdToDelete(id);
};
...
<DeleteModal isDeleteModalOpen={idToDelete !== null} closeDeleteModal={closeDeleteModal} />