# 13.表单处理

# 1.受控组件

  • HTML的表单元素是可输入的, 也就是有自己的可变状态
  • 而, React中可变状态通常保存在state中, 并且只能通过setState()方法来修改
  • React将state与表单元素值value绑定在一起, 由state的值来控制表单元素的值
xcooo

步骤:

  1. 在state 中添加一个状态, 作为表单元素的value值 (控制表单元素值的来源)
  2. 给表单元素绑定change事件, 将表单元素的值设置为 state 的值(控制表单元素值的变化)
xcooo

示例:

1.文本框, 富文本框, 下拉框 操作value属性

2.复选框 操作checked属性

class Input extends React.Component {
  // 简化语法
  state = {
    txt: '',
    content: '',
    city: 'bj',
    isChecked: false
  }
  // 处理文本框的变化
  handleChange = e => {
    this.setState({
      txt: e.target.value
    })
  }
  // 处理富文本框的变化
  handleContent = e => {
    this.setState({
      content:e.target.value
    })
  }
  // 处理下拉框的变化
  handleCity = e => {
    this.setState({
      city:e.target.value
    })
  }
  // 处理复选框的变化
  handleChecked = e => {
    this.setState({
      isChecked: e.target.checked
    })
  }
  render() {
    return (
      <div>
        {/* 文本框 */}
        <input value={this.state.txt} onChange={this.handleChange} />
        <br/>

        {/* 富文本框 */}
        <textarea value={this.state.content} onChange={this.handleContent}></textarea>
        <br/>

        {/* 下拉框 */}
        <select value={this.state.city} onChange={this.handleCity}>
          <option value="sh">上海</option>
          <option value="bj">北京</option>
          <option value="gz">广州</option>
        </select>
        <br/>

        {/* 复选框 */}
        <input type="checkbox" checked={this.state.isChecked} onChange={this.handleChecked}/>
      </div>
    )
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

多表单元素优化

  • 问题: 每个表单元素都有一个单独是事件处理程序处理太繁琐
  • 优化: 使用一个事件处理程序同时处理多个表单元素

多表单元素优化步骤:

1.给表单元素添加name属性, 名称与state相同

2.根据表单元素类型获取对应值

3.在 change 事件处理程序中通过 [name] 来修改对应的state

xcooo
class Input extends React.Component {
  // 简化语法
  state = {
    txt: '',
    content: '',
    city: 'bj',
    isChecked: false
  }
  handleChange = e => {
    // 获取当前 Dom 对象
    const target = e.target

    // 根据类型获取值
    const value = target.type === 'checkbox
      ? target.checked : target.value

    // 获取name
    const name = target.name
    this.setState({
      [name]: value
    })
  }
  render() {
    return (
      <div>
        {/* 文本框 */}
        <input value={this.state.txt} name="txt" onChange={this.handleChange} />
        <br />

        {/* 富文本框 */}
        <textarea value={this.state.content} name="content" onChange={this.handleChange}></textarea>
        <br />

        {/* 下拉框 */}
        <select value={this.state.city} name="city" onChange={this.handleChange}>
          <option value="sh">上海</option>
          <option value="bj">北京</option>
          <option value="gz">广州</option>
        </select>
        <br />

        {/* 复选框 */}
        <input type="checkbox" checked={this.state.isChecked} name="isChecked" onChange={this.handleChange} />
      </div>
    )
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# 2.非受控组件 (DOM方式)

  • 说明: 借助于ref, 使用原生DOM方式来获取表单元素值
  • ref的作用: 获取DOM或组件

使用步骤:

1.调用 React.createRef() 方法创建一个ref对象

constructor() {
  super()
  this.txtRef = React.createRef
}
1
2
3
4

2.将创建好的 ref 对象添加到文本框中

<input type="text" ref={this.txtRef} />
1

3.通过ref对象获取到文本框的值

console.log(this.txtRef.current.value)
1

# 3.非受控组件 - 老版写法

// 获取 input中的 value 值
const value = this.input.value.trim()

// 获取 select中的 value 值
const value = this.select.value*1

// input输入框
<input type="text" ref={input => this.input = input} />

// select选择框
<select ref={select => this.select = select}>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
上次更新: 2020/10/27 下午11:58:10