首页 > 其他分享 >Day_1

Day_1

时间:2024-11-11 19:31:46浏览次数:1  
标签:count 渲染 setCount React state ref Day

React - 机制

Chapter 1


  • 渲染与变量

    • React的函数式组件会在每次状态发生变化时,重新执行。如果在hook中声明了普通的变量,那么会在每次状态发生变化重新渲染时,重新进行初始化。

    • export default function() {
          let x = 2;
          // 点击后x虽然加1了,但是由于没有被React监听,所以页面并不会重新渲染
          return <div onClick={() => x += 1}>{x}</div>
      }
      
    • React渲染条件是状态发生变化时,才会重新渲染。所以需要引用useState来获取一个可以创建变量被React监听的函数。(普通变量即使更新,React也不会触发渲染)

    • import { useState } from 'react';
      export default function() {
          const [ count, setCount ] = useState(0);
          let x = 1;
          // 点击后 x 虽然会加2,并且有被React监听的 count 变量。count + 1发生重新渲染,但是重新渲染导致 x 又被初始化为 1
          return (
          	<div onClick={() => {
              	x += 2;
                  setCount(count + 1);
              }}></div>
          )
      }
      
  • React的渲染阶段

    • 分为三个阶段:触发、渲染、提交
    • 触发只有两种:初次渲染、状态更新
    • 渲染:初次渲染会调用React的根组件createRoot来创建组件,后续只有更新状态才会触发React的重新渲染。
    • 提交:React会使用DOM Diff算法来减少重复渲染,只更新状态有变化的组件的DOM
  • State

    • 由React提供的hook,声明的state只会在初次渲染的时候进行初始化,之后都会保持上次的结果值。因为它是被挂载在函数外类似于架子上,以确保每次渲染后也能拿到上次的值。

    • 触发setState后,React会先挂载起来。然后会返回一个快照,就是state改变前的值。在该作用域下使用的state值都会是这个快照值,即使使用的时候state已经更新!

    • export default function() {
          const [count, setCount] = useState(0);
          
          return (
          	<div onClick={async () => {
                  setCount(count + 1);
                  // 即使这个接口在state更新后才调用,也会使用state的快照,也就是0
                  await new Promise(
                      (resolve) => setTimeout(
                          () => resolve(count)
                      , 999999));
              }}></div>
          )
      }
      
    • 如果在同一个作用域下同时调用相同的多个setState,React会进行批处理,值执行最后一个setState

    • export default function() {
          const [count, setCount] = useState(0);
          
          return (
          	<div onClick={() => {
                  setCount(count + 1);
                  setCount(count + 2);
                  // 只会执行最后一次的 setCount 也就是 3
                  setCount(count + 3);
              }}></div>
          )
      }
      
    • 执行async函数,即使在state发生改变了,接口还没await完成也不影响该函数的继续完成

    • export default function() {
          const [count, setCount] = useState(0);
          
          return (
          	<div onClick={async () => {
              	setCount(1);
                  console.log('enter');
                  // 假设该接口会在count状态更新后,才执行完成
                  await getApi();
                  console.log('out');
                  // 结果是: enter、 count值改变、 getApi执行完成、 out
              }}></div>
          )
      }
      
  • refstate的区别

    • 相同点:都会挂载在函数外的架子上,确保每次渲染后,值不会被初始化。

    • 不同点:ref其实就是一个包裹的普通对象{ current: value },并且在更改ref值后并不会触发React的重新渲染。ref可以在任何阶段改变值,并且确保他能被实时更新。而state是异步更新。

    • export default function() {
          const [count, setCount] = useState(0);
          const num = useRef(null);
          
          return (
          	<div
              	onClick={() => {
                      num.current = 2;
                      // 结果会是 0 + 2 = 2
                      setCount(count + num.current);
                  }}
              ></div>
          )
      }
      
  • ref像自定义组件传递ref

    • 直接传递会无效,需要通过React的forwardRef来包裹该函数组件,然后该函数组件的参数将会添加ref,React.forwardRef((props, ref) => <div ref={ref}></div>)
  • state同步更新

    • 如果需要state进行同步更新,可以调用react-dom中的flushSync,通过flushSync(callback)该回调函数中的state更新都将同步

标签:count,渲染,setCount,React,state,ref,Day
From: https://www.cnblogs.com/jsst/p/18540404

相关文章

  • 数字后端零基础入门系列 | Innovus零基础LAB学习Day10
    ###LAB19Innovus在线DRC检查这个章节的学习目标是学会使用数字IC后端设计实现PR工具innovus来检查drc。数字后端零基础入门系列|Innovus零基础LAB学习Day9数字后端零基础入门系列|Innovus零基础LAB学习Day8数字后端零基础入门系列|Innovus零基础LAB学习Day7首先......
  • Day02-映射(mapping)
    1.映射(Mapping)可以理解为对文档及其字段进行索引或存储的方式。可以拿Mapping和关系型数据库中的schema类比,schema在关系型数据库中指:库表包含的字段及字段存储类型等基础信息。下文中映射等价于Mapping。Elasticsearch映射,描述了文档可能具有的字段、属性、每个字段的数据......
  • 代码随想录算法训练营day43| 300.最长递增子序列 674. 最长连续递增序列 718. 最长
    学习资料:https://programmercarl.com/0300.最长上升子序列.html#算法公开课动态规划系列之子序列学习记录300.最长递增子序列(长度最少为1;dp[i]代表到i为止的最长子序列的长度;i的值根据i之前比如j的值来判断;每个地方都有可能获得最长长度)点击查看代码classSolution:def......
  • [CISCN2019 华北赛区 Day2 Web1]Hack World
    题目链接:[CISCN2019华北赛区Day2Web1]HackWorld。打开环境后如下所示。尝试输入1、2、3、4、...,发现仅存在三种结果。即1时,输出"Hello,glzjinwantsagirlfriend."。2时,输出"Doyouwanttobemygirlfriend?"。其他,输出"ErrorOccuredWhenFetchResult."。......
  • DAY109代码审计-PHP模型开发篇&动态调试&反序列化&变量覆盖&TP框架&原生POP链
    知识点1、PHP审计-动态调试-变量覆盖2、PHP审计-动态调试-原生反序列化3、PHP审计-动态调试-框架反序列化PHP常见漏洞关键字SQL注入:selectinsertupdate deletemysql_querymysqli等文件上传:$_FILES,type="file",上传,move_uploaded_file()等XSS跨站:printprint_r......
  • 11.10 javaweb day3 表格,表单标签
    表格标签:定义表格整体,可以包裹多个,1.border:表格边框的宽度2.width:规定表格的宽度3.cellspacing:规定单元之间的空间:表格的行,可以包裹多个:单元格,表头单元格可以换成<body><tableborder="3px"cellspacing="2"width="600px"><tr><th>序号</th>......
  • Day1
    Markdown标题字体Hello,worldHello,worldHello,worldHello,world引用你好,我叫贝利亚分割线图片超链接[点击跳转][青海民族大学有序abcdefg表格X【-∞,1】1【1,+∞】f(x)增函数0减函数f(x)'+极大值_......
  • [CISCN2019 华北赛区 Day2 Web1]Hack World 1
    [CISCN2019华北赛区Day2Web1]HackWorld1打开实例发现是个POST注入框盲猜SQL注入,万能密码检测无果,而且经过测试存在大量sql关键字过滤尝试使用(),出现了bool(false),确定这是一道布尔注入题and被禁用,决定采用异或^注入构建payload脚本梭哈:成功获得flag:flag{a2f7089......
  • Day42 | 动态规划 :选或不选 打家劫舍&&打家劫舍II
    Day42|动态规划:选或不选打家劫舍&&打家劫舍II动态规划应该如何学习?-CSDN博客动态规划学习:1.思考回溯法(深度优先遍历)怎么写注意要画树形结构图2.转成记忆化搜索看哪些地方是重复计算的,怎么用记忆化搜索给顶替掉这些重复计算3.把记忆化搜索翻译成动态规划基本就是......
  • 力扣题库Day3(持续更新中...)
    2024/11/10x的平方根:要求:给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去。注意:不允许使用任何内置指数函数和算符,例如 pow(x,0.5) 或者 x**0.5 。classSolution{publicintmySqrt(......