7、表单

最后更新于:2022-04-02 06:08:34

  表单元素是一类拥有内部状态的元素,这些状态由其自身维护,通过这类元素可让用户与Web应用进行交互。HTML中的表单元素(例如\、\元素,它的值(即状态)由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中的\ ~~~ **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中,\ ~~~   在React中,只需对\ ); } } ~~~   只要给\ ); } } ~~~ ## 二、非受控组件   非受控组件(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)
';