组件可以按不同角度做分类,这次从表单元素的使用开始。不同于div、span等元素只需根据状态来展示内容,表单元素自身可以维护一些状态,但是默认不受React控制。比如,一个input输入框,会随用户的输入而改变。这样的交互行为明显违背了React的基本原则--状态的改变必须通过组件的state。

受控组件

为了达到由React来控制表单元素的值,可以在用户和表单元素发生交互时控制表单元素的行为,从而保证组件的state成为表单元素状态的唯一来源,也就是表单元素的值是由React来管理。

不同表单元素实现的方式不一样

文本框

文本框包含类型为text的<input>元素和<textarea>元素。通过表单元素的value属性设置表单元素的值,通过onChange事件监听值得变化,并将变化同步到React组件的state中

class NameForm extends React.Component {constructor(props) {super(props);this.state = {name: ''};this.handleChange = this.handleChange.bind(this);}handleChange(event) {const target = event.target;this.setState({[target.name]: target.value});}render() {return (<form onSubmit={this.handleSubmit}><label>Name:<input name="name" type="text" value={this.state.name}  onChange={this.handleChange} /></label><input type="submit" value="Submit" /></form>);}
}复制代码

下拉列表

<select name="cars"><option value="volvo">Volvo</option><option value="saab">Saab</option><option value="fiat" selected="selected">Fiat</option>
</select>复制代码

React与原生使用selcted定义选中项不同,它通过在<selcet>上定义value属性来决定那个<option>元素处于选中项。

class NameForm extends React.Component {constructor(props) {super(props);this.state = {value: ''};this.handleChange = this.handleChange.bind(this);}handleChange(event) {this.setState({value: event.target.value});}render() {return (<form onSubmit={this.handleSubmit}><label>Name:<select name="cars" value={this.state.value} onChange={this.handleChange}><option value="volvo">苹果</option><option value="saab">香蕉</option><option value="fiat">凤梨</option>          </select></label><input type="submit" value="Submit" /></form>);}
}复制代码

复选框和单选框

类型为checkbox和radio的<input>元素,受控方式不同于text类型。React控制的不在是value属性,而是checked属性。

class NameForm extends React.Component {constructor(props) {super(props);this.state = {apple: false,orange: false};this.handleChange = this.handleChange.bind(this);}handleChange(event) {const target = event.target;this.setState({[target.name]: target.checked});}render() {return (<form onSubmit={this.handleSubmit}><label>Apple<input name="apple" type="checkbox" vlaue="apple" checked={this.state.apple}  onChange={this.handleChange} /></label><label>orange<input name="apple" type="checkbox" vlaue="orange" checked={this.state.orange}  onChange={this.handleChange} />      </label><input type="submit" value="Submit" />      </form>);}
}复制代码

非受控组件

受控组件需要每个元素绑定onChange事件,比较繁琐。另一种方式就是使用非受控组件,不用React来管理状态,所以需要一种方式来获取到表单元素的值。

ref

React提供了一个特殊的属性ref,用来引用React组件或DOM元素的实例,故可以通过为表单元素定义ref属性来获取元素的值。

handleSubmit(event){// 通过this.input 获取到input元素的值alert(“value is" + this.input.vlaue);event.preventDefault()
}//this.input 指向当前input元素
<input type="text" ref={(inptu) => this.input = input} />复制代码

ref值是个函数,会接受当前元素作为参数,然后把input赋值给了this.input。进而可以在组件的其他地方通过this.input获取这个元素。

defaultValue

因为使用非受控组件,通常需要设置默认值,但是无法再通过value属性设置。所以可以使用defaultValue属性设置默认值。类似的,select和textarea也可以设置defalutValue,<input type="checkbox"> 和<input type="radio">则设置defaultChecked属性设置默认值。

转载于:https://juejin.im/post/5c7fbcd86fb9a04a006fc7c4

