前端躬行记
ES6
1、let和const
2、扩展运算符和剩余参数
3、解构
4、模板字面量
5、对象字面量的扩展
6、Symbol
7、代码模块化
8、数字
9、字符串
10、正则表达式
11、对象
12、数组
13、类型化数组
14、函数
15、箭头函数和尾调用优化
16、Set
17、Map
18、迭代器
19、生成器
20、类
21、类的继承
22、Promise
23、Promise的静态方法和应用
24、代理和反射
HTML
1、SVG
CSS进阶
1、CSS基础拾遗
2、伪类和伪元素
3、CSS属性拾遗
4、浮动形状
5、渐变
6、滤镜
7、合成
8、裁剪和遮罩
9、网格布局
10、CSS方法论
React
1、函数式编程
2、JSX
3、组件
4、生命周期
5、React和DOM
6、事件
7、表单
8、样式
9、组件通信
10、高阶组件
11、Redux基础
12、Redux中间件
13、React Router
14、测试框架
15、React Hooks
16、React源码分析
利器
1、npm
2、Babel
3、webpack基础
4、webpack进阶
5、Git
6、Fiddler
7、自制脚手架
Vue.js
1、数据绑定
2、指令
3、样式和表单
4、组件
5、组件通信
6、内容分发
7、渲染函数和JSX
8、Vue Router
9、Vuex
TypeScript
1、数据类型
2、接口
3、类
4、泛型
5、类型兼容性
6、高级类型
7、命名空间
8、装饰器
Node.js
1、Buffer、流和EventEmitter
2、文件系统和网络
3、命令行工具
4、自建前端监控系统
5、定时任务的调试
6、自制短链系统
7、定时任务的进化史
8、通用接口
9、微前端实践
10、接口日志查询
11、E2E测试
12、BFF
13、MySQL归档
14、压力测试
15、活动规则引擎
16、活动配置化
监控系统
1、SDK
2、存储和分析
3、性能监控
4、内存泄漏
5、小程序
6、较长的白屏时间
7、页面奔溃
Web优化
1、CSS优化
2、JavaScript优化
3、图像和网络
4、用户体验和工具
5、网站优化
数据结构与算法
1、链表
2、栈、队列、散列表和位运算
3、二叉树
4、二分查找
5、回溯算法
6、贪心算法
7、分治算法
8、动态规划
程序员之路
大学
2011年
2012年
2013年
2014年
项目反思
前端基础学习分享
2015年
再一次项目反思
然并卵
PC网站CSS分享
2016年
制造自己的榫卯
PrimusUI
2017年
工匠精神
2018年
2019年
前端学习之路分享
2020年
日志
2020
本书使用 GeChiUI.com 发布
7、表单
7、表单
最后更新于:2022-04-02 06:08:34
表单元素是一类拥有内部状态的元素,这些状态由其自身维护,通过这类元素可让用户与Web应用进行交互。HTML中的表单元素(例如\
、\
和\
等)在React中都有相应的组件实现,不仅如此,React还将它们分成两种:受控组件和非受控组件。 ## 一、受控组件 受控组件(Controlled Component)是指那些受React控制的表单元素,其状态(value、checked等属性)的变更由组件的state管理。对于不同的表单元素,其受控组件的形式会有所差异,接下来会讲解其中的三类。 **1)文本框** 常用的单行文本框是一个type属性为“text”的\
元素,它的值(即状态)由value属性控制。如果要监听文本框的状态变化,那么可以像下面这样操作。 ~~~js class Text extends React.Component { constructor(props) { super(props); this.state = {value: "init"}; this.handle = this.handle.bind(this); } handle(e) { this.setState({value: e.target.value.toUpperCase()}); } render() { return
; } } ~~~ 上述代码实现了一个简单的功能,在改变文本框中的内容时,自动将其转换成大写字母。具体的更新过程可分为四步: (1)在构造函数中初始化组件的state,并为文本框设置默认值。 (2)文本框注册onChange事件,监听其值的变化。 (3)在事件处理程序handle()中,通过e.target.value读取到输入的值,修改并同步(调用this.setState()方法)到组件的state中。 (4)组件重新渲染,完成文本框的内容更新。 其他两类受控组件的更新过程与之类似,只是在细节处理上有所不同。 观察上面的示例可以发现,文本框的数据来源于组件的state,通过onChange事件将输入的新数据再同步给组件的state,从而完成了一次双向数据绑定。 React中的\
元素(多行文本框),其使用类似于上面的\
元素,也是通过value属性来获取值的,如下代码所示,省略了构造函数和事件处理程序。 ~~~js class TextArea extends React.Component { render() { return
; } } ~~~ 而HTML中的\
元素则会将值定义成子元素,并且包含结束标签,如下所示。 ~~~html
init
~~~ **2)单选框和复选框** 单选框是一个type属性为“radio”的\
元素,复选框是一个type属性为“checkbox”的\
元素。与之前的文本框不同,React控制的不是它们的值,而是选中状态,即布尔属性checked。在下面的例子中,监听了每个单选框的checked属性。 ~~~js class Radio extends React.Component { constructor(props) { super(props); this.state = { gender: "" }; this.handle = this.handle.bind(this); } handle(e) { this.setState({ gender: e.target.value }); } render() { return ( <>
男
女 > ); } } ~~~ 复选框能选中多个项,其操作要比单选框繁琐许多。在下面的例子中,不但监听了每个复选框的checked属性,还将处于选中状态的值提取了出来,组成一个数组。 ~~~js class Checkbox extends React.Component { constructor(props) { super(props); this.state = { colors: [] }; //保存复选框值的数组 this.handle = this.handle.bind(this); } handle(e) { const { checked, value } = e.target; let { colors } = this.state; if (checked && colors.indexOf(value) == -1) { colors.push(value); //已选中并且数组中未有该值,就在末尾插入 } else { colors = colors.filter(item => item != value); //未选中,就将该值过滤掉 } this.setState({ colors }); } render() { return ( <>
= 0} />红
= 0} />绿
= 0} />蓝 > ); } } ~~~ 虽然React处理单选框和复选框的方式要比在HTML中复杂一点,但是保证了组件的state是元素状态的唯一来源,进而让更新过程更加可靠和可控。 **3)选择框** 在HTML中,\
元素(选择框)会包含多个用来表示选项的\
元素,而选中的项会被定义一个selected属性,如下代码所示,第二个\
元素处于选中状态。 ~~~html
strick
freedom
jane
~~~ 在React中,只需对\
元素定义value属性就能决定当前的选中项,如下代码所示,这比用DOM的方式操作选项要简洁得多。 ~~~js class Select extends React.Component { constructor(props) { super(props); this.state = { value: "" }; this.handle = this.handle.bind(this); } handle(e) { this.setState({ value: e.target.value }); } render() { return (
strick
freedom
jane
); } } ~~~ 只要给\
元素添加multiple属性并将其赋为true就能变为多选,如下代码所示,此时传给value属性的是一个数组。 ~~~js class MulSelect extends React.Component { constructor(props) { super(props); this.state = { values: [] }; this.handle = this.handle.bind(this); } handle(e) { const { options } = e.target; //options是一个类数组对象 const values = Object.keys(options) //将options的索引组成一个数组 .filter(i => options[i].selected) //过滤出选中项 .map(i => options[i].value); //提取选中项组成新数组 this.setState({ values }); } render() { return (
strick
freedom
jane
); } } ~~~ ## 二、非受控组件 非受控组件(Uncontrolled Component)的定义正好与受控组件的相左,其状态由自己管理,通常使用ref属性([第5篇](https://www.cnblogs.com/strick/p/10593862.html)中讲解过)获取表单元素的值。在下面的示例中,文本框在失去焦点时,能自动将其内容转换成大写字母。如果用受控组件的形式完成相同的功能,那么会较为繁琐。 ~~~js class Text extends React.Component { constructor(props) { super(props); this.handle = this.handle.bind(this); } handle() { this.input.value = this.input.value.toUpperCase(); } render() { return
{this.input = input}}/>; } } ~~~ 在render()方法中,首先为文本框注册onBlur事件,然后定义ref属性,其值是一个回调函数。当组件被挂载时,就会执行该回调函数,然后就能让this.input指向一个文本框,从而在事件处理程序handle()中就能通过this.input读取到文本框中的内容。 在React中,有一个表单元素比较特殊,那就是上传按钮。它只有非受控组件的形式,因为其值只能由用户传入,不能被组件的state所控制。 **1)默认值** 如果要指定非受控组件的默认值,那么可通过定义defaultValue或defaultChecked属性实现,前者适用于文本框、选择框等元素,后者适用于单选框和复选框。下面的示例分别给文本框和单选框设置了默认值,为了便于观察,只放出了关键代码。 ~~~js class Text extends React.Component { render() { return
; } } class Radio extends React.Component { render() { return ( <>
男
女 > ); } } ~~~ ***** > 原文出处: [博客园-React躬行记](https://www.cnblogs.com/strick/category/1455720.html) [知乎专栏-React躬行记](https://zhuanlan.zhihu.com/pwreact) 已建立一个微信前端交流群,如要进群,请先加微信号freedom20180706或扫描下面的二维码,请求中需注明“看云加群”,在通过请求后就会把你拉进来。还搜集整理了一套[面试资料](https://github.com/pwstrick/daily),欢迎浏览。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2e1f8ecf9512ecdd2fcaae8250e7d48a_430x430.jpg =200x200)
';