仲灏小栈 仲灏小栈
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

仲灏

诚意, 正心, 格物, 致知
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《前端项目基础建设》
  • HTML&CSS

  • JavaScript&TypeScript

  • Node

  • 构建

  • Vue

  • React

    • Vue 放弃繁琐的render函数,拥抱JSX
    • Awesome React
    • React 文档(vue版)
    • react 项目开发注意事项
    • 常见功能实现
    • react 常见坑集合
    • ant design pro 学习
    • ProComponents设计思路
    • 万条数据渲染优化
    • react hook 与 闭包
      • JSX
      • React生命周期
      • React 基本使用 setState
      • React 基本使用 组件生命周期
      • React 高级使用 性能优化
      • React 高级使用 高阶组件
      • React Redux使用
      • react-router 使用
      • React 原理
      • React 面试题1
      • React 面试题2
      • React 面试题3
      • React 面试题5
      • 仿jira项目笔记 项目起航:项目初始化与配置
      • 第6章 CSS 其实很简单 - 用 CSS-in-JS 添加样式
      • 第8章 Hook,路由,与 URL 状态管理
      • pro-components 源码学习
      • ant-design Spin组件封装
      • React 生命周期
    • 小程序

    • 跨端

    • Electron

    • WebGL&GIS

    • 浏览器

    • 面经

    • 其他

    • 大前端
    • React
    仲灏
    2022-07-31
    目录

    react hook 与 闭包

    # 闭包

    简单来说就是上级作用域内变量的生命周期,因为被下级作用域内引用,而没有被释放。就导致上级作用域内的变量,等到下级作用域执行完以后才正常得到释放。

    具体搜索看我《javascript》文章

    import React, { useEffect, useState } from "react";
    
    const testClosure = () => {
      let num = 0;
    
      const effect = () => {
        num += 1;
        const message = `num value in message:${num}`;
    
        return function unmount() {
          console.log(message);
        };
      };
    
      return effect;
    };
    // 执行test,返回effect函数
    const add = testClosure();
    // 执行effect函数,返回引用了message1的unmount函数
    const unmount = add();
    // 再一次执行effect函数,返回引用了message2的unmount函数
    add();
    // message3
    add();
    // message4
    add();
    // message5
    add();
    unmount(); // 在这里会打印什么呢?按照直觉似乎应该打印3,实际上打印了1
    
    // react hook 与 闭包,hook 与 闭包经典的坑
    export const Test = () => {
      const [num, setNum] = useState(0);
    
      const add = () => setNum(num + 1);
    
      useEffect(() => {
        const id = setInterval(() => {
          console.log("num in setInterval:", num);
        }, 1000);
        return () => clearInterval(id);
      }, [num]);
    
      useEffect(() => {
        return () => {
          console.log("卸载值:", num);
        };
      }, [num]);
    
      return (
        <div>
          <button onClick={add}>add</button>
          <p>number: {num}</p>
        </div>
      );
    };
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57

    结果始终输出的为1

    # react hook 闭包

    import React, { useEffect, useState } from "react";
    
    export const Test = () => {
      const [num, setNum] = useState(0);
    
      const add = () => {
        console.log("num is addEvent:", num);
        setNum(num + 1);
      };
    
      useEffect(() => {
        setInterval(() => {
          console.log("num is setInterval:", num);
        }, 1000);
    
        return () => {
          console.log(num);
        };
      }, []);
    
      return (
        <div>
          <button onClick={add}>add</button>
          <p>{num}</p>
        </div>
      );
    };
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28

    image-20220731102329660

    可以看到 use Effect 在最初执行的时候引用的初始值0,形成了闭包。在后续页面如何加载都不会影响到结果。

    # 使用更新的值

    若想想要实时输出变化后的值,需要传入监听值,值变化后重新执行其内的代码 记得清楚定时器

      useEffect(() => {
        const interval = setInterval(() => {
          console.log("num is setInterval:", num);
        }, 1000);
    
        return () => {
          clearInterval(interval);
          console.log(num);
        };
      }, [num]);
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    # 使用useRef 使用初始值

    上次更新: 2022/08/14, 18:25:44
    万条数据渲染优化
    JSX

    ← 万条数据渲染优化 JSX→

    最近更新
    01
    vim日常使用记录
    04-02
    02
    滑动窗口最大值
    04-02
    03
    有效的字母异位词
    04-02
    更多文章>
    Theme by Vdoing | Copyright © 2021-2025 izhaong | github | 蜀ICP备2021031194号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式