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

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

[[410315]]

本文转载自微信公众号「JS每日一题」,作者灰灰。转载本文请联系JS每日一题公众号。

一、受控组件

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

举个简单的例子:

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

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

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

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

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

二、非受控组件

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

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

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

  1. import React, { Component } from 'react'
  2.  
  3. export class UnControll extends Component { 
  4.   constructor (props) { 
  5.     super(props); 
  6.     this.inputRef = React.createRef(); 
  7.   } 
  8.   handleSubmit = (e) => { 
  9.     console.log('我们可以获得input内的值为', this.inputRef.current.value); 
  10.     e.preventDefault(); 
  11.   } 
  12.   render () { 
  13.     return ( 
  14.       <form onSubmit={e => this.handleSubmit(e)}> 
  15.         <input defaultValue="lindaidai" ref={this.inputRef} /> 
  16.         <input type="submit" value="提交" /> 
  17.       </form> 
  18.     ) 
  19.   } 

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

三、应用场景

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

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

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

参考文献

 

  • http://meloguo.com/2018/10/08/受控与非受控组件/
  • https://zhuanlan.zhihu.com/p/37579677

 

责任编辑:武晓燕 来源: JS每日一题
相关推荐

2022-07-06 08:29:12

antdInput 组件

2021-07-12 08:35:24

组件应用场景

2021-03-18 08:00:55

组件Hooks React

2020-10-21 08:38:47

React源码

2021-07-07 08:36:45

React应用场景

2021-09-26 18:43:48

表单受控React

2021-05-31 10:35:34

TCPWebSocket协议

2021-07-08 06:51:29

React函数组件

2021-06-08 08:33:23

NodeStream数据

2021-06-07 09:41:48

NodeBuffer 网络协议

2021-06-30 07:19:36

React事件机制

2021-12-13 14:37:37

React组件前端

2021-09-06 10:51:27

TypeScriptJavaScript

2021-09-16 07:52:18

算法应用场景

2021-09-08 07:49:34

TypeScript 泛型场景

2021-11-05 07:47:56

代理模式对象

2021-11-09 08:51:13

模式命令面试

2021-11-10 07:47:49

组合模式场景

2021-11-04 06:58:32

策略模式面试

2021-11-03 14:10:28

工厂模式场景
点赞
收藏

51CTO技术栈公众号