使用 React 父组件中的按钮提交表单

IT技术 javascript node.js html reactjs web
2021-04-25 21:35:43

形式模态

所以我必须在模态中实现一个表单,如你所见,模态中的按钮不是表单中的按钮。我将表单创建为模态的子组件。如何使用父组件中的按钮提交表单。我使用React Semantic-UI react 作为我的 UI 框架。

我想如果我可以隐藏表单中的按钮并使用 JavaScript 触发它。我认为这可能是通过 getElementById 来实现的,但是有没有react的方式来做到这一点?

我当前的模态看起来像这样:

<Modal open={this.props.open} onClose={this.props.onClose} size="small" dimmer={"blurring"}>
    <Modal.Header> Edit Activity {this.props.name} </Modal.Header>
    <Modal.Content>
      <ActivityInfoForm/>
    </Modal.Content>
    <Modal.Actions>
        <Button negative onClick={this.props.onClose}>
            Cancel
        </Button>
        <Button positive
                content='Submit'
                onClick={this.makeActivityInfoUpdateHandler(this.props.activityId)} />
    </Modal.Actions>
</Modal>

我的表单代码如下所示:

<Form>
    <Form.Group widths='equal'>
        <Form.Input label='Activity Name' placeholder='eg. CIS 422' />
        <Form.Input label='Activity End Date' placeholder='Pick a Date' />
    </Form.Group>
    <Form.Group widths='equal'>
        <Form.Input label='Total Capacity' placeholder='eg. 30' />
        <Form.Input label='Team Capacity' placeholder='eg. 3' />
    </Form.Group>
</Form>
3个回答

最简单的解决方案是使用HTML 表单属性

将“id”属性添加到您的表单中:id='my-form'

<Form id='my-form'>
                    <Form.Group widths='equal'>
                        <Form.Input label='Activity Name' placeholder='eg. CIS 422' />
                        <Form.Input label='Activity End Date' placeholder='Pick a Date' />
                    </Form.Group>
                    <Form.Group widths='equal'>
                        <Form.Input label='Total Capacity' placeholder='eg. 30' />
                        <Form.Input label='Team Capacity' placeholder='eg. 3' />
                    </Form.Group>
                </Form>

将适当的“表单”属性添加到表单外部所需的按钮:form='my-form'

<Button positive form='my-form' content='Submit' value='Submit'  />

你的makeActivityInfoUpdateHandler功能是什么样的?

我假设您是通过以下方式完成的,然后继续添加更多代码以使其适合您:

1/ 添加ref到您的表单,然后您可以在父级(模态)中访问该表单:

<Modal>

    <Modal.Content>
        <ActivityInfoForm ref="activityForm" />
    </Modal.Content>

</Modal>

2/ 然后在makeActivityInfoUpdateHandler函数中:

makeActivityInfoUpdateHandler = (activityId) => {
    // ...
    this.refs.activityForm.getWrappedInstance().submit();
    // ...

}

上面的代码是你应该做的,如果这还不行,请在这里发布更多细节!

============ 编辑版本如下:(与作者讨论后,我们一起找到了一个好方法!):

现在的想法是把ref按钮放在一个按钮上(这个按钮有type="submit",属于窗体),然后当外面的按钮被点击时,我们只需要调用按钮的“ click()”函数ref[这是一个聪明的想法来自作者本人]

实际上,semantic-ui的组件是一个修改和改进的版本,不再是标准的表单,所以我之前的方式在尝试提交表单时可能不起作用,但是,下面的方式可以工作

代码现在看起来像:

1/ 添加ref到表单上的按钮:

<Form onSubmit={ this.handleSubmit} >
    <button style={{}} type='submit' ref={ (button) => { this.activityFormButton = button } } >Submit</button>
</Form>

2/ 然后在makeActivityInfoUpdateHandler函数中,触发click()上面的按钮:

makeActivityInfoUpdateHandler = (activityId) => {
    // ...
    this.activityFormButton.click();
    // ...

}

所选答案很有用。但是里面的方法好像已经不行了。这就是我如何去做的。

您可以在创建子组件时为其提供 ref。

<ChildComponent ref={this.childComponent}/>

并在按钮的 onClick 方法中使用它。(这是按钮的代码)

<Button variant= "light" onClick={this.onClick}>  
    Submit
</Button>

(这是onClick方法)

onClick = (event) => {
    this.childComponent.current.handleSubmit(event);
}

我正在调用子组件中名为 handleSubmit 的方法。它看起来像这样。

handleSubmit = (event)=> {
    event.preventDefault();

    //Your code here. For example,
    alert("Form submitted");  
}