React受控组件和非受控组件区别及应用场景。

一、定义

  1. 受控组件

    • 受控组件的值受React组件的state控制。
    • 当用户输入内容时,组件会触发onChange事件,更新state,然后重新渲染组件。
    • 应用场景:适用于需要在React中对输入进行严格控制和验证的情况,如表单输入项,可以方便地实现输入验证和逻辑处理。
  2. 非受控组件

    • 非受控组件的值不受React组件的state控制,而是由DOM本身管理。
    • 通常通过ref获取DOM节点的值来进行操作。
    • 应用场景:适用于一些简单的交互,或者需要与第三方库或原生API集成的情况,如使用第三方日期选择器或上传组件。

二、受控组件

受控组件,简单来讲,就是受我们控制的组件,组件的状态全程响应外部数据。

class TestComponent extends React.Component {
  constructor (props) {
    super(props);
    this.state = { username: 'lindaidai' };
  }
  render () {
    return <input name="username" value={this.state.username} />
  }
}

这时候当我们在输入框输入内容的时候,会发现输入的内容并无法显示出来,也就是input标签是一个可读的状态

这是因为valuethis.state.username所控制住。当用户输入新的内容时,this.state.username并不会自动更新,这样的话input内的内容也就不会变了

如果想要解除被控制,可以为input标签设置onChange事件,输入的时候触发事件函数,在函数内部实现state的更新,从而导致input框的内容页发现改变

因此,受控组件我们一般需要初始状态和一个状态更新事件函数。

三、非受控组件

非受控组件,简单来讲,就是不受我们控制的组件

一般情况是在初始化的时候接受外部数据,然后自己在内部存储其自身状态

当需要时,可以使用ref 查询 DOM 并查找其当前值,如下:

import React, { Component } from 'react';

export class UnControll extends Component {
  constructor (props) {
    super(props);
    this.inputRef = React.createRef();
  }
  handleSubmit = (e) => {
    console.log('我们可以获得input内的值为', this.inputRef.current.value);
    e.preventDefault();
  }
  render () {
    return (
      <form onSubmit={e => this.handleSubmit(e)}>
        <input defaultValue="lindaidai" ref={this.inputRef} />
        <input type="submit" value="提交" />
      </form>
    )
  }
}

大部分时候推荐使用受控组件来实现表单,因为在受控组件中,表单数据由React组件负责处理

如果选择非受控组件的话,控制能力较弱,表单数据就由DOM本身处理,但更加方便快捷,代码量少。

相关推荐

  1. React组件组件区别应用场景

    2024-03-13 00:10:01       20 阅读
  2. react组件组件区别

    2024-03-13 00:10:01       37 阅读
  3. React 表单、处理表单组件组件

    2024-03-13 00:10:01       27 阅读
  4. React中的组件组件

    2024-03-13 00:10:01       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-13 00:10:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-13 00:10:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-13 00:10:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-13 00:10:01       18 阅读

热门阅读

  1. Mysql中有多少种锁

    2024-03-13 00:10:01       21 阅读
  2. Qt提高-线程池QThreadPool 详解

    2024-03-13 00:10:01       25 阅读
  3. DNS欺骗攻击技术详解及实战代码解析

    2024-03-13 00:10:01       19 阅读
  4. 机器学习分析地图数据位置距离

    2024-03-13 00:10:01       23 阅读
  5. 力扣爆刷第92天之hot100五连刷46-50

    2024-03-13 00:10:01       21 阅读
  6. 单片机开发-实现Zigbee的LED灯交替闪烁

    2024-03-13 00:10:01       18 阅读
  7. 普通人改变命运的5次机会,你抓住了吗?

    2024-03-13 00:10:01       18 阅读