React 表单

就像在 HTML 中一样,React 使用表单允许用户与网页交互。


React 中添加表单

您可以添加一个与任何其他元素一样使用 React 的表单:

实例:

添加允许用户输入其姓名的表单:

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. function MyForm() {
  4. return (
  5. <form>
  6. <label>Enter your name:
  7. <input type="text" />
  8. </label>
  9. </form>
  10. )
  11. }
  12. ReactDOM.render(<MyForm />, document.getElementById('root'));

这将正常工作,表单将提交,页面将刷新。

但这通常不是我们希望在 React 中发生的事情。

我们希望防止这种默认行为,并让 React 控制表单。


处理表格

处理表单是关于当数据更改值或被提交时如何处理数据。

在 HTML 中,表单数据通常由 DOM 处理。

在 React 中,表单数据通常由组件处理。

当数据由组件处理时,所有数据都存储在组件状态中。

可以通过在 onChange 属性中添加事件处理程序来控制更改。

我们可以使用 useState 钩子跟踪每个输入值,并为整个应用程序提供 "单一真实来源"。

查看 React Hooks ,学习更多的钩子知识。

实例:

使用 onChange 钩子管理输入框:

  1. import { useState } from "react";
  2. import ReactDOM from 'react-dom';
  3. function MyForm() {
  4. const [name, setName] = useState("");
  5. return (
  6. <form>
  7. <label>Enter your name:
  8. <input
  9. type="text"
  10. value={name}
  11. onChange={(e) => setName(e.target.value)}
  12. />
  13. </label>
  14. </form>
  15. )
  16. }
  17. ReactDOM.render(<MyForm />, document.getElementById('root'));

提交表单

您可以通过在 <form>onSubmit 属性中添加事件处理程序来控制提交操作:

实例:

onSubmit 属性中添加提交按钮和事件处理程序:

  1. import { useState } from "react";
  2. import ReactDOM from 'react-dom';
  3. function MyForm() {
  4. const [name, setName] = useState("");
  5. const handleSubmit = (event) => {
  6. event.preventDefault();
  7. alert('The name you entered was: ${name}');
  8. }
  9. return (
  10. <form onSubmit={handleSubmit}>
  11. <label>Enter your name:
  12. <input
  13. type="text"
  14. value={name}
  15. onChange={(e) => setName(e.target.value)}
  16. />
  17. </label>
  18. <input type="submit" />
  19. </form>
  20. )
  21. }
  22. ReactDOM.render(<MyForm />, document.getElementById('root'));

多个输入字段

您可以通过向每个元素添加名称属性,控制多个输入字段的值。

我们将用一个空对象初始化我们的状态。

要访问事件处理程序中的字段,请使用 event.target.nameevent.target.value 语法。

实例:

编写一个包含两个输入字段的表单:

  1. import { useState } from "react";
  2. import ReactDOM from "react-dom";
  3. function MyForm() {
  4. const [inputs, setInputs] = useState({});
  5. const handleChange = (event) => {
  6. const name = event.target.name;
  7. const value = event.target.value;
  8. setInputs(values => ({...values, [name]: value}))
  9. }
  10. const handleSubmit = (event) => {
  11. event.preventDefault();
  12. console.log(inputs);
  13. }
  14. return (
  15. <form onSubmit={handleSubmit}>
  16. <label>Enter your name:
  17. <input
  18. type="text"
  19. name="username"
  20. value={inputs.username || ""}
  21. onChange={handleChange}
  22. />
  23. </label>
  24. <label>Enter your age:
  25. <input
  26. type="number"
  27. name="age"
  28. value={inputs.age || ""}
  29. onChange={handleChange}
  30. />
  31. </label>
  32. <input type="submit" />
  33. </form>
  34. )
  35. }
  36. ReactDOM.render(<MyForm />, document.getElementById('root'));
注意:我们对两个输入字段使用相同的事件处理程序函数,我们可以为每个字段编写一个事件处理程序,但这给了我们更清晰的代码,是 React 中的首选方法。

Textarea

React 中的 textarea 元素与普通 HTML 略有不同。在 HTML 中,textarea 的值是开始标记<textarea> 和结束标记 </textarea> 之间的文本。

  1. <textarea> Content of the textarea.</textarea>

在 React 中,textarea 的值放置在 value 属性中。我们将使用 useState 钩子管理textarea 的值::

实例:

包含一些内容的简单文本区域:

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. class MyForm extends React.Component {
  4. constructor(props) {
  5. super(props);
  6. this.state = {
  7. description: 'The content of a textarea goes in the value attribute'
  8. };
  9. }
  10. render() {
  11. return (
  12. <form>
  13. <textarea value={this.state.description} />
  14. </form>
  15. );
  16. }
  17. }
  18. ReactDOM.render(<MyForm />, document.getElementById('root'));

Select

React 中的下拉列表或选择框与 HTML 也有点不同。

在 HTML 中,下拉列表中的选定值是用 selected 选定的属性定义的:

HTML:
  1. <select>
  2. <option value="Ford">Ford</option>
  3. <option value="Volvo" selected>Volvo</option>
  4. <option value="Fiat">Fiat</option>
  5. </select>

在 React 中,所选值由 select 标记上的 value 属性定义:

实例:

一个简单的选择框,其中选择的值 "Volvo" 在构造函数中初始化:

  1. import { useState } from "react";
  2. import ReactDOM from "react-dom";
  3. function MyForm() {
  4. const [myCar, setMyCar] = useState("Volvo");
  5. const handleChange = (event) => {
  6. setMyCar(event.target.value)
  7. }
  8. return (
  9. <form>
  10. <select value={myCar} onChange={handleChange}>
  11. <option value="Ford">Ford</option>
  12. <option value="Volvo">Volvo</option>
  13. <option value="Fiat">Fiat</option>
  14. </select>
  15. </form>
  16. )
  17. }
  18. ReactDOM.render(<MyForm />, document.getElementById('root'));

通过对 <textarea><select> 进行这些细微的更改,React 能够以相同的方式处理所有输入元素。