首页 > 其他分享 >8_vue是如何代理数据的

8_vue是如何代理数据的

时间:2022-10-22 15:15:06浏览次数:89  
标签:vue name 数据 代理 vm 当中 data

在了解了关于js当中的Object.defineProperty()这个方法后,我们继续对vue当中的数据代理做一个基于现在的解析

建议观看之前先了解下js当中的Obejct.defineProperty()

链接地址

了解如何代理

准备工作

  • 准备一个容器,供vue实例对象指定
  • 在实例对象当中配置供页面调用的数据(data)
  • 测试页面
<body>
    <!-- 准备一个容器 -->
    <div class="subject">
        <div>昵称:{{name}}</div>
        <div>电话:{{phone}}</div>
    </div>
</body>
<script>
    new Vue({
        el: '.subject',
        data: {
            name: 'wavesbright',
            phone:"134****2557"
        }
    });
</script>

image-20221022113708006

查看VM

image-20221022114032996

  • 通过之前的复习,我们知道,在vm这个实例对象当中
  • 配置项data当中的属性,会挂载到vm上,供页面调用
  • 而鼠标悬停在二者身上,出现了 invoke property getter,说明什么?
  • 说明,vm上的name和phone,是通过defineProperty 添加上去的 === 做了数据代理

和谁做了数据代理?

image-20221022114614738

  1. 当你访问 name 或者 phone的时候
  2. 一定会调用get(getter),这个get 一定会从某个地方,将所需要的值进行 返回
  3. 什么地方? data嘛
    • image-20221022114738220
  4. 那你要对 name 和 phone 进行修改的时候,那肯定要 调用set嘛
  5. 如何确定呢?

get和set

确实有,在哪里呢,往下翻就可以看到

image-20221022115156237

这不就是代理么

验证两条线

vm当中的name 与 phone 是 与data进行数据绑定的

image-20221022115258675

get

  1. 既然绑定了,那当我访问name变量的时候
  2. 先调用get
  3. get 返回 data.name当中配置的value值

验证过程

很简单,直接修改data.name的值不就知道了

原图

image-20221022115543609

修改后

image-20221022115520686

说明是绑定到一起的嘛,但我为什么不修改 vm.name的值去查看data是否发生改变了呢?

问题引出1

image-20221022115740080

  • 我们设计的data当中的属性,经过vue的一系列操作
  • 最终挂载到了vue实例上,实现了数据绑定
  • 数据绑定是一个事实,我们现在所做的是验证这个过程
  • 通过修改配置项 data当中的name属性,页面当中确实发生了变化
  • 但是我现在想验证的是,我修改 vm.name的值的时候,data如何确定变化

vm.data查看就能完成了,这不很简单嘛?是吗?

image-20221022120127405

开国际玩笑哦,你data在全局定义了吗?没有吧?vm当中为什么也没有data呢?

set

解决方式1

定义一个全局的data不就行了

image-20221022120225904

验证一下嘛,修改vue当中的name属性,data是否会发生变化

image-20221022120346784

确实可以

问题衍生2

那么又有一个问题,我这个全局data是自己定义的,而正常构建的vue实例对象可不会这么写

但事实情况就是,我修改配置项data当中的数据,可以影响页面,而修改页面也可以影响data

我辛辛苦苦配置了一个data对象,交给了vm,vm如果不把我这个data存下来,那人家以后要用属性去那里取?vm一定会把这个data留下来。

这就说明一个问题,配置项data,一定在 构建完成的这个实例对象vm身上,但是为什么找不到呢?

因为人家叫 vm._data

image-20221022120635067

这个就不展开了,因为 vm当中的data除了做数据代理,还有数据劫持

我们当下只需要记住一点,vm._data === data

验证set的过程

这是当前页面,现在我们要修改name属性

image-20221022121505054

修改成全大写

image-20221022121558541

分析过程

image-20221022121720861

  1. 我们修改了vm.name的值
  2. 一定调用了 set函数,拿到这个value值
  3. 并且将这个 value值赋给了vm._data(data)

图文解析

第一部分

一切的一切都是因为开头写了这段代码

image-20221022141748691

紧随其后,马上就给我们创建了一个vue的实例对象

image-20221022141846091

然后,vue开始为vm这个实例对象准备一些东西(属性)

image-20221022141958419

重点,data来了,完全来自于上方的配置项data

image-20221022142105656

截止到目前来说,没有数据代理的存在。我们所写的data,就是单纯的进行了一次赋值,然后给了下划线data(_data)

第二部分

实际上,vue做到这一步已经差不多了,代码也是可以写下去的

但是,请问,目前vm身上,有name吗,没有

但是我能拿到name的值吗?可以的,因为我有 _data

image-20221022142421146

一样可以拿到name和phone的值

image-20221022142439020

因为,vm这个对象身上的所有属性,在模板上面都能够直接使用

但是这样写,那不是直接崩溃,创建一个变量就需要 _data一次,vue在这里做了一个很棒的操作

也就是数据代理

第三部分

image-20221022142656837

  1. vm在自己身上创建了一个变量name
  2. 什么方式创建的?defineProperty
  3. 通过get拿到vm自身上的_data.name的值
  4. 修改数据的时候通过set,获取value,然后再将_data当中的属性进行修改
  5. 完成了数据代理,双向绑定

为什么要将data当中的数据放在vm身上一份呢(_data)

就是为了让你编码的时候更方便(不至于每次都是 _data.xxx

image-20221022142943005

总结

  1. vue中的数据代理
    • 通过vm对象 来 代理 data对象(配置项)中的属性操作(get/set
  2. Vue中数据代理的好处
    • 更加方便操作data中的数据(_data.xxx)
  3. 基本原理
    1. 通过Object.defineProperty()将data配置项当中的所有属性配置到vm对象上
    2. 为每一个添加到vm上的属性,指定一个get和set函数(getter/setter)
    3. 在getter/setter内部去操作(读/写),data中对应的属性

展开_data

思考

image-20221022143634028

老师不让展开是对的

因为如果按照之前的理解,这个符号代表什么 (...) 代表数据代理

这样容易引起理解误区,,这里实际上并不是数据代理,而是做了一个数据劫持

我希望看到的 _data的展开内容是什么?是这样的image-20221022144104628

实际上并不是

vue的承诺

只要你敢修改data当中的属性值,我就敢在页面当中 {{property}}一起发生变化

image-20221022144035004

  1. name的值发生了改变,最终影响到的是谁 === _data.name
  2. 那么页面元素是怎么同步进行修改的?
  3. vue是不是必须要知道,name这里发生了改变,他需要做什么 === 监听
  4. 经历了一系列变动后,完成了小小的升级,最终达成响应式操作

标签:vue,name,数据,代理,vm,当中,data
From: https://www.cnblogs.com/wavesbright/p/16816099.html

相关文章

  • 漂浮广告floatingAd Vue版
    朋友找我帮忙写一个vue版的漂浮广告组件原版插件博客地址:http://www.ijquery.cn/?p=1291代码参考的是(jquery版),https://gitee.com/hongweizhiyuan/floatingAd,插件效果演......
  • vue里面echarts的使用
    一、先安装echarts--Handbook-ApacheECharts;二、在min的文件中引入Vue.prototype.$echarts=echarts;import*asechartsfrom'echarts';三、在html里面增加一个d......
  • 列表,元组,字符串——数据类型三剑客【python启蒙】python基础的归类学习,内含思维导图
    〇引言  橘子们大家好,学完这一篇,可以说python最基本的知识就完结了。对大家来说是迈向新高的路途,对我来说,我也要去挑战更高难度的博客。我在深圳技术大学跟着OIC开源创......
  • 数据库上云已成趋势,稳定高效才是硬道理,华为云数据库助力企业创新​
    数据库上云已成趋势,稳定高效才是硬道理,华为云数据库助力企业创新​伴随云计算的发展,越来越多的企业用户都会选择将传统数据库迁移到云端,从而实现资源高效、应用敏捷、业务智......
  • 数据时代,你的企业上“云”了吗?
    十几年前,企业、工厂、单位、政府的数据和档案还有材料的储存还停留在纸质时代,随着互联网和电脑的普及,数据被存放在集成服务器中,慢慢的企业和单位都有能力自行组建自己独有的......
  • 用更低的成本,享更多的服务!华为云数据库灵活好用
    用更低的成本,享更多的服务!华为云数据库灵活好用​在经济发展不确定的当下,越来越多的企业开始走上了数字化转型升级的道路,而且在自建服务器、数据库与选择服务商为自己提供云......
  • 云2_0时代,华为云数据库 RDS for MySQL 能做什么?
    随着网络信息社会的不断发展,网络使用单位的数量不断增加,物联网、人工智能和计算机大数据算法等网络信息技术被不断应用于企业生产和发展,这种背景下,网络使用单位对于数据库的......
  • vue-router
    入门1.前言router路由应为vue是单页应用不会有那么多html让我们跳转所有要使用路由做页面的跳转Vue路由允许我们通过不同的URL访问不同的内容。通过Vue可以实......
  • vue中工作总结
    1.vue中数据向下传递时,无法使用@close方法清除原因:传递的时候需要进行一波深拷贝方法:JSON.parse(JSON.stringify(obj))2.表格选择的时候无法再次点击取消使用elementui的时......
  • Vue 笔记6 模板分离
                   ......