每日一VUE——响应性原理(重要的一批!!!)

文章目录

    • 响应性原理
      • setup
      • 副作用函数
      • Proxy
      • 响应式数据
    • 响应式API
      • reactive和ref
      • toRef和toRefs
      • computed
      • watch
      • provide和inject

响应性原理

响应性本质是监听数据变化,并做出相应的处理

setup

setup函数就是生命周期函数,它替代了beforeCreate和created函数,在setup中可以访问这两个生命周期函数之外的所有生命周期函数,访问生命周期函数时需要在函数名前加上"on"

副作用函数

副作用函数的执行会影响到函数作用域之外的其他内容,如果能够构建一类数据,当数据发生改变时,可以影响到所有依赖他函数的执行,就实现了数据的响应。

也就是说,当一个数据发生变化时,其对应的副作用函数可以重新执行,那么这个数据就是响应式数据

Proxy

代理,创建一个中间层(代理对象),他在对象与外界之间设置了拦截,拦截的是读写数据对象的操作:

  • 当数据被访问时,会触发getter方法中的收集依赖,即在数据对象与副作用函数之间建立依赖关系
  • 当修改数据时,会触发setter方法中的派发更新,即逐个执行与该数据对象由依赖关系的副作用函数

响应式数据

响应式数据就是通过副作用函数和Proxy实现的,

  1. 当VUE项目初始化时,会遍历每个属性,使用Proxy对其进行封装(数据劫持)
  2. 当使用一个响应式数据的时候,VUE会记录当前依赖,在依赖图中建立对应的记录(依赖追踪)
  3. 当响应式数据发生变化时,VUE会依次执行依赖图中的函数

在这里插入图片描述

响应式API

reactive和ref

  • reactive函数根据传入的对象,返回一个深度响应式对象。深度就是无论层级嵌套多深,都会触发数据响应。reactive函数就是根据Proxy来实现响应式的,通过对传入的对象进行包裹,并创建其Proxy对象。
  • ref函数只接收一个基本数据类型,并返回一个响应式且可变的数据对象,这个数据对象是一个具有value属性的对象

对响应式对象直接赋新值,会使响应式对象失去响应性:

import { reactive } from 'vue';

const state = reactive({
  user: {
    name: 'Alice',
    details: {
      age: 30,
      address: '123 Main St'
    }
  }
});

// 假设我们对state.user.details进行赋新值操作
state.user.details = { age: 31, address: '456 Elm St' };

// 这个新对象{ age: 31, address: '456 Elm St' }不是响应式的
// 因此,对它的修改不会触发视图更新

在上面的例子中,我们对state.user.details进行了赋新值操作,这个新对象{ age: 31, address: '456 Elm St' }不是响应式的。如果你希望新对象也是响应式的,你应该使用reactive来确保新对象的响应性:

state.user.details = reactive({ age: 31, address: '456 Elm St' });

这样,新的对象details将保持响应性,任何对它的修改都会正确地触发视图更新

toRef和toRefs

这个两者前都可以将响应时对象的属性也转换成响应式的,区别是前者一次只能转换一个属性,后者式可以将所有属性都转换为响应式的

toRef(props,‘name’)

const name_props = toRef(props,‘name’)
console.log(name_props.value)

toRefs(props)

const update_props = toRef(props)
console.log(update_props.name.value)

computed

computed依赖于响应式原始数据,当数据变化时会触发自动触发computed函数,得到一个全新的数据

computed仅接受一个回调函数作为参数,返回一个ref对象

watch

watch函数用于监听指定数据,并在回调函数中调用副作用函数,该函数接受一个被监听对象和回调函数,回调函数包括被监听对象的原始值和更新后的值

const count = Vue.ref(1);
Vue.watch(count,(newVal,oldVal)=>{
	console.log(oldVal)
	console.log(newVal)
})

provide和inject

