chst365's blog chst365's blog
首页
  • Git
  • 网络
  • 操作系统
  • 浏览器
  • webpack
  • JavaScript
  • TypeScript
  • 性能
  • 工程化
  • React
  • 编程题
  • React技术揭秘
  • 算法
  • Node
  • 编码解码
  • NodeJS系列
  • Linux系列
  • JavaScript系列
  • HTTP系列
  • GIT系列
  • ES6系列
  • 设计模式系列
  • CSS系列
  • 小程序系列
  • 数据结构与算法系列
  • React系列
  • Vue3系列
  • Vue系列
  • TypeScript系列
  • Webpack系列
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

chst365

DIV工程师
首页
  • Git
  • 网络
  • 操作系统
  • 浏览器
  • webpack
  • JavaScript
  • TypeScript
  • 性能
  • 工程化
  • React
  • 编程题
  • React技术揭秘
  • 算法
  • Node
  • 编码解码
  • NodeJS系列
  • Linux系列
  • JavaScript系列
  • HTTP系列
  • GIT系列
  • ES6系列
  • 设计模式系列
  • CSS系列
  • 小程序系列
  • 数据结构与算法系列
  • React系列
  • Vue3系列
  • Vue系列
  • TypeScript系列
  • Webpack系列
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • NodeJS系列

  • Linux系列

  • JavaScript系列

  • HTTP系列

  • GIT系列

  • ES6系列

  • 设计模式系列

  • CSS系列

  • 小程序系列

  • 数据结构与算法系列

  • React系列

    • React中组件之间如何通信?
    • 说说React diff的原理是什么?
    • 说说你在React项目是如何捕获错误的?
    • 说说对受控组件和非受控组件的理解?应用场景?
      • 一、受控组件
      • 二、非受控组件
      • 三、应用场景
      • 参考文献
    • 在react中组件间过渡动画如何实现?
    • 说说React服务端渲染怎么做?原理是什么?
    • 说说你在使用React 过程中遇到的常见问题?如何解决?
    • 说说对Fiber架构的理解?解决了什么问题?
    • 说说对React Hooks的理解?解决了什么问题?
    • React事件绑定的方式有哪些?区别?
    • 你在React项目中是如何使用Redux的? 项目结构是如何划分的?
    • React构建组件的方式有哪些?区别?
    • 说说对Redux中间件的理解?常用的中间件有哪些?实现原理?
    • state 和 props 有什么区别?
    • 说说 React中的setState执行机制
    • 说说React render方法的原理?在什么时候会被触发?
    • 说说你对Redux的理解?其工作原理?
    • 说说你对immutable的理解?如何应用在react项目中?
    • 说说 Real DOM 和 Virtual DOM 的区别?优缺点?
    • super() 和 super(props) 有什么区别?
    • 说说你是如何提高组件的渲染效率的?在React中如何避免不必要的render?
    • 说说对 React 的理解?有哪些特性?
    • 说说 React 性能优化的手段有哪些?
    • 说说对React refs 的理解?应用场景?
    • 说说你对React Router的理解?常用的Router组件有哪些?
    • 说说对高阶组件的理解?应用场景?
    • 说说 React 生命周期有哪些不同阶段?每个阶段对应的方法是?
    • 说说react中引入css的方式有哪几种?区别?
    • 说说React的事件机制?
    • 说说React Jsx转换成真实DOM过程?
    • React中的key有什么作用?
    • 说说React Router有几种模式?实现原理?
    • 说说对React中类组件和函数组件的理解?有什么区别?
  • Vue3系列

  • Vue系列

  • TypeScript系列

  • Webpack系列

  • 面试官
  • React系列
chst365
2023-06-28
目录

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

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

# 一、受控组件

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

举个简单的例子:

class TestComponent extends React.Component {
  constructor (props) {
    super(props);
    this.state = { username: 'lindaidai' };
  }
  render () {
    return <input name="username" value={this.state.username} />
  }
}
1
2
3
4
5
6
7
8
9

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

这是因为value被this.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>
    )
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

关于refs的详情使用可以参考之前文章 (opens new window)

# 三、应用场景

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

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

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

# 参考文献

  • http://meloguo.com/2018/10/08/受控与非受控组件/
  • https://zhuanlan.zhihu.com/p/37579677
#面试官
上次更新: 2025/04/11, 17:57:53
说说你在React项目是如何捕获错误的?
在react中组件间过渡动画如何实现?

← 说说你在React项目是如何捕获错误的? 在react中组件间过渡动画如何实现?→

最近更新
01
面试官
03-27
02
this&指针&作用域&闭包
03-27
03
前端
03-27
更多文章>
Theme by Vdoing | Copyright © 2019-2025 chst365 | 豫ICP备17031889号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式