Reactjs 在React中管理对话框的最佳方法

Reactjs 在React中管理对话框的最佳方法,reactjs,modal-dialog,material-ui,react-hooks,Reactjs,Modal Dialog,Material Ui,React Hooks,我想知道是否有更好的方法来管理功能组件中对话框的打开和关闭?您可以在下面找到一个示例: import React, { useState } from 'react'; import PropTypes from 'prop-types'; import EditDialog from './EditDialog'; import DeleteDialog from './DeleteDialog'; const ContactCard = ({ contact }) => {

我想知道是否有更好的方法来管理功能组件中对话框的打开和关闭?您可以在下面找到一个示例:

import React, { useState } from 'react';
import PropTypes from 'prop-types';

import EditDialog from './EditDialog';
import DeleteDialog from './DeleteDialog';


const ContactCard = ({ contact }) => {
  const [editOpen, setEditOpen] = useState(false);
  const [deleteOpen, setDeleteOpen] = useState(false);

  const handleEditOpen = () => {
    setEditOpen(true);
  };
  const handleEditClose = () => {
    setEditOpen(false);
  };
  const handleDeleteOpen = () => {
    setDeleteOpen(true);
  };
  const handleDeleteClose = () => {
    setDeleteOpen(false);
  };

  const { type, firstName, lastName, phoneNumber, mail } = contact;
  return (
    <>
      <div className={classes.main}>
        {/* All my contact informations */}
      </div>
      <EditDialog handleClose={handleEditClose} open={editOpen} />
      <DeleteDialog handleClose={handleDeleteClose} open={deleteOpen} />
    </>
  );
};

ContactCard.propTypes = {
  contact: PropTypes.object.isRequired
};

export default ContactCard;

非常感谢您的时间和建议

打开对话框的责任应由主要组件承担。这样,仅当state属性为true时才渲染模态。 另一个技巧是使用
安装

import React,{useState}来自“React”;
从“道具类型”导入道具类型;
从“/EditDialog”导入EditDialog;
从“/DeleteDialog”导入DeleteDialog;
const ContactCard=({contact})=>{
const[editOpen,setEditOpen]=useState(false);
const[deleteOpen,setDeleteOpen]=useState(false);
常量handleEditOpen=()=>{
setEditOpen(!editOpen);
};
常量handleDeleteOpen=()=>{
setDeleteOpen(!deleteOpen);
};
const{type,firstName,lastName,phoneNumber,mail}=联系人;
返回(
{/*我的所有联系信息*/}
{
editOpen&
}
{
删除打开&
}
);
};
ContactCard.propTypes={
联系人:PropTypes.object.isRequired
};
导出默认联系人卡;

为了减少代码的冗余,您可以通过切换当前状态,在一个函数中设置打开/关闭。我做了内联操作,但您仍然可以创建handleEdit函数并在那里切换状态

import React, {useState} from "react";
import ReactDOM from "react-dom";

function App() {
  const [editCard, setEditCard] = useState(false)
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <button onClick={() => setEditCard(!editCard)}>Toggle Edit</button>
      {editCard && <div>Card is open for editing</div>}
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

import React,{useState}来自“React”;
从“react dom”导入react dom;
函数App(){
const[editCard,setEditCard]=useState(false)
返回(
你好,代码沙盒
开始编辑,看看神奇的发生!
setEditCard(!editCard)}>切换编辑
{editCard&&Card已打开进行编辑}
);
}
const rootElement=document.getElementById(“根”);
render(,rootElement);
下面是另一个代码示例。我没有运行它,但它应该看起来像这样

import React, { useState } from 'react';
import PropTypes from 'prop-types';
import EditDialog from './EditDialog';
import DeleteDialog from './DeleteDialog';


const ContactCard = ({ contact }) => {
  const [editOpen, setEditOpen] = useState(false);
  const [deleteOpen, setDeleteOpen] = useState(false);

  const handleEdit = () => {
    setEditOpen(!editOpen);
  };

  const handleDelete = () => {
    setDeleteOpen(!deleteOpen);
  };

  const { type, firstName, lastName, phoneNumber, mail } = contact;
  return (
    <>
      <div className={classes.main}>
        {/* All my contact informations */}
      </div>
      {
         editOpen && <EditDialog handleEdit={handleEdit} />
      }
      {
        deleteOpen && <DeleteDialog handleClose={handleClose} /> 
      }
    </>
  );
};

ContactCard.propTypes = {
  contact: PropTypes.object.isRequired
};

export default ContactCard;
import React,{useState}来自“React”;
从“道具类型”导入道具类型;
从“/EditDialog”导入EditDialog;
从“/DeleteDialog”导入DeleteDialog;
const ContactCard=({contact})=>{
const[editOpen,setEditOpen]=useState(false);
const[deleteOpen,setDeleteOpen]=useState(false);
常量handleEdit=()=>{
setEditOpen(!editOpen);
};
常量handleDelete=()=>{
setDeleteOpen(!deleteOpen);
};
const{type,firstName,lastName,phoneNumber,mail}=联系人;
返回(
{/*我的所有联系信息*/}
{
editOpen&
}
{
删除打开&
}
);
};
ContactCard.propTypes={
联系人:PropTypes.object.isRequired
};
导出默认联系人卡;

这并没有解决如何避免使用额外的样板代码来管理每个对话框的状态的问题。
import React, {useState} from "react";
import ReactDOM from "react-dom";

function App() {
  const [editCard, setEditCard] = useState(false)
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <button onClick={() => setEditCard(!editCard)}>Toggle Edit</button>
      {editCard && <div>Card is open for editing</div>}
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

import React, { useState } from 'react';
import PropTypes from 'prop-types';
import EditDialog from './EditDialog';
import DeleteDialog from './DeleteDialog';


const ContactCard = ({ contact }) => {
  const [editOpen, setEditOpen] = useState(false);
  const [deleteOpen, setDeleteOpen] = useState(false);

  const handleEdit = () => {
    setEditOpen(!editOpen);
  };

  const handleDelete = () => {
    setDeleteOpen(!deleteOpen);
  };

  const { type, firstName, lastName, phoneNumber, mail } = contact;
  return (
    <>
      <div className={classes.main}>
        {/* All my contact informations */}
      </div>
      {
         editOpen && <EditDialog handleEdit={handleEdit} />
      }
      {
        deleteOpen && <DeleteDialog handleClose={handleClose} /> 
      }
    </>
  );
};

ContactCard.propTypes = {
  contact: PropTypes.object.isRequired
};

export default ContactCard;