从 action-react 调用组件

call a component from an action- react

我在我的应用程序中使用功能组件,最初它有一个包含很多代码的组件,我将它分成 3 个以便能够更好地组织代码并具有可重用的组件,第一个包含 <MaterialTable>, 第二个 <dialog> 和第三个 <form>.

在table所在的组件中导入<dialog>,在<dialog>组件中导入<form>,这样表单就在对话框里面了以及我想发送给它的对话框,以便从板的操作中调用。

问题是在操作中添加组件时出现以下错误

Expected an assignment or function call and instead saw an expression

如何从 table 中的操作打开组件?

Table

export default function User(){ 

const[user, setUser]= useState({Users:[]});

 useEffect(()=>{
    const getUser=async()=>{
            const response =await axios.get('/api/users');
            setUser(response.data);
            console.log(response.data)
    }
    getUser();
},[]);

return(
<div>
     <MaterialTable
         title="Users"
         columns={[
             { title: 'Code', field: 'code' , type: 'numeric'},
             { title: 'Name', field: 'name' },
             { title: 'Lastname', field: 'lastname' },
             { title: 'Age', field: 'age', type: 'numeric'},
         ]}
         data={user.Users}
actions={[   
    {
      icon: 'event',
      tooltip: 'Agregar cita', 
      onClick:(event, rowData)=>{
        //event.preventDefault();

        <Dialogs/>

     }
    }
  ]} 
         />
 </div>
        );
        }

对话框

function Dialogs(){
    const [open, setOpen] = useState(false);

    const handleClickOpen = () => {
      setOpen(true);
    };

    const handleClose = () => {
      setOpen(false);
    };
    return(
        <div>
                      <Dialog open={open} onClose={handleClose} aria-labelledby="form-dialog-title">
                      <DialogTitle id="form-dialog-title">Subscription></DialogTitle>
                          <DialogContent>
                              <DialogContentText>
                                  Subscription
                              </DialogContentText>
                    <AddSuscription/>
                          </DialogContent>
                      <DialogActions>
                        <Button onClick={handleClose} color="primary">
                          Cancel
                        </Button>
                      </DialogActions>
                    </Dialog>
        </div>
    )
}
export default Dialogs; 

表格

export default function AddSuscription(props){

    const initialState={code:0, email:'', alias:''}

    const[subscription, setSubscription]=useState(initialState);

    const handleChange=(event)=>{
        setSubscription({...subscription,[event.target.name]:event.target.value})
    }

    const handleSubmit=(event)=>{

        event.preventDefault();

        if(!subscription.code || !subscription.email || !subscription.alias) 
            return
                const postSubscription=async()=>{
                    try {
                        axios.post('/api/Subscription/add',subscription);
                        props.history.push('/Subscription'); 
                    }
                    catch (error) {
                        console.log('error', error);
                    }
                }
                postSubscription();
    } 
return(
<div> 
                                  <form onSubmit={handleSubmit} >
                                      <TextField
                                          id="filled-name"
                                          name="code"
                                          label="Code"
                                          value={subscription.code}
                                          onChange={handleChange}
                                          margin="normal"
                                      />
                                      <TextField
                                          id="filled-name"
                                          label="Email"
                                          value={subscription.email}
                                          name="email"
                                          onChange={handleChange}
                                          margin="normal"
                                      />
                                      <TextField
                                          id="filled-multiline-static"
                                          label="Alias"
                                          value={subscription.alias}
                                          name="alias"
                                          onChange={handleChange}
                                          margin="normal"
                                      />
                                      <Button
                                          variant="contained"
                                          color="primary"
                                          type="submit">
                                          Add
                                      </Button>
                                  </form>
<div> 
);
}
onClick:(event, rowData)=>{
    <Dialogs/>
 }

您不能从这样的事件处理程序中呈现。您希望该组件出现在哪里? React 不能那样工作。

相反,保留一些状态,更改该状态(自动重新呈现您的组件),然后根据该状态有条件地呈现您想要的内容。

像这样:

向需要渲染对话框的主要组件添加状态:

export default function User() { 
  const [showDialog, setShowDialog] = useState(false)
  //...

更改您的事件处理程序以更改该状态

onClick:(event, rowData)=>{
  setShowDialog(true)
}

并且在您的主渲染中,有条件地渲染 <Dialogs> 组件。

return(

<div>
    {showDialog && <Dialogs/>}
    <MaterialTable
      {/* ... */}
    />