当前位置: 首页 > news >正文

vu3响应式原理 代码分析

上个文章我们说了vue2的原理,看这里。
现在简单说一下vue3的原理。
vue3 建议大家还是多多看看官网,毕竟语法都变了,虽然兼容vue2,但是最好按照官网说的取用vue3 .不然会有一系列的报错。很是头疼。
例如 vue2中用 data(){return { }}等, vue3 就舍弃了这个,直接用的是setup(){…, return{导出定义的属性/对象、数组等、函数等}}
在这里插入图片描述

vue3的响应式:实现原理

通过Proxy(代理):拦截对象中任意属性的变化,包括:属性值读写。属性的添加,属性的删除等。
通过Reflect(反射):对被代理对象的属性进行操作。

在vue3 中要注意它新增了一个ref函数 此ref非vue2中的ref 。
这里的

ref

接受一个内部值并返回一个响应式且可变的 ref 对象。ref 对象仅有一个 .value property,指向该内部值。(可以大白话的理解为基础的数据使用)

const count = ref(0)
console.log(count.value) // 0
也就是要跟一个 .value ,后边发现很扯。

然后有一个

reactive

:返回对象的响应式副本(大白话的理解为复杂数据数据)

const obj = reactive({ count: 0 })

响应式转换是“深层”的——它影响所有嵌套 property。在基于 ES2015 Proxy 的实现中,返回的 proxy 是不等于原始对象的。建议只使用响应式 proxy,避免依赖原始对象。
当将 ref 分配给 reactive property 时,ref 将被自动解包。
我们写的时候也就避免了 .value 的形式。

<template>
    <h1>
      vue3
      <p>{{person.name}}</p>
      <p>{{person.age}}</p>
      <p v-show= "person.sex"> 性别:{{person.sex}}</p>
      <p>{{person.job.type}}</p>
      <p>{{person.job.salary}}</p>
      <p>{{person.job.a.b.c}}</p>
      <button @click="changeInfo">更新</button>
      <button  @click="setInfo">添加属性</button>
      <button  @click="delInfo">删除属性</button>
  </h1>
</template>
<script>
import { reactive  } from  'vue'
export default {
  name: 'App',
  setup(){
    // 基础数据
    let person = reactive({
      name : '张',
      age : '19',
      job: {
        type:" 前端",
        salary: "30k",
        a:{
          b:{
            c:555
          }
        }
      }
    })
    function changeInfo(){
      person.name= 'lisi'
      person.age= '34'
      person.job.type = '经理' 
      person.job.salary = '40k'
      // job.value.type = '经理' 
      // job.value.salary = '40k'
      person.job.a.b.c = 666
      console.log(person);
    }
    function setInfo(){
      person.sex='男'
    }
    function delInfo(){
      delete person.name 
    }
    return {
      person,changeInfo, setInfo, delInfo
    }
  }
}
</script>

看一下这里
在这里插入图片描述

对比 reactive 和 ref

1 从定义数据角度对比:
ref 用来定义:基本数据类型;
reactive用来定义:对象(数组)类型数据;
注意: ref 也可以用来定义对象(或数组)类型数据,他内部会自动通过reactive转我代理对象。
2 从原理角度对比:
ref 通过Object.defineProperty()的get与set来实现响应式(数据劫持)。
reactive 通过 使用Proxy来实现响应式(数据劫持),并开通Reflect操作 源对象 内部的数据。
3 从使用角度对比:
ref 定义的数据:操作数据需要 .value ,读取数据时模板中直接读取不需要 .value。
reactive 定义的数据:操作数据与读取数据 均不需要 .value.

后期在继续优化。有不同见解欢迎交流。

相关文章:

  • Java Tomcat SSL 服务端/客户端双向认证(一)
  • vue3中 setup注意点
  • redis简介
  • 《Spark GraphX in Action》书评及作者访谈
  • vue3的 computed 计算属性 与 watch监听
  • Diomidis Spinellis:有效的调试
  • ListView的简单使用
  • vue3技术 watch时 value问题
  • 最大流学习笔记(1)
  • vue3 watchEffect 函数
  • Apaceh 多虚拟主机多站点配置两种方案
  • ubutnu安装geany
  • vue3生命周期钩子函数
  • 每天一个linux命令(11):nl命令
  • ABP文档 - 本地化
  • [译] React v16.8: 含有Hooks的版本
  • 【前端学习】-粗谈选择器
  • angular2开源库收集
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • go append函数以及写入
  • Java Agent 学习笔记
  • Python中eval与exec的使用及区别
  • React-生命周期杂记
  • Redis学习笔记 - pipline(流水线、管道)
  • Vue ES6 Jade Scss Webpack Gulp
  • vue2.0项目引入element-ui
  • Yii源码解读-服务定位器(Service Locator)
  • 经典排序算法及其 Java 实现
  • 数据科学 第 3 章 11 字符串处理
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 我是如何设计 Upload 上传组件的
  • 小程序button引导用户授权
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • HanLP分词命名实体提取详解
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​如何防止网络攻击?
  • #LLM入门|Prompt#3.3_存储_Memory
  • #QT(串口助手-界面)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (4.10~4.16)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • . NET自动找可写目录
  • .jks文件(JAVA KeyStore)
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现