当需要在多个层级的组件之间共享数据和函数时,他们允许跨组件定义依赖关系,不需要通过每个层级的props传递数据

privide函数可以提供数据和函数,为后代组件使用

inject用于给后代组件注入provide所提供的数据和函数

当然,因为VUE的单项数据流原则,当父组件的数据发生变化时子组件数据会自动更新,但子组件不能直接修改父组件传递过来的值

若有错误与不足请指出,关注DPT一起进步吧!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言—深度剖析函数指针,函数指针数组

我们先来看一段代码 #include <stdio.h> void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; }输出的是两个地址&#xff0c;这两个地址是 test 函数的地址。 那我们的函数的地址…

WebGl/Three 粒子系统 人物破碎及还原运动

粒子 首先&#xff0c;加载模型&#xff0c;这是万千粒子的前身&#xff0c;模型对象由很多面构成&#xff0c;这些面又是由各个点构成的&#xff0c;所以可以将模型的几何体对象geometry赋给粒子对象&#xff0c;粒子物体用Points方式渲染 bloader.load("obj/female02/Fe…

多线程同步:使用 std::mutex 和 std::unique_lock 保护共享资源

在当今的软件开发中&#xff0c;多线程编程是一项至关重要的技术&#xff0c;它允许程序同时执行多个任务&#xff0c;从而提高应用程序的效率和响应速度。然而&#xff0c;多线程环境也带来了数据安全和一致性的挑战。在多个线程需要访问和修改同一数据资源的情况下&#xff0…

STM32学习和实践笔记(14):按键控制实验

消除抖动有软件和硬件两种方法 软件方法就是在首次检测到低电平时加延时&#xff0c;通常延时5-10ms&#xff0c;让抖动先过去&#xff0c;然后再来检测是否仍为低电平&#xff0c;如果仍然是&#xff0c;说明确实按下。 硬件方法就是加RC滤波电路&#xff0c;硬件方法会增加…

亚马逊---设计弹性架构

一个好的架构师可以做到以下几点&#xff1a; 根据需求设计事件驱动型架构、微服务架构和/或多层架构 确定架构设计中使用的组件的扩展策略 根据要求确定实现松耦合所需的AWS服务 确定何时使用容器 确定何时使用无服务器技术和模式 根据要求推荐合适的计算、存储、联网和数据库…

HarmonyOS NEXT 网格元素交换案例

网格元素交换案例 介绍 直接进行交换和删除元素会给用户带来不好的体验效果&#xff0c;因此需要在此过程中注入一些特色的动画来提升体验效果&#xff0c;本案例通过Grid组件、attributeModifier、以 及animateTo函数实现了拖拽动画和删除动画。 效果图预览 使用说明&#…

【网络】Burpsuite学习笔记

文章目录 1.介绍1.1 正常客户端与服务端通信&BurpSuite代理后1.2 下载激活参考地址1.3 代理设置1.4 Proxy SwitchyOmega 使用1.4.1 新建情景模式1.4.2 设置代理1.4.2 应用选项 1.5 FoxyProxy 使用1.6 安装证书1.6.1 方式一1.6.2 方式二1.6.3 浏览器安装证书1.6.4 或者直接双…

基于改进遗传算法的配电网故障定位(matlab代码)

1 主要内容 该程序复现文章《基于改进遗传算法的配电网故障定位》&#xff0c;将改进的遗传算法应用于配电网故障定位中, 并引入分级处理思想, 利用配电网呈辐射状的特点, 首先把整个配电网划分为主干支路和若干独立区域, 再利用该算法分别对各独立区域进行故障定位, 然后进行…

独立开源版:零点城市社交电商v2.1.2.4

源码介绍 独立版&#xff1a;零点城市社交电商v2.1.2.4 新增首页新增多弹窗 注意&#xff1a;如果没有此完整程序勿下载 全开源解密版代码&#xff0c;后端完全开源&#xff0c;前端是VUE前端&#xff0c;可自行二开自己想要的功能。 独立版零点城市社交电商 小程序致力于…

