您的位置:首页 > Web前端 > React

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'))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: