【Vue】轻松理解数据代理

简介: 【Vue】轻松理解数据代理

hello,我是小索奇,精心制作的Vue教程持续更新哈,想要学习&巩固&避坑就一起学习叭~

Object定义配置方法

代码

引出数据代理,先上代码,后加解释

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8" />
  <title>回顾Object.defineproperty方法</title>
 </head>
 <body>
  <script type="text/JS" >
   let number = 18
   let person = {
    name:'张三',
    sex:'男', 
   }
// 它的功能是给person配置一个age属性
   Object.defineProperty(person,'age',{
    // value:18, 
    // enumerable:true, //控制属性是否可以枚举,默认值是false,f12可以看到颜色为浅色,用Object.keys(person)获取不到age的key(不可枚举)
    // writable:true, //控制属性是否可以被修改,默认值是false
    // configurable:true //控制属性是否可以被删除,默认值是false
    //当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
    //get:function(){}=
    get(){
    // 如果不这样关联,number值不变,从上往下执行完结束,是修改不了的必须关联
     console.log('有人读取age属性了')
     return number
    },
    //当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
    set(value){
     console.log('有人修改了age属性,且值是',value)
     number = value
    }
   })
   // console.log(Object.keys(person))
   console.log(person)
  </script>
 </body>
</html>

image-20230812002421058

writable:false 默认false时不可以修改

image-20230812003530814

writable:true

image-20230812003444218

直接写进对象中是可以随意修改删除的,但加了配置项就不是随意了,想要修改删除需要配置

当加入getter时,定义的属性就会随着修改而变化,属性通过调用属性get而控制-invoke property getter

image-20230812004517285

数据代理

通过一个对象代理对另外一个对象中属性进行修改操作

代码实现

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8" />
  <title>何为数据代理</title>
 </head>
 <body>
  <!-- 数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)-->
  <script type="text/JS" >
   let obj = {x:100}
   let obj2 = {y:200}
   Object.defineProperty(obj2,'x',{
    get(){
     return obj.x
    },
    set(value){
     obj.x = value
    }
   })
  </script>
 </body>
</html>
  • get 方法中,当你读取 obj2.x 的值时,实际上会返回 obj.x 的值,因为 get 方法内部使用了 obj.x
  • set 方法中,当你设置 obj2.x 的值时,实际上会将这个值赋给 obj.x,从而修改了 obj 对象中的属性 x

在data中的数据都会走数据代理

当你在 Vue 实例的 data 选项中定义数据属性时,Vue 会自动将这些数据属性代理到 Vue 实例上

具体来说,当你在 data 中定义一个属性时,Vue 会将这个属性添加到 Vue 实例上,并且会创建一个内部的响应式数据对象,该对象会跟踪这个属性的变化然后,当你在模板中使用这个属性时,Vue 会建立一个与这个响应式数据对象的绑定,使模板可以在数据变化时自动更新

这个过程实现了数据代理的概念,即在 Vue 实例上代理了 data 中定义的属性,使你可以直接在 Vue 实例中访问这些属性,而实际上这些属性是存储在内部的响应式数据对象中的

下面点击name、age会显示出值,它们都是数据代理,可以更改内容

image-20230813001425128

索奇问答

Q:把方法放到data中会怎样,走代理吗?

A:走代理,虽然定义的方法不应该走代理,它和数据不一样,数据是变化的,而方法是不变的,这样一定加重代码的累赘,

这样没有任何意义,setter & getter 也无处施展

所以还是老实按照正常来写,写到methods中吧

对您有用的话点个免费的赞叭~

目录
打赏
0
0
0
0
11
分享
相关文章
极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图
本文介绍了使用 Vue Flow 绘制流程图的方法与技巧。Vue Flow 是一个灵活强大的工具,适合自定义复杂的流程图。文章从环境要求(Node.js v20+ 和 Vue 3.3+)、基础入门案例、自定义功能(节点与连线的定制、事件处理)到实际案例全面解析其用法。重点强调了 Vue Flow 的高度灵活性,虽然预定义内容较少,但提供了丰富的 API 支持深度定制。同时,文中还分享了关于句柄(handles)的使用方法,以及如何解决官网复杂案例无法运行的问题。最后通过对比 mermaid,总结 Vue Flow 更适合需要高度自定义和复杂需求的场景,并附带多个相关技术博客链接供进一步学习。
管理数据必备;侦听器watch用法详解,vue2与vue3中watch的变化与差异
一篇文章同时搞定Vue2和Vue3的侦听器,是不是很棒?不要忘了Vue3中多了一个可选项watchEffect噢。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
属性描述符初探——Vue实现数据劫持的基础
属性描述符还有很多内容可以挖掘,比如defineProperty与Proxy的区别,比如vue2与vue3实现数据劫持的方式有什么不同,实现效果有哪些差异等,这篇博文只是入门,以后有时间再深挖。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Vue中的class和style绑定
在 Vue 中,class 和 style 绑定是基于数据驱动视图的强大功能。通过 class 绑定,可以动态更新元素的 class 属性,支持对象和数组语法,适用于普通元素和组件。style 绑定则允许以对象或数组形式动态设置内联样式,Vue 会根据数据变化自动更新 DOM。
|
10月前
|
【vue实战项目】通用管理系统:api封装、404页
【vue实战项目】通用管理系统:api封装、404页
102 3
Vue3+Vite+TypeScript常用项目模块详解
现在无论gitee还是github,越来越多的前端开源项目采用Vue3+Vite+TypeScript+Pinia+Elementplus+axios+Sass(css预编译语言等),其中还有各种项目配置比如eslint 校验代码工具配置等等,而我们想要进行前端项目的二次开发,就必须了解会使用这些东西,所以作者写了这篇文章进行简单的介绍。
195 0
Vue3+Vite+TypeScript常用项目模块详解
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)
探索 Vue Mixin 的世界:如何轻松复用代码并提高项目性能(上)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等