vue3源码解析

news2024/11/18 7:24:58

vue3源码解析与前端网络安全

VUE 3 拓展

vue3 对比 vue2

响应式数据

vue2 的响应式数据是通过 Object.defineProperty 进行数据劫持,其存在一些缺点:

  • 必须要预知劫持的 key 是什么,并不能很好的监听到对象属性的添加、删除;
  • 初始化递归遍历整个 data ,导致深层嵌套数据造成性能负担;

vue3 的响应式数据是通过 Proxy 进行数据劫持的,可以很好的规避 Object.defineProperty 带来的缺陷

组合式 Api
  • 代码更利于维护和封装
  • Vue2 中,我们会在一个 vue 文件的 data,methods,computed,watch 中定义属性和方法,共同处理页面逻辑 ,一个功能的实现,代码过于分散
  • vue3 中,代码是根据逻辑功能来组织的,一个功能的所有 api 会放在一起(高内聚,低耦合),提高可读性和可维护性,基于函数组合的 API 更好的重用逻辑代码
Diff 算法优化

首先了解 vue 的 虚拟dom
虚拟DOM就是通过 JS 去生成一个 AST 节点树
在这里插入图片描述

一个dom节点上的属性是非常多的,所以直接操作DOM是非常浪费性能的,解决方案就是可以通过JS的计算性能去换取操作DOM所消耗的性能,既然逃不开操作DOM,那我们可以尽可能少的去操作DOM;

diff 算法

在这里插入图片描述
规则一:前序对比
在这里插入图片描述
规则二:尾序对比
在这里插入图片描述
规则三:新增对比
在这里插入图片描述
在这里插入图片描述
规则四:卸载移除对比
在这里插入图片描述
规则五:乱序对比
vue3.x 中标记和提升所有的静态节点,diff 的时候只需要对比动态节点内容,尽可能复用标记的静态节点。

更好的 TSX 语法支持
// App.tsx

import {ref} from 'vue'

let v = ref<string>('')

const renderDom = ()=>{
    return (
    <div>
        <input v-model = {v.value} type="text" />
        <div>{v.value}</div>
    </div>
    )
}

export default renderDom
<template>
    <renderDom></renderDom>
</template>

<script setup lang="ts">
import renderDom from './App'
</script>

ref 全家桶

  1. ref 将数据包装成响应式数据;
    在这里插入图片描述
  2. shallowRef (浅层的ref,一般配合triggerRef强制更新dom);
  3. triggerRef (手动执行与shallowRef关联的副作用,强制更新视图,ref的视图更新也是因为触发了triggerRef)
  4. customRef (自定义ref,场景:可以做一些防抖操作)
  5. 在这里插入图片描述

reative 全家桶

  1. reactive 接受复杂数据类型,返回响应式数据;
    1. 数组的赋值两种方式:push解构的值;
    2. 将数组包装成对象,通过属性赋值;
      在这里插入图片描述
      泛型约束了类型,不能绑定基本数据类型
      在这里插入图片描述
      shallowReactive

to 系列全家桶

  1. toRef, 如果想让响应式数据和以前的数据关联起来,并且更新响应式数据之后还不想更新视图,那么就可以使用 toRef ;
    在这里插入图片描述
    在这里插入图片描述
  2. toRefs,解构会破坏数据的响应式,通过 toRefs 可以解构出响应式的数据;
    源码解析:其实就是把reactive 对象的每一个属性都变成了ref 对象循环 调用了toRef
    在这里插入图片描述
  3. toRaw ,将响应式数据中得到原始数据;
    应用场景:
    A-发起请求前对数据的处理,不希望更新视图,可以先把双向绑定的响应式数据转成原始数据,再进行处理发请求;
    B-渲染具有不可变数据源的大列表时,可以跳出响应式的追踪,提高性能;
    在这里插入图片描述

组件通信 Provide inject

通常,当我们需要从父组件向子组件传递数据时,我们使用 props。想象一下这样的结构:有一些深度嵌套的组件,而深层的子组件只需要父组件的部分内容。在这种情况下,如果仍然将 prop 沿着组件链逐级传递下去,会很麻烦。

场景A:通过路由进行局部组件的刷新,对数据进行操作之后需要手动刷新页面;
场景B:父组件有很多数据需要分发给其子代组件的时候

源码解析:
在这里插入图片描述

Inject 接收的值是unknown的问题:
在这里插入图片描述
组件实例化的时候注入 provides 的值
在这里插入图片描述

自定义Hooks( 区别于vue2的mixins )

钩子主要用来处理复用代码逻辑的封装,在vue2的时候就已经有 Mixins 去做这样的事情了, Mixins 就是将这些多个相同的逻辑抽离出来,各个组件只需要引入 mixins 就能实现一次写代码,多组件受益的效果
缺点是会涉及覆盖问题,同名data、methods、filters覆盖,以及变量来源不明确,不利于阅读,使代码难以维护;

为了解决mixins存在的问题,Vue3.x版本使用了自定义Hooks去做这样的事情。

开源的hooks库(VueUse)

// 定义转换base64的hooks   
import { onMounted } from 'vue'
 
type Options = {
    el:string
}
export default function(options:Options)Promise<{baseUrl:string}>{
    return new Promise((reslove)=>{
        onMounted(()=>{
            let img:HTMLImageElement = document.querySelector(options.el) as HTMLImageElement
            img.onload = () => {
            resolve({
                baseUrl: base64(img)
            })
        }
    })
    
        const base64 = (el:HTMLImageElement) => {
            const canvas = document.createElement('canvas')
            const ctx = canvas.getContext('2d')
            canvas.width = el.width
            canvas.height = el.height
            ctx?.drawImage(el,0,0,canvas.width,canvas.height)
            return canvas.toDataURL('image/png')
        }
    })
  
}


// 使用 hooks
<template>
    <div>
        <img id='img' src='./assets/test.png'>
    </div>
</template>

<script lang="ts" setup>
import useBase64 from './hooks'

useBase64({el: '#img'}).then(res=>{
    window.console.log(res.baseUrl)
})
</script>

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

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

相关文章

家政服务行业怎么做微信小程序开发

随着科技的不断发展&#xff0c;微信小程序已经成为了人们生活中不可或缺的一部分。在家政服务领域&#xff0c;微信小程序也发挥出了重要的作用。本文将探讨家政服务在微信小程序上可以实现的功能。 一、展示家政服务信息 微信小程序可以作为一个展示家政服务的平台&#xff…

XML外部实体注入攻击XXE

xml是扩展性标记语言&#xff0c;来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文档元素&#xff0c;一般无法直接打开&#xff0c;可以选择用excl或记事本打…

虚拟桌宠模拟器:VPet-Simulator,一个开源的桌宠软件, 可以内置到任何WPF应用程序

虚拟桌宠模拟器&#xff1a;VPet-Simulator&#xff0c;一个开源的桌宠软件, 可以内置到任何WPF应用程序 虚拟桌宠模拟器 一个开源的桌宠软件, 可以内置到任何WPF应用程序 获取虚拟桌宠模拟器 OnSteam(免费) 或 通过[Nuget]内置到你的WPF应用程序 1.虚拟桌宠模拟器 详细介绍 …

2023 10月2日 至 10 月8日学习总结

学了半天 想了还是需要进行个总结 1.做的题目 NSSCTF [BJDCTF 2020]easy_md5 md5实现sql-CSDN博客 [网鼎杯 2020 白虎组]PicDown python反弹shell proc/self目录的信息_双层小牛堡的博客-CSDN博客 [CISCN2019 华北赛区 Day1 Web5]CyberPunk 二次报错注入_双层小牛堡的博客-…

XPS表征(工作原理与特点)-科学指南针

在做 X 射线光电子能谱(XPS)测试时&#xff0c;科学指南针检测平台工作人员在与很多同学沟通中了解到&#xff0c;好多同学仅仅是通过文献或者师兄师姐的推荐对XPS有了解&#xff0c;但是对于XPS测试原理还属于小白阶段&#xff0c;针对此&#xff0c;科学指南针检测平台团队组…

Laya3.0 入门教程

点击play箭头 点击右边的开发者工具 就会弹出 chrome的调试窗口 然后定位到你自己的ts文件 直接在ts里断点即可 不需要js文件 如何自动生成代码&#xff1f; 比如你打开一个新项目 里面显示的是当前场景 只需要点击 UI运行时 右边的框就可以了 他会自动弹窗提示你 创建一个文…

iNet Network Scanner for Mac,轻松管理网络

iNet Network Scanner for Mac是一款强大的网络扫描工具&#xff0c;能够帮助你轻松管理和监控网络设备。 无论你是个人用户还是企业管理员&#xff0c;iNet Network Scanner都能为你提供全面而方便的网络管理体验。它可以快速扫描并识别局域网中的所有设备&#xff0c;包括电…

