react笔记_05函数组件与类组件的区别之capture value特性

news2024/11/16 3:32:21

函数组件与类组件在写法没有好坏之分,性能差距也几乎可以忽略,而且 React 会长期支持这两种写法。
React的函数式组件和类组件之间的根本区别 在心智模型上。

  • 函数式组件具有 capture value 特性。

capture value特性

Capture Value 从字面上可以理解为固化的值。

可以认为每次 Render 的内容都会形成一个快照并保留下来,因此当状态变更而 Rerender 时,就形成了 N 个 Render 状态,而 每个 Render 状态都拥有自己固定不变Props State

也就是说在当前这个render中, state与props可以看作是 常量

举例说明-props
类组件

现在存在 类式子组件Classson, 父组件将count作为属性传递到该子组件中

  • 父组件
    function Fa (){
      const [count, setCount] = React.useState(5)
      return(
        <div>
          {count}
          <br />
          <button onClick={()=>{setCount(precount => precount+1)}}> 点我修改count </button>
         
          <br />
          <Classson count={ count }/>
        </div>
      )
    }
    ReactDOM.render(<Fa />, document.getElementById('test'))
    
  • Classson子组件
    class Classson extends React.Component{
      getCountValue = ()=>{
        setTimeout(()=>{
          console.log('@@@class', this.props.count)
        },3000)
      }
      render(){
        return(
          <button onClick={this.getCountValue}> class - 点我显示props.count值</button>
        )
      }
    }
    
  • 页面展示
    在这里插入图片描述
  • 执行步骤
    • [1]点击 “ class - 点我显示props.count值” 按钮 -> 在子组件打印通过父组件传递过去的count值;
    • [2]在3s内(子组件打印是延迟3s 的)通过 “ 点我修改count ” -> 在父组件修改count值 -> 由5变为6;
    • 等待定时器结束 -> 在控制台查看子组件打印的值
  • 执行结果
    • 控制台打印 -> @@@class 6
    • 打印的是最新数据
  • 原因 -> React 文档中描述的 props 不是不可变数据吗?为什么类组件可以展示修改后的数据呢?
    • 虽然props是不可变的,但是 在class组件中 this是可变的,react在更新过程中会修改this上的数据,保证你能够在 render和其他的生命周期方法里,读取到最新的数据(props, state),因此this.props 的调用会导致每次都访问最新的 props;
      class Classson extends React.Component{
        getCountValue = ()=>{
          const {count} = this.props
          setTimeout(()=>{
            console.log('@@@class', count)
          },3000)
        }
        render(){
          return(
            <button onClick={this.getCountValue}> class - 点我显示props.count值</button>
          )
        }
      }
      
      若是如上代码,打印的值就是5了,因为在render之前就将count值获取并赋值给变量了,之后的使用就和props的更新没有关系了
函数组件

现在存在 函数式子组件Classson, 父组件将count作为属性传递到该子组件中

  • 父组件

    function Fa (){
    const [count, setCount] = React.useState(5)
    return(
      <div>
        {count}
        <br />
        <button onClick={()=>{setCount(precount => precount+1)}}> 点我修改count </button>
       
        <br />
        <Functionson count={ count }/>
      </div>
    )
    }
    ReactDOM.render(<Fa />, document.getElementById('test'))
    
  • 函数式组件

    function Functionson (props){
      const getCountValue = ()=>{
        setTimeout(()=>{
          console.log('@@@function', props.count)
        },3000)
      }
      return (
        <button onClick={getCountValue}> function - 点我显示props.count值</button>
      )
    }
    
  • 页面展示
    在这里插入图片描述

  • 执行步骤

    • [1]点击 “ function - 点我显示props.count值 ” 按钮 -> 在子组件打印通过父组件传递过去的count值;
    • [2]在3s内通过 “ 点我修改count ” -> 在父组件修改count值 -> 由5变为6;
    • 等待定时器结束 -> 在控制台查看子组件打印的值
  • 执行结果

    • 控制台打印 -> @@@function 5
    • 打印的是之前render的数据
  • 原因 -> React 文档中描述的 props 是不可变数据

    • 函数组件中不存在this,因此在函数组件中props是不可变的;
    • 因此在每次render中 props就可以看作一个常量
    • 逻辑如下
      挂载组件时,count值为5 ,此时生成了一个快照,当我点击按钮时,此时放入异步队列的想当于
      setTimeout(()=>{
         console.log('@@@function', 5)
       },3000)
      
      而不是
      setTimeout(()=>{
        console.log('@@@function', props.count) 
      },3000)
      
      因此当在父组件修改count值,造成子组件rerender时,不会影响上一次的render的数据,而是重新形成一个新的快找,在这个render中count值为6
总结
  • 总结 -> 对于props的值
    • 类组件 展示的是修改后的值;
    • 函数组件 展示的是 修改前的值;
举例说明-state

使用hook useState同样存在capture value特性

  • 需求: 实现一个按钮默认显示 false,点击后立即更改为 true,两秒后变回 false
  • 类组件
      class Mycomponent extends React.Component{
      state={flag:false} 
      editFlag = ()=>{
        this.setState((state)=>({flag: !state.flag}),()=>{
          console.log(this.state)
        })
        setTimeout(()=>{
          this.setState((state)=>({flag: !state.flag}))
        },2000)
      }
      render(){
        const { flag } = this.state
        return (
          <div>
            <span>{ flag ? '显示' : '隐藏'}</span>
            <button onClick={this.editFlag}>点击修改状态</button>
          </div>
        )
      }
    }
    
    点击 “点击修改状态” 按钮之后, 页面文本会变为 “显示”, 2s后会显示“隐藏”。
  • 函数组件
    function Mycomponent (){
     const [flag ,setFlag ] = React.useState(false)
     let timer
     const editFlag = () => {
       setFlag(!flag)
       timer = setTimeout(()=>{
         setFlag(preState =>(!preState))
       },2000)
     }
     React.useEffect(()=>{
       return (
         clearInterval(timer)
       )
     })
     return (
         <div>
           <span>{ flag ? '显示' : '隐藏'}</span>
           <button onClick={editFlag}>点击修改状态</button>
         </div>
       )
    }
    
    修改我们可以将修改方法的第一个参数传入回调函数,接收值就是上一次的值
    setFlag(preState =>(!preState))
    
    但是若是我们在修改后去获取这个值呢
    function Mycomponent (){
     const [flag ,setFlag ] = React.useState(false)
     let timer
     const editFlag = () => {
       setFlag(!flag)
       timer = setTimeout(()=>{
         console.log('状态', flag) // false而不是true
       },2000)
     }
     React.useEffect(()=>{
       return (
         clearInterval(timer)
       )
     })
     return (
         <div>
           <span>{ flag ? '显示' : '隐藏'}</span>
           <button onClick={editFlag}>点击修改状态</button>
         </div>
       )
     }
    
    原因是初始化时,生成的 快照中, flag为false,上述代码相当于如下
    const editFlag = () => {
     setFlag(!false)
     timer = setTimeout(()=>{
       console.log('状态', false) // false而不是true
     },2000)
    }
    
    当 setFlag(!false) 结束 去rerender时已经 属于下一次render了!

参考文档

  • 函数组件与类式组件的区别
  • Capture Value 特性
  • 函数组件与类式组件的区别

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【已解决】office提示你的许可证不是正版,你可能是盗版软件的受害者?

三步即可先看效果步骤1、下载工具2、找到 修复Office许可证明问题3、填入KMS主机&#xff0c;点击修复如何查看正在使用的 KMS 主机地址&#xff1f;先看效果 步骤 1、下载工具 工具下载&#xff1a;https://otp.landian.vip/zh-cn/ 2、找到 修复Office许可证明问题 3、填入…

PEM格式RSA密钥解析(一)

Base64转16进制格式 后缀是.PEM 的数字证书是 BASE64 编码的&#xff0c;以 ASCII 码来表示。常见的证书如下所示&#xff08;以 RSA1024 为例&#xff09;&#xff1a; 私钥&#xff1a; ----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgHU4CF6yvqb5WBhwcYfvh/o3NpwcSJlcfj0nIZ…

下载神器IDM安装与使用(保姆级教程)

下载神器IDM安装与使用&#xff08;保姆级教程&#xff09; 文章目录下载神器IDM安装与使用&#xff08;保姆级教程&#xff09;前言一、下载地址二、IDM是什么&#xff1f;三、作用与特点四、安装步骤总结前言 众所周知&#xff0c;下载工具是大家电脑里必装的软件之一。 但大…

大数据时代,制造业人要知道,为什么有ERP还要上SRM系统

每个公司都是在一个供应链中&#xff0c;每个公司都有自己的上下游。如今&#xff0c;企业间的竞争已不再是单一企业的单打独斗&#xff0c;而是由价值链与价值链、供应链与供应链的较量。上游厂商&#xff08;供应商&#xff09;直接影响到公司的产品与服务的价格及竞争能力。…

零售企业全域数据打通最佳实践

在数字化转型的实战中&#xff0c;零售企业面临着巨大的挑战&#xff0c;过去三年线下流量锐减&#xff0c;甚至不少门店关停&#xff0c;不少零售企业布局线上&#xff0c;但是这个也给零售企业带来另外一个挑战&#xff1a;IT资源有限的情况下&#xff0c;线上&线下的流量…

密码学_RC4算法

在密码学中&#xff0c;RC4&#xff08;来自Rivest Cipher 4的缩写&#xff09;是一种流加密算法&#xff0c;密钥长度可变。它加解密使用相同的密钥&#xff0c;因此也属于对称加密算法。RC4是有线等效加密&#xff08;WEP&#xff09;中采用的加密算法&#xff0c;也曾经是TL…

电脑看不了视频?视频恢复,3个方案解决

一般电脑播放不了视频&#xff0c;原因大多是Flash插件损坏了&#xff0c;因为电脑上的视频和所有的Flash都需要Flash插件才可以正常使用。电脑看不了视频怎么办&#xff1f;你需要对Flash进行修复或者重新安装它。一起来看看下面三个方案&#xff0c;解决电脑视频看不了的问题…