tcp bbr pacing 的对与错

前面提到 pacing 替代 burst 是大势所趋&#xff0c;核心原因就是摩尔定律逐渐失效&#xff0c;主机带宽追平交换带宽&#xff0c;交换机不再能轻易吸收掉主机突发&#xff0c;且随着视频类流量激增&#xff0c;又不能以大 buffer 做带宽后备。因此&#xff0c;主机必须 pacing…

CentOS的简单介绍及常用命令

1、CentOS 的简单介绍&#xff1a; CentOS是Community Enterprise Operating System的缩写&#xff0c;也叫做社区企业操作系统。是企业Linux发行版领头羊Red Hat Enterprise Linux&#xff08;以下称之为RHEL&#xff09;的再编译版本&#xff08;是一个再发行版本&#xff09…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第五套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第五套 (共9套&#xff0c;有答案和解析&#xff0c;答案非官方&#xff0c;仅供参考&#xff09;&#xff08;共九套&#xff0c;每套四十个选择题&#xff09; 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadida…

gazebo中vins-fusion在仿真小车上的部署

软件要求&#xff1a;Ubuntu 20.04 ros的noetic版本&#xff0c;我是在虚拟机vitrualbox上运行的 这几天在学ROS&#xff0c;跟着赵虚左老师过了一遍之后&#xff0c;感觉还是有很多不懂的地方&#xff0c;xtdrone上仿真跟着文档走了一遍&#xff0c;好像没学到什么东西&#…

【华为笔试题汇总】2024-04-17-华为春招笔试题-三语言题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…

【计算机考研】考408,还是不考408,性价比高❓

最近刷了很多帖子都偏向408太难了不要报考 但我的看法是408是计算机的考研趋势&#xff0c;并且择校的选择更多&#xff0c;408只是科目更广泛&#xff0c;与自命题相比其实各有各的难度 如果觉得自己数学基础不太好&#xff0c;时间不太够的同学可以了解一下自命题&#xff…

nodejs模块机制

模块机制 CommonJs规范 模块引用 上下文提供require()方法来引人外部模块var math require(math) 模块定义 exports 对象用于到处当前模块中的方法和变量module代表模块自身 exports.add function() {...}在另一个模块中使用require()方法进行导入。就可以使用 区别和联系 …

电力系统卫星授时信号安全隔离装置防护方案

电力系统是国家关键基础设施&#xff0c; 电力安全关系国计民生&#xff0c; 是国家安全的重要保障&#xff0c; 与政治安全、经济安全、 网络安全、社会安全等诸多领域密切关联。电网运行情况瞬息万变&#xff0c;为了在其发生事故时能够及时得到处理&#xff0c;需要统一的时…

Redis中的事务(二)

事务 一个完整的WATCH事务执行过程 假设当前服务端为c10086&#xff0c;而数据库watched_keys字典的当前状态如图所示&#xff0c;那么当c10086执行以下WATCH命令之后 c10086> WATCH "name" OKwatched_keys字典将更新如图所示的状态。接下来客户端c10086继续向…

[2021最新]Java时间戳和日期时间互转换

代码&#xff1a; import java.text.ParseException; import java.text.SimpleDateFormat;public class MainProcess {public static void main(String[] args) throws ParseException {// 1.set formatSimpleDateFormat timeSmat new SimpleDateFormat("yyyy-MM-dd HH:…

Kubernetes中安装部署ActiveMQ集群(手把手式记录)

目录 1、创建命名空间 nacos-cluster 2、配置文件准备 2.1 activemq0.xml 2.2 activemq1.xml 2.3 activemq2.xml 3、创建configMap cm-activemq 4、创建activemq-cluster.yaml 5、执行命令部署 6、部署成功&#xff0c;查看结果 这里以3个borker的集群为例&#xff0…