竞赛选题 深度学习 机器视觉 人脸识别系统 - opencv python

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 人脸识别系统 该项目…

主机加固,防勒索病毒

​近年来&#xff0c;计算机以及互联网应用在中国得到普及和发展&#xff0c;已经深入到社会每个角落&#xff0c;政府&#xff0c;经济&#xff0c;军事&#xff0c;社会&#xff0c;文化和人们生活等各方面都越来越依赖于计算机和网络&#xff0c;电子政务&#xff0c;无纸办…

Flutter的Platform介绍-跨平台开发,如何根据不同平台创建不同UI和行为

文章目录 Flutter跨平台概念介绍跨平台开发平台相关性Platform ChannelPlatform-specific UIPlatform Widgets 如何判断当前是什么平台实例 Platform 类介绍获取当前平台的名称检查当前平台其他属性 利用flutter设计跨Android和IOS平台应用的技巧1. 遵循平台的设计准则2. 使用平…

Numpy Notes

np.linalg.norm() Matrix or vector norm return one of eight different matrix norms, or one of an infinite number of vector norms (described below), depending on the value of the ord parameter. np.linalg.norm() 用于求范数linalg : linear(线性) algebra(代数…

修改ubuntu服务器fs文件最大打开数

起因 在对项目进行压测的时候&#xff0c;请求异常 java.net.SocketException: socket closed&#xff0c;查看nginx代理服务器的日志。tail -f -n500 /var/log/nginx/error.log 显示 文件打开数太多socket() failed (24: Too many open files) while connecting to upstream …

新手小白教程之 圈X-QuantumultX i茅台自动预约教程

注意 本教程需要提前准备好BoxJS&#xff0c;QX最新版。 脚本作者onz3v 学习交流频道 https://pd.qq.com/s/2v3a5vkmj 第一步 配置QX 我们使用编辑配置文件&#xff0c;来配置脚本。 打开QX&#xff0c;点击左下角配置文件图标。 在rewrite_local输入以下代码 https://a…

基于小波神经网络的网络流量预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022A 3.部分核心程序 ........................................................... %% 总流量数据 input(:,1)dat…

Hive - 检查分区 partition 是否存在

目录 一.引言 二.检查最新分区 三.检查任意分区 四.总结 一.引言 国庆期间任务因为某个 hive 表分区未成功创建&#xff0c;导致后续任务异常&#xff0c;为此也是苦逼的 6 点起床修复 bug。发生异常对应表的正常分区如下图所示&#xff0c;为 dt、hour 双分区: 为了保证后…

c++视觉处理---cv::Sobel()`算子

cv::Sobel()算子 cv::Sobel()是OpenCV库中的函数之一&#xff0c;用于计算图像的Sobel梯度。Sobel梯度是一种常用的图像处理技术&#xff0c;用于检测图像中的边缘和轮廓。 以下是cv::Sobel()函数的一般用法和参数&#xff1a; void cv::Sobel(cv::InputArray src, //…

C++ 获取文件创建时间、修改时间、大小等属性

简介 获取文件创建时间、修改时间、大小等属性 代码 #include <iostream> #include <string.h> #include <time.h>void main() {std::string filename "E:\\LiHai123.txt";struct _stat stat_buffer;int result _stat(filename.c_str(), &s…

2023年中国叉车租赁行业现状分析:设备价格昂贵,租赁市场需求增长[图]

叉车租赁行业是指专门提供叉车租赁服务的行业。叉车是一种用于搬运、装卸和堆垛物品的机械设备&#xff0c;广泛应用于仓储、物流、建筑、制造业等领域。由于购买叉车需要较高的成本投入&#xff0c;而且使用频率可能不高&#xff0c;许多企业和个人选择通过租赁叉车来满足短期…

AI智剪助力,批量处理视频无忧,创作不再难

随着人工智能技术的迅速发展&#xff0c;一个名为“AI智剪”的新兴领域正引发全球范围内的关注。作为人工智能与视频剪辑技术的结合&#xff0c;AI智剪为影像产业带来了前所未有的变革&#xff0c;不仅极大地提高了剪辑效率&#xff0c;还为创作者提供了无限的可能性。今天我们…

基于SpringBoot的大型商场应急预案管理系统

目录 前言 一、技术栈 二、系统功能介绍 员工信息管理 预案信息管理 预案类型统计 事件类型管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍…