Vue对象的深层劫持详细讲解

 更新时间:2023年01月06日 15:38:24   作者:BraveWangDev  
这篇文章主要介绍了vue2.x对象深层劫持的原理实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一,前言

上篇,主要介绍了在 Vue 的数据初始化流程中,对象属性的单层劫持是如何实现的

回顾一下,主要涉及以下几个核心点:

  • data 为函数和对象的处理,及当 data 为函数时的 this 指向问题
  • Observer 类:对数据进行观测
  • walk 方法:遍历 data 属性(对象属性遍历)
  • defineReactive 方法:利用 Object.defineProperty 实现数据劫持

本篇,继续对 data 数据进行初始化操作,对象属性的深层劫持

二,对象属性的深层观测问题

1,抛出问题

当前版本的代码逻辑:

如果,data 对象中的属性,还是一个对象(称为obj)

那么,这个对象(obj)中的属性是不会被观测的(目前所说的观测还仅仅停留在数据劫持阶段)

就是说,当前仅实现了对 data 对象中属性的单层劫持,嵌套对象不会被深层劫持

2,测试问题

<script>
  let vm = new Vue({
    el: '#app',
    data() {
      // data函数返回的对象中,obj属性为一个对象,它的属性不会被观测
      return { message: 'Hello Vue', obj: { key: "val" } }
    }
  });
</script>

3,查看结果

new Vue 时,传如的 options 选项中的 data 函数,

data 函数中,属性 obj 的值依然是一个对象 { key: “val” }

对象 { key: “val” } 中的 key,此时没有被添加 get 和 set 方法,说明 key 没有被劫持

三,对象属性深层观测的实现

1,实现思路

TODO:需要先回顾一下,对象属性单层观测的流程

有了 data 对象单层观测的经验,对象属性 obj 深层劫持就简单多了

当对象属性 obj 即将被 Object.defineProperty 劫持时,

再对 obj 对象做一次“对象的单层劫持”

更深层的对象属性劫持,就是在递归执行“对象的单层劫持”

即:当属性为对象类型时(非 null)

继续进行 observe 观测,observe 的递归就实现了对象属性的深层劫持

2,代码逻辑

function defineReactive(obj, key, value) {
  observe(value);// 递归实现深层观测
  Object.defineProperty(obj, key, {
    get() {
      return value;
    },
    set(newValue) {
      if (newValue === value) return
      value = newValue;
    }
  })
}

TODO:需要突出递归的逻辑

四,data 相关优化

TODO:结合对象属性观测的特点,介绍 data 的相关优化

五,结尾

本篇主要实现了 Vue 数据初始化流程中,对象属性的深层劫持,核心思路就是递归;

  • 通过data = isFunction(data) ? data.call(vm) : data;处理后的data一定是对象类型
  • 通过data = observe(data)处理后的 data 就实现了数据的响应式(目前只有劫持)
  • observe 方法最终返回一个 Observer 类
  • Observer类初始化时,通过 walk 遍历属性
  • 对每一个属性进行 defineReactive(Object.defineProperty)就实现对象属性的单层数据劫持
  • 在 defineReactive 中,如果属性值为对象类型就继续调用 observe 对当前的对象属性进行观测(即递归步骤 3~5),这样就实现了对象属性的深层数据劫持

下一篇,数组的劫持

到此这篇关于Vue对象的深层劫持详细讲解的文章就介绍到这了,更多相关Vue对象深层劫持内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • LogicFlow插件使用前准备详解

    LogicFlow插件使用前准备详解

    这篇文章主要为大家介绍了LogicFlow插件使用前准备详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • vue打包部署到tomcat上页面空白资源加载不出来的解决

    vue打包部署到tomcat上页面空白资源加载不出来的解决

    这篇文章主要介绍了vue打包部署到tomcat上页面空白资源加载不出来的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Vue之mixin混入详解

    Vue之mixin混入详解

    这篇文章主要为大家介绍了Vue之mixin混入,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • Vue $emit $refs子父组件间方法的调用实例

    Vue $emit $refs子父组件间方法的调用实例

    今天小编就为大家分享一篇Vue $emit $refs子父组件间方法的调用实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • VUE3子表格嵌套分页查询互相干扰的问题解决方案

    VUE3子表格嵌套分页查询互相干扰的问题解决方案

    这篇文章主要介绍了VUE3子表格嵌套分页查询互相干扰的问题解决方案,如果不需要做子表格的分页查询,那么可以直接在主表格中嵌套子表格,本文给大家介绍两种方式,需要的朋友可以参考下
    2024-01-01
  • mpvue中配置vuex并持久化到本地Storage图文教程解析

    mpvue中配置vuex并持久化到本地Storage图文教程解析

    这篇文章主要介绍了mpvue中配置vuex并持久化到本地Storage的教程详解,# 配置vuex和在vue中相同,只是mpvue有一个坑,就是不能直接在new Vue的时候传入store。本文分步骤给大家介绍的非常详细,需要的朋友参考下吧
    2018-03-03
  • Vue实现路由过渡动效的4种方法

    Vue实现路由过渡动效的4种方法

    Vue 路由过渡是对 Vue 程序一种快速简便的增加个性化效果的的方法,这篇文章主要介绍了Vue实现路由过渡动效的4种方法,感兴趣的可以了解一下
    2021-05-05
  • Vue实现渲染数据后控制滚动条位置(推荐)

    Vue实现渲染数据后控制滚动条位置(推荐)

    这篇文章主要介绍了Vue实现渲染数据后控制滚动条位置,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Vue.js用法详解

    Vue.js用法详解

    Vue.js(读音 /vju&#720;/, 类似于 view) 是一套构建用户界面的渐进式框架。这篇文章主要介绍了Vue.js用法详解,需要的朋友可以参考下
    2017-11-11
  • vue-element-admin 菜单标签失效的解决方式

    vue-element-admin 菜单标签失效的解决方式

    今天小编就为大家分享一篇vue-element-admin 菜单标签失效的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11

最新评论