React的refs和表单组件总结

React的refs和表单组件

react中refs的使用字符串形式的ref

react核心就在于虚拟DOM,也就是React中不总是直接操页面的真实DOM元素,并且结合Diffing算法,可以做到最小化页面重绘,但有些时候不可避免我们需要一种方法可以操作我们定义的元素标签,并作出对应的修改,在React中提供了一种访问Dom节点的方式,也就是refs,组件中的标签可以通过定义ref属性来标识自己。

基本使用

import React from "react"
class App extends React.Component{
  state = {isWash:false}
  popClick=()=>{
    console.log("popClick",document.getElementsByTagName("input")[0].value)
    // console.log(this);
    const { inputRef } = this.refs;
    console.log("popClick",inputRef.value)
  }
  render(){
    return(
      <>
        <input type="text" ref="inputRef" placeholder="请输入内容" />
        <button onClick={this.popClick}>点击获取内容</button>
      </>
    )
  }
}
export default App

react中refs的使用字符串形式的ref

react中refs的使用回调形式的ref

在react单项数据流中,props是父组件与子组件交互的唯一方式,要修改一个子组件,一般只能通过props重新渲染,在某些情况下,需要在典型数据流之外强制修改子组件,被修改的子组件可能是一个React组件实例,也可能是一个DOM元素,ref属性附加到React元素上,以便访问。

  1. 使React.createRef()方法创建一个ref对象实例,附加到HTML元素上,接受底层DOM元素座位其current属性。
  2. 挂载到Class组件上,其current指向该类组件实例。
  3. 不能挂载到函数组件上,因为函数组件没有实例。 不仅可以使用react.createRef()方法创建ref实例引用react元素,还可以使用一个回调函数,绑定react元素。
import React from "react"
class App extends React.Component{
  state = {isWash:false}
  popClick=()=>{
    console.log("popClick",this.inputRef.value)
  }
  render(){
    return(
      <>
        <input type="text" ref={(e)=>{this.inputRef=e}} placeholder="请输入内容" />
        <button onClick={this.popClick}>点击获取内容</button>
      </>
    )
  }
}
export default App

React的refs和表单组件

关于回调ref调⽤的次数

如果ref会点函数是以内联函数的方式定义的,在更新过程中它会被执行两次,通过将ref的回调函数定义为class的绑定函数。

import React from "react"
class App extends React.Component {
  state = { xd: true }
  popClick = () => {
    console.log(this.input1.value);        
  }
  handleClick = () => {
    this.setState({ state: !this.state.xd });
  }
  render() {
    return <div>
      <input
        ref={(a) => ((this.input1 = a), console.log(11))}
        type="text"
        placeholder="请输⼊内容"
      />
      <button onClick={this.popClick}>点击⽣成弹窗</button>
      <button onClick={this.handleClick}>点击更新组件</button>
    </div>
  }
}
export default App

关于回调ref调⽤的次数

使用createRef创建ref

createref是使用React.createRef()创建的,并通过ref属性附加到react元素,在构造组件时,通常将refs分配给实例属性,以便在整个组件中引用他们,React.create()调用后可以想象成创建一个容器,这个容器可以存储被ref标识的元素节点,创建一个容器只能绑定一个节点,绑定多个节点会被覆盖。

import React from "react"
class App extends React.Component {
  state = { xd: true }
  inputRef = React.createRef()
  popClick = () => {
    console.log(this.inputRef.current.value);        
  }
  handleClick = () => {
    this.setState({ state: !this.state.xd });
  }
  render() {
    return <div>
      <input
        ref={this.inputRef}
        type="text"
        placeholder="请输⼊内容"
      />
      <button onClick={this.popClick}>点击⽣成弹窗</button>
    </div>
  }
}
export default App

使用createRef创建ref

react受控组件和非受控组件

受控组件

React中受控组件是指表单元素的控制交给React,表单元素的值是完全交由组件的state控制。组件内部维护state,state属性和表单元素的值建⽴依赖关系,再通过onChange事件与setState()结合更新state属性,就能达到控制⽤户输⼊过程中表单发⽣的操作,控制取值的表单输⼊元素就叫做受控组件(类似vue的数据双向绑定)

非受控组件

非受控组件是指表单元素的状态并不受React组件状态的影响,表单元素的值存储与DOM元素中,如果要React组件要获取DOM元素的值,需要通过绑定ref的方式去获取。

受控组件示例

