如何在提交时从React-Bootstrap表单中获取值?

12

我正在尝试使用React-Bootstrap获取表单输入的值。在React功能组件中从React Bootstrap表单获取表单值的标准流程是什么?

export default function SpouseForm() {
  const dispatch = useContext(DispatchContext);

  return (
    <Form>
      <Row>
        <Col xs={12} md={12} lg={{ span: 6, offset: 3 }}>
          <InputGroup className="mb-3">
            <InputGroup.Prepend>
              <InputGroup.Text>Age</InputGroup.Text>
            </InputGroup.Prepend>
            <FormControl /> <--------- I want to get this value on submit /////////////////
      </InputGroup>
        </Col>
      </Row>
      <Row>
        <Col xs={12} md={12} lg={{ span: 6, offset: 3 }}>
          <Button
            onClick={(e) => {
              e.preventDefault()
              dispatch({ type: "SPOUSE_AGE", spouseAge: e.target.value }); < ----- tried to get it here, not working
              router.push('/children')
            }}
            style={{ width: '100%' }}
            type="submit"
            variant="outline-primary"
            size="lg" >Next</Button>{' '}
        </Col>
      </Row>
    </Form>
  )
}
1个回答

26

如果您使用受控组件,则需要实时跟踪其值并将其存储在状态中:

const { useState } = React,
      { render } = ReactDOM,
      { Form , Button } = ReactBootstrap,
      rootNode = document.getElementById('root')

const App = () => {
  const [value, setValue] = useState(),
        onInput = ({target:{value}}) => setValue(value),
        onFormSubmit = e => {
          e.preventDefault()
          console.log(value)
          setValue()
        }
  
  return (
    <Form onSubmit={onFormSubmit}>
      <Form.Control 
        type="text" 
        onChange={onInput} 
        value={value}
      />
      <Button type="submit">
        Submit
      </Button>
    </Form>
  )
}

render (
  <App />,
  rootNode
)
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" /><script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.12.0/umd/react-dom.production.min.js"></script><script src="https://unpkg.com/react-bootstrap@next/dist/react-bootstrap.min.js"></script><div id="root"></div>

另一种方法是使用不受控制的输入框,并在提交时访问FormData

const { useState } = React,
      { render } = ReactDOM,
      { Form , Button } = ReactBootstrap,
      rootNode = document.getElementById('root')

const App = () => {
  const onFormSubmit = e => {
          e.preventDefault()
          const formData = new FormData(e.target),
                formDataObj = Object.fromEntries(formData.entries())
          console.log(formDataObj)
        }
  
  return (
    <Form onSubmit={onFormSubmit}>
      <Form.Control type="text" name="myInput" />
      <Button type="submit">
        Submit
      </Button>
    </Form>
  )
}

render (
  <App />,
  rootNode
)
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" /><script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.12.0/umd/react-dom.production.min.js"></script><script src="https://unpkg.com/react-bootstrap@next/dist/react-bootstrap.min.js"></script><div id="root"></div>


根据React文档:“在大多数情况下,我们建议使用受控组件来实现表单。”。https://reactjs.org/docs/uncontrolled-components.html - java-addict301
1
@java-addict301:虽然我同意并且大多数情况下使用受控输入,但仍然有一些好的用例适合不受控制的输入,你可能因为性能原因而更喜欢它们(例如,如果你需要避免用户输入时的状态更改和重新渲染),这只是一个例子。 - Yevhen Horbunkov
很好的观点@YevgenGorbunkov。作为一个React新手,我不明白为什么首选情况是表单受控组件,正如你指出的那样(性能原因)-我只是引用了reactjs.org。你通常使用未受控制的表单吗? - java-addict301
@YevhenHorbunkov FormData类/对象来自哪里? - Itay Moav -Malimovka
@ItayMoav-Malimovka 这是一个标准的Web API - Yevhen Horbunkov
谢谢!!!我不知道FormData是个东西!!!另外,你应该给所有的表单标签一个名称。这样它会为你提供一个很好的JSON来处理!!!!! - boardkeystown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接