【问题标题】:Is it possible to use button click event to trigger form submit in React?是否可以使用按钮单击事件来触发 React 中的表单提交?
【发布时间】:2020-05-13 05:01:26
【问题描述】:

是否可以在 React 中使用常规按钮组件上的点击事件来触发点击隐藏的表单提交按钮/提交所有表单值和更新索引不变的表单?

我有一个包含一系列步骤(如向导)的应用程序,并且每个步骤中的表单都有自己的隐藏提交按钮。当ButtonNext(和最后一步的ButtonFinal)被点击时,有没有办法触发点击隐藏的表单提交按钮,以便onSubmit运行,然后将表单值和索引值发送到@ 987654324@函数?

我可能可以使用data-key 属性访问隐藏的提交按钮。

编辑:ButtonNextButtonFinal 是 DOM 中表单的直接兄弟,不能添加到表单中。

import React, { useState } from 'react'
import { Row, Col } from 'react-styled-flexboxgrid'
import { Form, ButtonNext, ButtonPrevious, ButtonFinal } from './style'

const Application = ({ steps }) => {
  const [currentStepNum, setCurrentStepNum] = useState(0)
  const [previousStepName, setPreviousStepName] = useState(steps[0].step_name)
  const [nextStepName, setNextStepName] = useState(steps[1].step_name)
  const [formValues, setFormValues] = useState(null)

  const handleSubmit = (values, step) => {
    setFormValues(values)
    setStep(step)
  }

  const handleClick = (event, step) => {
    event.preventDefault()
    setStep(step)
  }

  const setStep = step => {
    step = parseInt(step)
    setCurrentStepNum(step)

    if (step > 0) {
      setPreviousStepName(steps[step - 1].step_name)
    }

    if (step < steps.length - 1) {
      setNextStepName(steps[step + 1].step_name)
    }
  }

  return (
    <>
      <div>
        {steps.map((step, index) => {
          return (
            <div key={index}>
              {currentStepNum == index && (
                <>
                  {step.form.length > 0 && (
                    <Form
                      action="/"
                      fields={fields}
                      onSubmit={(values) => {
                        handleSubmit(values, [index + 1])
                      }}
                    />
                  )}
                  {index > 0 && (
                    <ButtonPrevious
                      onClick={event => {
                        handleClick(event, [index - 1])
                      }}
                    >
                      Back to {previousStepName}
                    </ButtonPrevious>
                  )}
                  {index < steps.length - 1 && (
                    <ButtonNext
                      onClick={Trigger onSubmit here}
                    >
                      Next: {nextStepName}
                    </ButtonNext>
                  )}
                  {index == steps.length - 1 && (
                    <ButtonFinal
                     onClick={Trigger onSubmit here}
                    >
                      FINAL SUBMIT BUTTON PLACEHOLDER
                    </ButtonFinal>
                  )}
                </>
              )}
            </div>
          )
        })}
      </div>
    </>
  )
}

export default Application

【问题讨论】:

    标签: javascript reactjs forms


    【解决方案1】:

    如果您有一个设置了 onSubmit 的表单元素,那么默认情况下该表单中的任何按钮都会提交该表单。您可以通过为该按钮定义 onClick 函数并在传递的事件上调用 preventDefault() 来禁用此默认行为。

    【讨论】:

    • 你好。这种方法的唯一问题是我无法将子组件添加到表单组件。 ButtonNext 和 ButtonFinal 作为表单的兄弟存在。
    【解决方案2】:

    是的!你可以用与纯 HTML 类似的方式在 React 中做到这一点。

    https://reactjs.org/docs/forms.html

    class NameForm extends React.Component {
      constructor(props) {
      super(props);
      this.state = {value: ''};
    
      this.handleChange = this.handleChange.bind(this);
      this.handleSubmit = this.handleSubmit.bind(this);
      }
    
    handleChange(event) {
      this.setState({value: event.target.value});
    }
    
    handleSubmit(event) {
      alert('A name was submitted: ' + this.state.value);
      event.preventDefault();
    }
    
    render() {
      return (
        <form onSubmit={this.handleSubmit}>
          <label>
            Name:
            <input type="text" value={this.state.value} onChange={this.handleChange} />
            </label>
          <input type="submit" value="Submit" />
        </form>
      );
    }}
    

    这样 将成为您的提交按钮,您只需将 handleSubmit 函数传递给表单标签,

    【讨论】:

    • 你好。这种方法的唯一问题是我无法将子组件添加到表单组件。 ButtonNext 和 ButtonFinal 作为表单的兄弟存在。
    【解决方案3】:

    您可以在原版 HTML 中执行此操作,应该在 React 中工作。点击按钮应该会自动触发表单提交事件

    <button type="submit">...</button>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多