import React from "react"
class App extends React.Component {
  handleSubmit = (e) => {
    e.preventDefault();
    console.log(this.name.value);
  };
  render() {
    return <div>
      <form onSubmit={this.handleSubmit}>
        <label>
          名字:
          <input type="text" ref={(a) => (this.name = a)} />
        </label>
        <button type="submit">提交</button>
      </form>
    </div>
  }
}
export default App

受控组件示例

非受控组件示例

import React from "react"
class App extends React.Component {
  state = { value: "传玉昨天去洗脚了" };
  handleChange = (event) => {
    console.log(event.target.value);
    this.setState({ value: event.target.value });
  };
  handleSubmit = (e) => {
    // 禁⽌表单的默认刷新
    e.preventDefault();
    console.log(this.state.value);
  };
  render() {
    return <div>
      <form onSubmit={this.handleSubmit}>
        <label>
          名字:
          <input
            value={this.state.value}
            type="text"
            onChange={this.handleChange}
          />
        </label>
        <button type="submit">提交</button>
      </form>
    </div>
  }
}
export default App

非受控组件示例

剖析React中的Diffing算法

框架中为什么要使用虚拟DOM?Diffing算法原理是什么?

当数据改变时,react会生成新的虚拟dom和旧的虚拟dom进行对比,有不同的节点则重新生成,节点相同则进行复用,不重新生成提高渲染速度。

便利数组渲染数据时,为什么要加key属性,使用index座位key会有什么问题?

key主要用在vue虚拟DOM,类似js对象格式的数据的diff算法,新旧虚拟DOM进行对比,复用不变的旧节点,渲染改变的节点,提高渲染速度,遍历数组不加key属性时,则默认使用数组的索引index,在数组元素顺序打乱时,会产生不必要的DOM更新。key值要使用唯一的id值。

react中的ref使用完结~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/126803.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

禅道项目信息通知到钉钉群配置步骤

禅道是我们常用的项目进度管理工具&#xff0c;禅道集成了webhook功能&#xff0c;可以通过发送 JSON 格式的数据到第三方hook地址&#xff0c;进行消息集成&#xff0c;包括钉钉、企业微信以及飞书。可以考虑将禅道和钉钉两者可以结合起来&#xff0c;将项目信息发送到钉钉群&…

SAP 10策略测试及简介

从今天开始将把PP模块中常用的一些策略进行一个测试,编写成系统的文档,有点策略经常不用自己都忘了一些策略的特性。所以还是有必须形成文档的形式记录下来 1、首先准备好物料 成品物料为AB0,在MRP3视图中维护对应的策略组的10 同时选择消耗模式为2.消耗期间都是999 2、其他…

软件安全测试怎么做?如何确保软件授权安全

在数字化不断演进的今天&#xff0c;软件安全测试变得至关重要。它验证了软件是否容易受到网络攻击&#xff0c;并检验恶意或意外输入对操作的影响。安全测试的目标是保障系统和信息的安全性和可靠性&#xff0c;确保它们不接受未授权的输入。 一、安全测试准备 开发者必须认识…

长安链可验证数据库,保证数据完整性的可信存证方案

近日&#xff0c;长安链发布“可验证数据库”实现了链上链下协同存储及数据完整性保证&#xff0c;显著提升长安链存储能力的可扩展性。 可信存证是联盟链最典型的应用场景&#xff0c;被广泛应用在司法、工业、农业、贸易等领域。联盟链的存证应用主要分为两个阶段&#xff1…

【Cheat Engine7.5】基础教程第三关(步骤4)

文章目录 一、简介二、操作步骤2.1、加载进程2.2、查找健康数据2.2.1、首次扫描(单浮点数100)2.2.2、点击打我&#xff0c;再次扫描数值97.112.2.3、修改数据值为50002.2.4、测试正常 2.3、查找弹药数据2.3.1、双浮点数1002.3.2、点击开火2.3.3、修改数据2.3.4、测试 2.4、通关…

福布斯:Salesforce和ZohoCRM,哪个更适合你?

上周&#xff0c;福布斯发布了《CRM软件指南》&#xff0c;从企业的实际需求出发&#xff0c;通过性价比、功能、可用性、第三方集成、分析工具等多个维度进行比较&#xff0c;最终推选出7家代表厂商。本周&#xff0c;福布斯就其中呼声较高的两家企业Salesforce、Zoho CRM做进…

Java 设计模式——享元模式

