React受控组件和非受控组件的理解?应用场景?

面试官:说说对受控组件和非受控组件的理解?应用场景?

一、受控组件

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

举个简单的例子:

jsx 复制代码
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 并查找其当前值,如下:

jsx 复制代码
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>
    )
  }
}

关于refs的详情使用可以参考之前文章

三、应用场景

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

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

针对两者的区别,其应用场景如下图所示:

参考文献

相关推荐
我叫汪枫14 分钟前
前端物理引擎库推荐 - 让你的网页动起来!
前端
雾恋5 小时前
最近一年的感悟
前端·javascript·程序员
A黄俊辉A5 小时前
axios+ts封装
开发语言·前端·javascript
小李小李不讲道理6 小时前
「Ant Design 组件库探索」四:Input组件
前端·javascript·react.js
连合机器人6 小时前
晨曦中的守望者:当科技为景区赋予温度
java·前端·科技
郑板桥307 小时前
tua-body-scroll-lock踩坑记录
前端·javascript
慢半拍iii8 小时前
JAVA Web —— A / 网页开发基础
前端
gnip8 小时前
pnpm 的 monorepo架构多包管理
前端·javascript
新手村领路人9 小时前
Firefox自定义备忘
前端·firefox
乖女子@@@9 小时前
css3新增-网格Grid布局
前端·css·css3