首页 > 其他分享 >谈谈 Vue shallowRef 和 shallowReactive

谈谈 Vue shallowRef 和 shallowReactive

时间:2023-03-19 20:44:58浏览次数:57  
标签:Vue bar foobar shallowReactive 响应 state shallowRef foo

深层次响应式

reactiveref 创建的对象都是深层次的,对象的根属性和嵌套属性都是响应式的。

深层次转换是递归地转为响应式,对象里的每个属性访问都将触发代理的依赖追踪,这种性能负担通常这只有在处理超大型数组或层级很深的对象时才比较明显。例如,一次渲染需要访问 100000+ 个属性时,才会变得比较明显。因此,shallowRefshalloReactive 只在少数特定的场景才会使用。

const state = reactive({
  foo: {
    bar: 1
  },
  foobar: 2
});

图1 - 深层次响应式,根属性和嵌套属性都是响应式的

浅层次响应式

shallowReactive

shallowReactive 创建的响应式对象只在其根属性是响应式的,对所有深层的对象不会做任何的递归深层转换处理,否则和 reactive 没区别。

浅层响应式对深层级属性的访问会很快,但代价是,所有深层的对象视为非响应式的。

const state = shallowReactive({
  foo: {
    bar: 1
  },
  foobar: 2
});

图2 - 浅层次响应式,除根属性是响应式的嵌套属性不是响应式

上图中,state.foo.bar 没有发生改变,只有在其他响应式发生了更新,才间接地更新了它的状态。

替换顶级对象失去响应式

对于 reactiveshallowReactive,如果替换了顶级对象就会失去响应式:

let state = shallowReactive({
  foo: {
    bar: 1
  },
  foobar: 2
});

function changeState() {
  state = {
    foo: {
      bar: 1000
    },
    foobar: 2000
  };
}

图3 - 替换顶级对象,其浅层响应式也失去了

如上图所示,state.foobar 在替换顶级对象之前,一直是有响应式的,但是被替换了之后,就失去了响应式。

需要思考的是,为什么替换了顶级对就失去了响应式,请先阅读 Vue 中的响应性是如何工作的,官方文档给了一个 reactive 和 ref 创建响应式的伪代码,不难看出,reactive 返回了一个 Proxy。在 getter/setter 上加上 Vue 的追踪代码,实现响应式。

一旦这个 Proxy 对象被替换了,就没有了 getter/setter,即失去了响应式。

shallowRef

shallowReactive 不同的是,shallowRef 创建的响应式对象顶层属性都不是响应的,就好像是一个普通的对象一样,没有响应式能力。

let state = shallowRef({
  foo: {
    bar: 1
  },
  foobar: 2
});

function changeState() {
  state.value = {
    foo: {
      bar: 1000
    },
    foobar: 2000
  };
}

图4 - shallowRef 被替换了顶层对象时发生了变化

在替换顶层对象之前,点击按钮,state.foo.barstate.foobar 都没有更新,这和 shallowReactive 不同。强制触发浅层 ref 可以使用 triggerRef,具体查看官方文档:triggerRef

替换顶级对象不会失去响应式

shallowRefref 创建的响应式对象被替换了之后依旧保留失去响应式能力。

let state = shallowRef({
  foo: {
    bar: 1
  },
  foobar: 2
});

function changeState() {
  state.value.foo.bar++;
  state.value.foobar++;

  const replace = {
    foo: {
      bar: state.value.foo.bar
    },
    foobar: state.value.foobar
  };

  state.value = replace;
}

图5 - changeState 替换顶级对象,依旧保持响应式

标签:Vue,bar,foobar,shallowReactive,响应,state,shallowRef,foo
From: https://www.cnblogs.com/Himmelbleu/p/17232353.html

相关文章

  • Vuex模块式开发
    背景:2个组件:home和search,将store仓库拆分成2个小仓库,home和search两个小仓库用于管理自己模块的数据store文件夹下新建2个文件夹:home和searchhome下index.js//home模块......
  • Vue和React项目中生成唯一ID
    Vue中唯一ID生成方式React中唯一ID生成方式......
  • vue中全局过滤器
    //全局的过滤器,进行时间的格式化Vue.filter('dateFormat',function(dateStr){//根据给定的实际那字符串,得到绑定的时间vardt=newDate(dateStr)//yyy--mm--ddvar......
  • vue+element-ui刷新路由的时候保持在当前页面小技巧
    前言:很多小伙伴在练习vue项目的时候会遇到这样一个问题,就是刷新页面的时候,路由没有显示到当前页面,而是重定向回首页了,那么该怎么解决呢,就请各位小伙伴看下面的内容介绍吧......
  • Vue 搜索案例:gitHub 用户搜索案例
    一:界面示例效果......
  • 使用vue2+element-ui+axios实现后台管理系统的增删改查
    以下仅作为自己个人学习使用前言:需要后端的接口已经在另外一篇博客写了,需要的小伙伴们可以去那边参考,下面是链接https://www.cnblogs.com/Amyel/p/17233060.html正片......
  • vuex的使用
    安装依赖[email protected].新建文件夹store,index.js文件importVuefrom'vue'importVuexfrom'vuex'Vue.use(Vuex);//state:仓库存储数据的......
  • 万字血书Vue—路由
    多个路由通过路由器进行管理。前端路由的概念和原理(编程中的)路由(router)就是一组key-value对应关系,分为:后端路由和前端路由后端路由指的是:请求方式、请求地址和functi......
  • Vue3组合式API结合TS
    Vue组合式API中如何使用TS组合式API使用TS组合式API中使用TS,要比选项式API中使用TS会更加的简单,不需要做过多的处理,只需要利用原生TS的能力就可以。并且组合式API都具备......
  • vue3的js文件中使用vue-router
    import{useRoute,useRouter}from'vue-router'constrouter=useRouter()constroute=useRoute()router.push({path:'/index'})这种在正常.vue文件中引入没......