Vue响应式数据


前言

在 Vue中,响应式数据是构建动态、交互性强的应用程序的核心。而ref、shallowRef和markRaw作为 Vue 提供的几个重要 API,在处理响应式数据时扮演着关键角色。


一、ref

ref() 是 Vue 3 中用于创建响应式数据的一个函数,它接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value。

<template><div><p>Counter: {{ count }}</p><button @click="increment">Increment</button></div></template>​
​
<script setup>import { ref } from 'vue';​
​
const count = ref(0);​
​
const increment = () => {​
  count.value++;};</script>

在上述代码中,ref(0)创建了一个名为count的响应式引用,初始值为0。在模板中通过{{ count }}来访问这个响应式数据,当点击按钮触发increment函数时,count.value++修改了count的值,Vue 会自动检测到变化并更新视图。

二、shallowRef

shallowRef() 是ref ()的浅层作用形式,常常用于对大型数据结构的性能优化或是与外部的状态管理系统集成。它和 ref() 不同,浅层 ref 的内部值将会原样存储和暴露,并且不会被深层递归地转为响应式。只有对 .value 的访问是响应式的。

const state = shallowRef({
	name:'lili',
	age:20
})

//不会触发更改
state.value.age = 21

//会触发更改
state.value = {name:'lili',age:21}

shallowRef适用于性能优化场景,当你明确知道某个数据内部属性的变化不需要触发视图更新,或者数据结构非常复杂,不需要深度响应式时,可以使用shallowRef来减少不必要的响应式追踪。

三、markRaw

markRaw的作用是标记一个对象,使其不被 Vue 转换成响应式对象。当你有一个已经存在的对象,且不希望 Vue 对其进行递归的响应式处理时,就可以使用markRaw。

import { reactive, markRaw } from 'vue';

const object1 = {
  data: 'This is existing data'
};

const wrapper = reactive({
  obj: markRaw(object1)
});

// 修改obj不会触发视图更新
wrapper.obj.data = 'Updated data';

在上述代码中,object1 通过markRaw标记后,即使将其作为reactive对象wrapper的属性,对object1 属性的修改也不会触发响应式更新。这在一些特殊场景下很有用,比如引入外部库创建的对象,不希望 Vue 对其进行额外的响应式处理。

总结

在这里插入图片描述

综上所述,在 Cesium 与 Vue 的结合开发中,选择使用shallowRef来处理viewer实例是基于多方面因素的审慎考量。从响应式原理层面来看,ref创建深度响应式数据,会对复杂viewer实例内部大量属性进行递归追踪,这在 Cesium 场景中既不必要又消耗性能;markRaw则完全跳过响应式转换,不适用于viewer实例需要在 Vue 中存在一定响应交互的场景。而shallowRef恰到好处,它仅追踪引用变化,避免深度响应式的性能负担,契合 Cesium 自身不依赖 Vue 响应式系统的更新机制,同时防止 Cesium 内部状态变化导致的不必要视图更新。这一选择完美平衡了 Cesium 强大的三维可视化能力与 Vue 的响应式框架优势,充分体现了shallowRef在特定开发场景中的独特价值 ,也为我们在处理类似复杂第三方库实例与 Vue 响应式系统结合时提供了极具参考意义的思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值