React中受控组件与非受控组件的使用
2022-06-05 12:53
3207 查看
受控组件
受控组件的步骤: 1.在state中添加一个状态,作为表单元素的value值(控制表单元素值的来源) 2.给表单元素绑定change事件,将表单元素的值设置为state的值(这样就可以控制表单元素值的变化)
受控组件的简单使用 index.js
import React from 'react'; //这个是react这个包,我们是需要的 import ReactDOM from 'react-dom'; //这个是react的虚拟dom class ShowCont extends React.Component { state = { txet: '', city: 'sh', isChecked:'' } // input的事件 changeTextHandler = (e) => { this.setState({ txet:e.target.value }) console.log(this.state.txet) } // 下拉框的事件 cityHandler = (e) => { this.setState({ city:e.target.value }) } // 复选框的事件 changeCheck = (e) => { this.setState({ isChecked:e.target.checked }) } // 获取的是所有的值 getAllHandler = () => { console.log('获取的是所有的值:',this.state) } render() { return ( <div> {/* 普通的input */} <input type="text" value={this.state.txet} onChange={this.changeTextHandler} /> {/* 下拉 */} <select value={this.state.city} onChange={this.cityHandler} > <option value="sh">上海</option> <option value="bj">北京</option> </select> {/* 复选框 */} <input type="checkbox" checked={this.state.isChecked} onChange={ this.changeCheck} /> <button onClick={this.getAllHandler}>获取值</button> </div> ) } } ReactDOM.render(<ShowCont/>, document.getElementById('root'))
受控组件的原理
文本框和文本域,下拉框操作的是value属性,通过change事件去更新。 复选框是通过checked属性和change事件去更新。
我们的发现
上面有不同的表单元素,如果表单元素有很多。 那我们是不是都要写不同的事件。去设置值呢? 这样操作会很麻烦的。 所以我们需要优化一下上面的代码。 我们发现:1.给表单元素添加name属性,名称与state相同。 value={this.state.txet} name='txet' 2.根据表单元素的类型获取对应的值 const formValue = target.type === 'checkbox' ? target.checked : target.value 3.在change事件中通过{name}来需要改对应的state中的值 this.setState({ [name]:formValue })
优化上面的代码 index.js
import React from 'react'; //这个是react这个包,我们是需要的 import ReactDOM from 'react-dom'; //这个是react的虚拟dom class ShowCont extends React.Component { state = { txet: '', city: 'sh', isChecked:'' } // input changeTextHandler = (e) => { // 获取当前的dom对象 let target = e.target // 根据类型获取值(key值) let name = target.name // 获取表单中的值 const formValue = target.type === 'checkbox' ? target.checked : target.value // 设置值 this.setState({ [name]:formValue }) } // 获取的是所有的值 getAllHandler = () => { console.log('获取的是所有的值:',this.state) } render() { return ( <div> {/* 普通的input */} <input type="text" value={this.state.txet} name='txet' onChange={this.changeTextHandler} /> {/* 下拉 */} <select value={this.state.city} name='city' onChange={this.changeTextHandler} > <option value="sh">上海</option> <option value="bj">北京</option> </select> {/* 复选框 */} <input type="checkbox" checked={this.state.isChecked} name='isChecked' onChange={ this.changeTextHandler} /> <button onClick={this.getAllHandler}>获取值</button> </div> ) } } ReactDOM.render(<ShowCont/>, document.getElementById('root'))
非受控组件的使用方式
// 1.调用React.createRef()方法创建一个ref对象 this.textRef = React.createRef() // 2.将创建好的ref对象添加到文本框中 <input type="text" ref={this.textRef} /> // 3. 通过ref对象获取文本框中的值 console.log('文本框中的值是:',this.textRef.current.value);
index.js使用非受控组件
import React from 'react'; //这个是react这个包,我们是需要的 import ReactDOM from 'react-dom'; //这个是react的虚拟dom class ShowCont extends React.Component { constructor() { super() // 1.调用React.createRef()方法创建一个ref对象 this.textRef = React.createRef() } getText = () => { // 3. 通过ref对象获取文本框中的值 console.log('文本框中的值是:',this.textRef.current.value); } render() { return ( <div> {/* 2.将创建好的ref对象添加到文本框中 */} <input type="text" ref={this.textRef} /> <button onClick={this.getText}>获取文本框中的值</button> </div> ) } } ReactDOM.render(<ShowCont/>, document.getElementById('root'))
相关文章推荐
- React类组件中事件绑定this指向的三种方式
- (十一)React Ant Design Pro + .Net5 WebApi:后端环境搭建-IdentityServer4(三)持久化
- react实战 系列
- (十)React Ant Design Pro + .Net5 WebApi:后端环境搭建-IdentityServer4(二)授权模式
- 七天接手react项目 系列 —— 尾篇(antd 和 mobx)
- 七天接手react项目 系列 —— react 路由
- (九)React Ant Design Pro + .Net5 WebApi:后端环境搭建-IdentityServer4(一)简单配置
- 七天接手react项目 系列
- Microsoft reactor Shanghai China .NET 20 anniversary.
- (八)React Ant Design Pro + .Net5 WebApi:后端环境搭建-Aop
- 七天接手react项目 系列 —— state&事件处理&ref
- (七)React Ant Design Pro + .Net5 WebApi:后端环境搭建-日志、异常处理
- Microsoft reactor Shanghai China Mid-Autumn Festival MVP Party
- (六)React Ant Design Pro + .Net5 WebApi:后端环境搭建-EF Core
- react 也就这么回事 04 —— 元素渲染
- react 也就这么回事 03 —— JSX 的注意点
- react 也就这么回事 02 —— JSX 插值表达式、条件渲染以及列表渲染
- react 也就这么回事 01 —— React 元素的创建和渲染
- React Hooks 指北
- React 的调和算法Diffing 算法策略详解