目录 1.概述2.结构3.实现3.1.抽象享元3.2.具体享元3.3.享元工厂3.4.测试 4.优缺点5.使用场景6.JDK 源码解析——Integer 类 1.概述 &#xff08;1&#xff09;享元模式 (Flyweight Pattern) 是一种结构型设计模式&#xff0c;主要通过共享对象来减少系统中的对象数量&#xff…

振南技术干货集:C语言的一些“骚操作”及其深层理解(3)

注解目录 第二章《c语言的一些“操作”及其深层理解》 一、字符串的实质就是指针 &#xff08;如何将 35 转为对应的十六进制字符串”0X23”&#xff1f;&#xff09; 二 、转义符\ &#xff08;打入字符串内部的“奸细”。&#xff09; 三、字符串常量的连接 &#xff…

一文了解Nginx及其基本配置

一、关于Nginx Nginx是一个开源的高性能HTTP和反向代理服务器。 Nginx可以用于处理静态资源、负载均衡、反向代理和缓存等任务。 Nginx被广泛用于构建高可用性、高性能的Web应用程序和网站。 Nginx具有低内存消耗、高并发能力和良好的稳定性&#xff0c;因此在互联网领域非常受…

泛微E-Mobile 6.0命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、漏洞原理 泛微E-Mobile 6.0存在命令执行漏洞的问题&#xff0c;在…

202205(第13届)蓝桥杯Scratch图形化编程青少组(国赛_中级)真题

202205(第13届)蓝桥杯Scratch图形化编程青少组(国赛_中级)真题 第 1 题 以下程序&#xff0c;小猫在移动完成后不能回到初始位置的是&#xff1f;&#xff08; &#xff09; A&#xff1a; B&#xff1a; C&#xff1a; D&#xff1a; 第 2 题 以下程序&#xff0c;询问…

基于SSM的社区生鲜电商平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

LoadRunner脚本编写之二

下面来回顾一下嵌套循环例子。 Action() {int i,j; //生命两个变量for (i1;i<5;i) //第一重循环&#xff0c;循环5次{if (i3) break; //当i等于3时&#xff0c;跳出本重循环elselr_output_message("i%d",i); //否则&#xff0c;输入i的值for (j1;j<…

VNC连接服务器实现远程桌面 --以AutoDL云服务器为例

VNC连接服务器实现远程桌面 --以AutoDL云服务器为例 针对本地机为Windows 云服务器租显卡跑些小模型很方便&#xff0c;但是当你想做可视化的时候&#xff0c;可能会遇到麻烦&#xff0c;云服务器没有显示输出界面&#xff0c;无法可视化一些检测任务的结果&#xff0c;或者可…

支持在代码编辑器中调试接口,IDEA插件推荐

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…

Java进阶(JVM调优)——阿里云的Arthas的使用 安装和使用 死锁查找案例,重新加载案例,慢调用分析

前言 JVM作为Java进阶的知识&#xff0c;是需要Java程序员不断深度和理解的。 本篇博客介绍JVM调优的工具阿里云的Arthas的使用&#xff0c;安装和使用&#xff0c;命令的使用案例&#xff1b;死锁查询的案例&#xff1b;重新加载一个类信息的案例&#xff1b;调用慢的分析案…

银河麒麟等 Linux系统 安装 .net 3.1,net 6及更高版本的方法

确定 系统的版本。华为鲲鹏处理器是 Arm64位的。 于是到windows 官网下载对应版本 .net sdk 下载地址 https://dotnet.microsoft.com/zh-cn/download/dotnet 2.下载完成后&#xff0c;再linux 服务器 上进入到文件所在目录&#xff0c;建议全英文路径。 然后依次输入以下命令 …

使用切面实现前端重复提交(防抖)

使用切面实现前端重复提交&#xff08;防抖&#xff09; 代码结构定义注解请求锁切面处理器入参对象使用注解 代码结构 原理&#xff1a; 1、前端提交保存操作&#xff1b; 2、后端通过注解指定重复提交的关键字段进行识别&#xff0c;可以有多个&#xff1b; 3、拼接关键字段&…

C#医学检验室(LIS)信息管理系统源码

LIS:实验室信息管理系统 (Laboratory Information Management System简称:LIS)。 LIS 是面向医院检验科、检验中心、动物实验所、生物医疗研究所等科研单位研发的集数据采集、传输、存储、分析、处理、发布等功能于一体的信息管理系统。 一、完善的质控&#xff1a; 从样本管理…