Reactjs 调用材质ui对话框
如何在删除图标ieReactjs 调用材质ui对话框,reactjs,material-ui,react-hooks,Reactjs,Material Ui,React Hooks,如何在删除图标ieonClick={deletePlayer(id)}上的onClick过程中调用材质UI对话框 我已经在modal/Dialog下添加了Dialog.js并导入到主组件中 我添加了一个演示在主页组件中创建一个状态以处理对话框可见性,在单击时设置状态并有条件地呈现警报对话框: const [openDialog, setOpenDialog] = useState(false); ... const deletePlayer = id => e => { se
onClick={deletePlayer(id)}
上的onClick
过程中调用材质UI对话框
我已经在modal/Dialog
下添加了Dialog.js并导入到主组件中
我添加了一个演示在
主页
组件中创建一个状态以处理对话框可见性,在单击时设置状态并有条件地呈现警报对话框
:
const [openDialog, setOpenDialog] = useState(false);
...
const deletePlayer = id => e => {
setOpenDialog(true);
};
...
return(
...
{openDialog && (
<AlertDialog isOpen={openDialog} setIsOpen={setOpenDialog} />
)}
工作示例:
在
主页
组件中创建一个状态以处理对话框可见性,在单击时设置状态并有条件地呈现警报对话框
:
const [openDialog, setOpenDialog] = useState(false);
...
const deletePlayer = id => e => {
setOpenDialog(true);
};
...
return(
...
{openDialog && (
<AlertDialog isOpen={openDialog} setIsOpen={setOpenDialog} />
)}
工作示例:
简短回答:
长答覆:
首先,您需要将显示/取消逻辑移出AlertDialog
组件,并移入实际触发模式显示的组件(在您的情况下,是Home
组件)。这意味着您将收到open
状态和onClose
处理程序作为道具(以及playerId
,它将保存要删除的玩家的ID)。因此,对话框组件的签名变为:
导出默认函数AlertDialog({open,onClose,playerId}){
返回(
...
);
}
在Home
中,我们添加了跟踪和设置对话框打开/关闭状态以及要删除的播放器ID的逻辑。我们通过useState
来实现这一点:
const[deleteDialog,setDeleteDialog]=useState(false);
const[playerId,setPlayerId]=useState(“”);
通过在播放器映射循环中添加
,您可以拥有与播放器一样多的AlertDialog
组件,但这是多余的,因为您只有一个模式处于活动状态(根据定义)。因此,您所要做的就是将
的单个实例放在主组件中。一个好的约定是将其放置在结束包围标记之前:
返回(
.
.
.
setDeleteDialog(false)}
playerId={playerId}
/>
);
最后,在您的例子中,我们处理负责显示模式的处理程序deletePlayer
。我们有两件事要做:通过playerId
状态变量设置要删除的播放器ID,并通过deleteDialog
状态变量显示模式:
constdeleteplayer=id=>e=>{
setPlayerId(id);
setDeleteDialog(true);
};
简短回答:
长答覆:
首先,您需要将显示/取消逻辑移出AlertDialog
组件,并移入实际触发模式显示的组件(在您的情况下,是Home
组件)。这意味着您将收到open
状态和onClose
处理程序作为道具(以及playerId
,它将保存要删除的玩家的ID)。因此,对话框组件的签名变为:
导出默认函数AlertDialog({open,onClose,playerId}){
返回(
...
);
}
在Home
中,我们添加了跟踪和设置对话框打开/关闭状态以及要删除的播放器ID的逻辑。我们通过useState
来实现这一点:
const[deleteDialog,setDeleteDialog]=useState(false);
const[playerId,setPlayerId]=useState(“”);
通过在播放器映射循环中添加
,您可以拥有与播放器一样多的AlertDialog
组件,但这是多余的,因为您只有一个模式处于活动状态(根据定义)。因此,您所要做的就是将
的单个实例放在主组件中。一个好的约定是将其放置在结束包围标记之前:
返回(
.
.
.
setDeleteDialog(false)}
playerId={playerId}
/>
);
最后,在您的例子中,我们处理负责显示模式的处理程序deletePlayer
。我们有两件事要做:通过playerId
状态变量设置要删除的播放器ID,并通过deleteDialog
状态变量显示模式:
constdeleteplayer=id=>e=>{
setPlayerId(id);
setDeleteDialog(true);
};
保持显示对话框的状态。在单击事件时设置状态创建状态const[open,setOpen]=useState(false)
并在click事件中constdeleteplayer=id=>e=>{alert(“删除此播放器数据!”);setOpen({show:true});}
您应该在deletePlayer中调用setOpen(true)
。保持一个状态以显示对话框。在单击事件时设置状态创建状态const[open,setOpen]=useState(false)
并在click事件中constdeleteplayer=id=>e=>{alert(“删除此播放器数据!”);setOpen({show:true});}
您应该在deletePlayer中调用setOpen(true)
。谢谢您,托马斯,如果我需要通过axios调用服务器,const res=wait axios.delete()http://localhost:8000/service/player/${id}')
我应该在deletePlayer
或Dialog.js中实现它吗?因为它应该在对话框中的Yes上触发…这是正确的。有两种方法可以解决这个问题:要么直接在对话框中执行它,要么在“Yes”按钮内的onClick处理程序中执行它,使用作为道具传递的playerId,或者创建一个带有签名的onDelete
处理程序,如const-onDelete=id=>()=>{axios.delete(…);setDeleteDialog(false);}
,将其作为带有目标id()的属性传递给对话框