传输系统WSON倒换时的路由震荡问题【脱敏版】

【摘要】在省干传输OXC系统中使用WSON倒换时&#xff0c;测试过程中发现WSON倒换时存在电路频繁up down的现象&#xff0c;研究发现倒换时光信道建立时间过程中光信号不是一个稳定的状态&#xff0c;设备的色散补偿模块会在这个不稳态下出现异常&#xff0c;导致色散补偿模块不…

2023,出海企业,数据跨境传输如何实现合规?

随着防疫政策的优化&#xff0c;2023年出海企业开始加速海外业务&#xff0c;此前&#xff0c;浙江、四川、广东、江苏等地政府都纷纷出手“包机出海抢订单“。而伴随着企业的全球业务拓展&#xff0c;数据跨境活动日益频繁&#xff0c;跨境数据的安全风险也日益凸显&#xff0…

通过反射机制调用方法

package com.javase.reflect;import com.javase.service.UserService;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ResourceBundle;/*** 通过反射机制调用方法&#xff08;必须掌握&#xff0c;五颗星*****&#…

小程序开发经验分享(2)前端开发

一、开发前的准备 开发环境:微信推出的官方开发工具。 申请 Appid :相关公司或个人申请到 Appid 后可以进行真机的调试和预览,否则只能在开发工具里进行调试。 备案域名和证书:微信小程序仅支持 https 协议,所以务必绑定含有证书的域名,才能在正式上线后进行使用。 二…

jumpserver源码包安装

cd /opt wget https://github.com/jumpserver/installer/releases/download/v2.20.1/jumpserver-installer-v2.20.1.tar.gz tar -xf jumpserver-installer-v2.20.1.tar.gz cd jumpserver-installer-v2.20.1 ​ vim config-example.txt 在config-example配置文件里配置mysql&…

nacos 2.2部署指南,并配置mysql数据库

首先进入到/opt cd /opt 1.下载安装包 wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz 2.解压 tar -zxvf nacos-server-2.2.0.tar.gz 3.修改配置 3.1修改为单机部署模式(默认为 vi /opt/nacos/bin/startup.sh 55行,示例: exp…

Cypress 安装及入门排坑指南

最近准备给公司项目做重构&#xff0c;原本是打算使用Jest来作为测试工具的&#xff0c;刚好无意之中接触到了Cypress这款测试工具&#xff0c;虽然用上它非常的不容易&#xff08;简直是一波三折&#xff09;&#xff0c;但是用上了之后觉得真香啊。我们本篇文章就是讲Cypress…

C进阶_C语言_浮点数存储规则_浮点型在内存中的存储

在开始讲解之前&#xff0c;我们看一下常见浮点数的写法&#xff1a; 3.14159 1E10&#xff08;它代表1.0乘以10的10次方&#xff09; 浮点型家族里有float、double、long double类型。 浮点型的表示范围是多少&#xff1f;我们打开float.h就能看到&#xff08;这里用everythi…

什么牌子的蓝牙耳机好?好用的蓝牙耳机排行

现如今&#xff0c;蓝牙耳机的用途越来越广泛&#xff0c;无论是追剧、游戏、通话、运动等&#xff0c;都能看到使用蓝牙耳机的人。在日常的使用中蓝牙耳机也逐渐取代有线耳机成为受人们欢迎的存在&#xff0c;那么&#xff0c;什么牌子的蓝牙耳机好&#xff1f;接下来&#xf…

功能强大的python包sklearn

1. sklearn简介sklearn是基于python语言的机器学习工具包&#xff0c;是目前做机器学习项目当之无愧的第一工具。 sklearn自带了大量的数据集&#xff0c;可供我们练习各种机器学习算法。 sklearn集成了数据预处理、数据特征选择、数据特征降维、分类\回归\聚类模型、模型评估等…

基于YOLO实践布匹缺陷检测

在缺陷检测领域中&#xff0c;越来越多看到AI的身影&#xff0c;路面缺陷、生产缺陷、PCB缺陷、瓶装酒缺陷检测等等&#xff0c;目标检测等模型发挥着越来越多的作用&#xff0c;像瓷砖缺陷和布匹缺陷这类平面类型的缺陷也不例外&#xff0c;最近做的项目中大多和这类型的数据有…

回顾2022,那些令人印象深刻的AI突破

文 | 付奶茶2022年是令人印象深刻的一年。在这一年中&#xff0c;我们目睹了许多前所未有的AI模型的出现&#xff0c;这些模型不断刷新着人类对AI力量的认知。关于这一年中最好的工作&#xff0c;每个人都有自己不同的看法。在这篇文章中&#xff0c;我们跟随Alan D. Thompson在…

对Mysql 超时配置项进行深入理解!

1 JDDB超时JDBC 是 Java 应用程序中用于访问数据库的一套标准 API类型4驱动是通过socket来处理字节流的。如果socket超时设置不合适&#xff0c;类型4驱动也可能有同样的错误&#xff08;连接被阻塞&#xff09;。1.2 JDBC超时层次应用程序WAS与数据库间的超时的层次更上层的超…