《三》受控组件和非受控组件

博客介绍了 React 中 HTML 表单的处理方式,有受控组件和非受控组件两种。受控组件的数据由 React 管理,state 是唯一数据源;非受控组件的数据由元素自身管理。React 建议多用受控组件,还说明了给非受控组件绑定初始值及获取数据的方法。

在 React 中,HTML 表单的处理方式和普通的 DOM 元素不太一样。

React 有两种不同的方式来处理表单输入元素:受控组件和非受控组件。

受控组件:

受控组件:表单元素的数据是由 React 来管理的。state 是表单元素的唯一数据源,并根据 setState()进行更新。

<input>、<textarea><select> 的 value 属性,<checkbox><radio> 的 checked 属性绑定 state,它们就会变成受控组件。

React 建议大多数情况下使用受控组件来处理表单数据。

class App extends React.PureComponent {
  state = {
    value: '这是受控组件'
  }

  handleChange = e => {
    // 调用 setState() 更新 input 的数据
    this.setState({value: e.target.value})
  }

  render() {
    const {value} = this.state
    //  this.state.value 维护 input 的数据
    return <input type='text' value={value} onChange={this.handleChange} />
  }
}

非受控组件:

非受控组件:表单元素的数据是由元素自己来管理的。表单元素自己维护数据,并根据用户的输入进行更新。

如果想给非受控组件绑定初始值,可以通过给 <input>、<textarea><select> 绑定 defaultValue 属性,<checkbox><radio> 绑定 defaultChecked 属性。
可以使用 ref 的方式来获取非受控组件的数据。

class ApP extends React.PureComponent {
	render() {
	   // input 自己维护数据,并根据用户的输入进行更新
	   return <input type='text' />
	 }
}
### 受控组件介绍 受控组件React 中处理表单元素的一种方式,通过组件状态来管理表单元素的值行为,使 React 能够完全掌控表单。在受控组件中,表单元素的值由 React 组件的状态控制,并且每次表单元素的值发生变化时,都会触发一个事件处理函数来更新组件的状态。以下是一个受控组件的示例代码: ```jsx import { useState } from 'react'; const App = () => { const [val, setVal] = useState('前端西瓜哥'); const submit = () => { const username = val; // 处理提交逻辑 }; return ( <div> 用户名: <input value={val} onInput={(e) => { setVal(e.target.value); }} /> <button onClick={submit}>提交</button> </div> ); }; ``` 在这个例子中,`input` 元素的值由 `val` 状态控制,当输入框的值发生变化时,`onInput` 事件处理函数会更新 `val` 状态[^1][^3]。 ### 非受控组件介绍 非受控组件则直接使用 DOM 来管理表单元素的值,适用于简单的表单场景。非受控组件将真实数据存在 DOM 节点中,在使用非受控组件时,有时候更容易同时集成 React React 代码。如果不介意代码美观性,并且希望快速编写代码,使用非受控组件往往可以减少代码量[^1][^2]。 ### 两者区别 - **数据存储位置**:受控组件的数据存储在 React 组件的状态中,而非受控组件的数据存储在 DOM 节点中[^1][^2]。 - **数据控制方式**:受控组件通过状态管理表单元素的值,每次值变化都要通过事件处理函数更新状态;非受控组件直接从 DOM 获取值,不依赖 React 状态管理[^1][^3]。 - **使用场景**:受控组件适用于需要对表单元素进行复杂控制验证的场景;非受控组件适用于简单的表单场景,如只需要在表单提交时获取值的情况[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值