博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React中的受控组件和非受控组件学习总结
阅读量:5946 次
发布时间:2019-06-19

本文共 2640 字,大约阅读时间需要 8 分钟。

故事:Form表单是前端开发过程中经常使用的功能, 在使用react 表单时,都会遇到受控组件或者非受控组件。当我听到这两个关键词的时候确实有点懵逼,不知道啥意思,因此记录下来,作为自己的学习目标

受控组件(React官方推荐使用受控组件)

在React中,每当表单的状态发生变化时,都会被写入到组件的state中,这种组件在React被称为受控组件
import React, {PureComponent} from "react"import {PropTypes} from 'prop-types';import {BrowserRouter as Router, Route, Link} from 'react-router-dom'export default class Form extends React.Component {    constructor(props) {        super(props)    }    state = {        username:"你我贷"    }    handleChange = (e) => {        let name = e.target.value;        this.setState({            username: name        })    }    render() {        return (            
{this.state.username}
) }}复制代码

效果如下

总结

1. 可以通过在初始state中动态设置value值 

2. 每当表单的值发生变化时,调用onChange事件处理器。如果添加了value (单选框和复选框对应的是checked)而没有添加onChange会受到react警告 

3. 事件处理器通过合成事件对象e拿到改变后的状态,并更新state。 

4. setState触发视图的重新渲染,完成表单组件值得更新

非受控组件

表现形式上,react中没有添加value属性(单选按钮和复选框对应的是checked)的表单组件元素就是非受控组件
render() {    return (        
)}复制代码

1)非受控组件即不受状态的控制,获取数据就是相当于操作DOM。 

2)非受控组件的好处是很容易和第三方组件结合。

非受控组件获取输入框中的值的两种方法

第一种方式:函数

因为不受控组件的数据来源是 DOM 元素,所以一般情况下不受控组件我们使用ref来获取DOM元素进行操作。即在虚拟DOM节点上使用ref,并使用函数,将函数的参数挂载到实例的属性上

import React, {PureComponent} from "react"import {PropTypes} from 'prop-types';import {BrowserRouter as Router, Route, Link} from 'react-router-dom'export default class Form extends React.Component {    constructor(props) {        super(props)    }    handleSubmit = (e) => {        e.preventDefault();        console.log(this.username)        console.log(this.username.value)    }    render() {        return (            
this.username= node} />
) }}复制代码

第二种方式:通过构造函数声明的方式

react 16.3新语法 

实例的构造函数constructor这创建一个引用 

在虚拟DOM节点上声明一个ref属性,并且将创建好的引用赋值给这个ref属性 

react会自动将输入框中输入的值放在实例的second属性上

import React, {PureComponent} from "react"import {PropTypes} from 'prop-types';import {BrowserRouter as Router, Route, Link} from 'react-router-dom'export default class Form extends React.Component {    constructor(props) {        super(props)        // 在构造函数中创建一个引用        this.username = React.createRef();    }    handleSubmit = (e) => {        e.preventDefault();        console.log(this.username)        console.log(this.username.current)        console.log(this.username.current.value)    }    render() {        return (            
) }}复制代码

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

你可能感兴趣的文章
kafka安装教程
查看>>
go语言基础
查看>>
【Windows】字符串处理
查看>>
Spring(十八):Spring AOP(二):通知(前置、后置、返回、异常、环绕)
查看>>
CentOS使用chkconfig增加开机服务提示service xxx does not support chkconfig的问题解决
查看>>
微服务+:服务契约治理
查看>>
save
查看>>
Android DrawLayout + ListView 的使用(一)
查看>>
clear session on close of browser jsp
查看>>
关于吃掉物理的二次聚合无法实现的需要之旁门左道实现法
查看>>
mysql出现unblock with 'mysqladmin flush-hosts'
查看>>
oracle exp/imp命令详解
查看>>
开发安全的 API 所需要核对的清单
查看>>
Mycat源码中的单例模式
查看>>
WPF Dispatcher介绍
查看>>
fiddler展示serverIP方法
查看>>
已释放的栈内存
查看>>
Android网络之数据解析----SAX方式解析XML数据
查看>>
Java递归列出所有文件和文件夹
查看>>
[关于SQL]查询成绩都大于80分的学生
查看>>