React学习手记4-组件分类(受控组件和非受控组件)相关推荐

  1. React学习(6)—— 高阶应用:非受控组件

    为什么80%的码农都做不了架构师?>>>    非受控组件 使用非受控组件 在大部分情况下,推荐使用 受控组件 来实现表单.输入框等状态控制.在受控组件中,表单等数据都有React组 ...

  2. React学习:双向数据绑定、约束性和非约束性组件-学习笔记

    文章目录 React学习:双向数据绑定.约束性和非约束性组件-学习笔记 表单 约束性和非约束性组件(受限/非受限) 双向数据绑定小例子 React学习:双向数据绑定.约束性和非约束性组件-学习笔记 表 ...

  3. Vue3+Typescript学习笔记(十)组件通信--父子组件通信(props,$emit),非父子组件通信(provide和inject,mitt库)

    一.认识组件的嵌套 1. App单独开发 前面我们是将所有的逻辑放到一个App.vue中: 在之前的案例中,我们只是创建了一个组件App: 如果我们一个应用程序将所有的逻辑都放在一个组件中,那么这个组 ...

  4. React学习手记5-细说组件state

    设计state state是跟UI相关的,组件的任何UI改变都可以从state的变化中反映出来.state代表一个组件UI呈现的最小状态,没有任何多余的状态,也不应该存在通过其他状态计算而来的中间状态 ...

  5. 【Matlab学习手记】ELM分类

    2021-6-25 新增 github 源码和数据链接,第7个文件夹,所以,自行下载,enjoy https://github.com/AFei19911012/MatlabSamples/tree/ ...

  6. 1 跟李沐老师学习深度学习(介绍监督【分类回归】、非监督【聚类】)

    目录 在回归中,我们训练一个回归函数来输出一个数值: 而在分类中,我们训练一个分类器,它的输出即为预测的类别. 把关键章节标注了出来~(由于第一章我当年看过视频了,所以就没再看一遍,而是浏览了笔记) ...

  7. uVision5中的Git版本管理配置(一)受控文件与非受控文件

    归入版本管理文件 源文件 (*.c, *.cpp, *.h, *.inc, *.s) 项目文件: Project.uvprojx (is used to build the project from ...

  8. 0205事件处理_受控_柯里化-组件-React

    文章目录 1 事件处理 1.1 概述 1.2 示例 2 非受控组件和受控组件 2.1 概述 2.2 登录示例-非受控 2.3 登录示例-受控 3 高阶函数 4 函数柯里化 5 React函数的非柯里化 ...

  9. 【React】之受控组件和非受控组件

    React中的组件根据是否受React控制可分为受控的和非受控的. 一.受控组件 表单元素依赖于状态,表单元素需要默认值实时映射到状态的时候,就是受控组件,这个和双向绑定相似. 受控组件,表单元素的修 ...

最新文章

  1. Oracle 常用运维命令整理
  2. 结合深度学习的图像修复怎么实现?
  3. 中科院博士因论文致谢走红后,回到母校演讲再刷屏!网友:是对寒门学子最好的激励...
  4. 八十、React中的容器组件和无状态组件
  5. 【专升本计算机】甘肃省专升本计算机C语言经典程序案例代码合集(持续更新)
  6. pip安装指定版本包
  7. 内部服务并行调用_25行以下代码中的并行SOAP调用的Express服务
  8. java cache教程_Java 中常用缓存Cache机制的实现
  9. SQLite数据库---ListView控件之商品展示案例
  10. advice 和 拦截器_ControllerAdvice拦截器
  11. mongodb集群分片环境搭建
  12. Javascript第四章变量的作用域第三课
  13. 查询一个表中一个字段相同的数据_最实用MySQL 查询当天、本周,本月、上一个月的数据...
  14. 【CAD技巧】120个常见CAD问题解决办法
  15. 【连载】第三章刚体的定轴转动第二节转动惯量 刚体定轴转动定律
  16. 小菜学前端day02(学习笔记)
  17. ECS实例及阿里云服务器ECS功能组件的说明
  18. 浏览器提示正在下载代理脚本问题解决
  19. M1W Dock 教程之开发环境配置
  20. 用JavaScript实现支持图片的字段类型

热门文章

  1. Unity3d 札记-Let's try shooting 知识点汇总
  2. html5学习之路_003
  3. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 基于数据库资源的多语言实现...
  4. 【dp】CF17C. Balance
  5. linux中umask的使用
  6. 系统图标及其注册表项
  7. EasyExcel项目使用
  8. 西北农林科技大学计算机老师 癌症,西北农林科大攻克苹果树“癌症”
  9. nacos启动_nacos微服务注册中心
  10. pcm 降采样_Android_android downsample降低音频采样频率代码,使用Android AudioRecord 录制PCM文 - phpStudy...