受控组件( controlled component )与不受控制的组件( uncontrolled component )区别

  React 的很大一部分是这样的想法,即组件负责控制和管理自己的状态。React 的很大一部分是这样的想法,即组件负责控制和管理自己的状态。

  当我们将 native HTML 表单元素( input, select, textarea 等)投入到组合中时会发生什么?我们是否应该使用 React 作为“单一的真理来源”,就像我们习惯使用React一样? 或者我们是否允许表单数据存在 DOM 中,就像我们习惯使用HTML表单元素一样? 这两个问题是受控(controlled) VS 不受控制(uncontrolled)组件的核心。

 受控组件是React控制的组件,也是表单数据的唯一真理来源。

  如下所示,username 不存在于 DOM 中,而是以我们的组件状态存在。每当我们想要更新 username 时,我们就像以前一样调用setState。

  class ControlledForm extends Component {

   state = {

     username: ‘‘

   }

  updateUsername = (e) => {

    this.setState({

       username: e.target.value,

     })

   }

  handleSubmit = () => {}

   render () {

     return (

     <form onSubmit={this.handleSubmit}>

     <input

       type=‘text‘

     value={this.state.username}

       onChange={this.updateUsername} />

    <button type=‘submit‘>Submit</button>

     </form>

     )

    }

  }

 不受控制组件( uncontrolled component )是您的表单数据由 DOM 处理,而不是您的 React 组件。

  我们使用 refs 来完成这个。

  class UnControlledForm extends Component {

    handleSubmit = () => {

  console.log("Input Value: ", this.input.value)

   }

   render () {

    return (

     <form onSubmit={this.handleSubmit}>

    <input

       type=‘text‘

            ref={(input) => this.input = input} />

          <button type=‘submit‘>Submit</button>

       </form>

      )

    }

  }

  虽然不受控制的组件通常更容易实现,因为您只需使用引用从DOM获取值,但是通常建议您通过不受控制的组件来支持受控组件。

  主要原因是受控组件支持即时字段验证,允许您有条件地禁用/启用按钮,强制输入格式,并且更多的是 『the React way』。

原文地址:https://www.cnblogs.com/kingwu/p/10066524.html

时间: 2024-07-30 12:03:41

受控组件( controlled component )与不受控制的组件( uncontrolled component )区别的相关文章

受控组件与不受控制的组件有什么区别?

React的很大一部分是将组件控制和管理自己的状态的想法. 当我们将本机HTML表单元素(输入,选择,文本区域等)投入到组合中时会发生什么?我们是否应该使用React作为"单一的真理来源",就像我们习惯使用React一样,或者我们是否允许表单数据生活在DOM中,就像我们习惯于使用HTML表单元素一样?这两个问题是控制和不受控制组件的核心. 甲控制组分为其中阵营处于组分控制和是真理的表单数据的单一来源. 如下所示,用户名不存在于DOM中,而是以我们的组件状态存在.每当我们想要更新用户名时

组件之间的通信(子组件-改变父组件的值)

在vue中,组件之间的通信,是不建议子组件改变父组件的值,因为一个父组件有可能会有很多子组件,改来改去会很难管理(别人都这样说,我信) 试试: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src='../vue.js'> </script> </head> <bod

构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介

构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介 熟悉将用于 Apache Tuscany SCA for C++ 的 API.您将通过本文了解该 API 的主要组成部分,以便快速入门. 查看本系列更多内容 | 0 评论: Ed Slattery ([email protected]), 软件工程师, IBM UK Pete Robbins ([email protected]), 软件工程师, IBM UK Andrew Borley ([email pro

第四节:Vue表单标签和组件的基本用法,父子组件间的通信

vue表单标签和组件的基本用法,父子组件间的通信,直接看例子吧. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="vue.js"></script> </head> <body> <div id="app"&

JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)

阅读目录 一.为什么组件很重要 二.Vue里面的组件基础知识 1.组件的概念 2.组件原理 3.组件使用 三.封装自己的Component 1.使用Component封装bootstrapTable 2.封装select 3.查看其他Vue框架源码 四.总结 正文 前言:转眼距离上篇 JS组件系列--又一款MVVM组件:Vue(一:30分钟搞定前端增删改查) 已有好几个月了,今天打算将它捡起来,发现好久不用,Vue相关技术点都生疏不少.经过这几个月的时间,Vue的发展也是异常迅猛,不过这好像和博

React:纯属性(pure prop),受控属性(controlled prop),半受控属性(half-controlled prop),一次性属性(onetime-prop)

Props是React组件的参数,而一个组件还可能拥有其内部状态.这里的状态是抽象的状态,不仅仅指state(欢迎补充例子). Props可以由外部调用者改变,但是组件自己不能改变自己接收到的Props,虽然组件可以监听Props的改变.相反,组件可以改变自己的状态,而外部调用者却不应该直接改变组件内部状态. 在传统的对象模型里,对象间可以互相传递消息,消息接收者受控地改变状态.当然,React组件也可以定义方法,但是尽量不要这样做,因为React整个体系是由数据流(props流)驱动的,而一个

Angular 中的 dom 操作(ViewChild)以及父子组件中通过 ViewChild 调用子组件的方法

<app-header #header></app-header> <div #myBox> 我是一个dom节点 </div> <button (click)="getChildRun()">获取子组件的方法</button> /* ViewChild获取dom节点 1.模板中给dom起一个名字 <div #myBox> 我是一个dom节点 </div> 2.在业务逻辑里面引入ViewChi

使用 function 构造函数创建组件和使用 class 关键字创建组件

使用 function 构造函数创建组件: 如果想要把组件放到页面中,可以把构造函数的名称,当作 组件的名称,以 HTML标签形式引入页面中, 因为在React中,构造函数就是一个最基本的组件. 注意: 组件的首字母必须是大写 因为React在解析所有的标签的时候,是以标签的首字母来区分的,如果标签的首字母是小写,那么就按照 普通的 HTML 标签来解析,如果首字母是大写,则按照组件的形式去解析渲染. 格式: 创建: function Hello(props) { // 在组件中,如果想要使用外

父组件给子组件传值,并在子组件里面渲染该数据

用@Component({}) 方式引入子组件JobHeader,dom结构如下: <!-- v-if="allImg.length > 0 " allImg 里面有数组了,再渲染子组件 JobHeader --> <JobHeader ref="jobHeader" v-if=" allImg && allImg.length > 0 " :data="allImg">&l