首页 > 其他分享 >Vue双向数据绑定原理-中

Vue双向数据绑定原理-中

时间:2023-11-16 12:07:51浏览次数:35  
标签:Vue obj get 绑定 set oldValue 双向 defineProperty 属性

defineProperty方法

defineProperty除了可以动态修改/新增对象的属性以外, 还可以在修改/新增的时候给该属性添加get/set方法, 从而实现数据劫持。

defineProperty get/set方法特点

只要通过defineProperty给某个属性添加了get/set方法,那么以后只要获取这个属性的值就会自动调用get, 设置这个属性的值就会自动调用set。

!> 但是有一个注意点, 如果设置了get/set方法, 那么就不能通过value直接赋值, 也不能编写writable:true。

defineProperty get 方法

<script>
    let obj = {};
    let oldValue = "Example"
    Object.defineProperty(obj, 'name', {
        get() {
            console.log('get方法被执行了');
            return oldValue;
        }
    });

    console.log(obj.name);
</script>

Vue双向数据绑定原理-中_赋值

defineProperty set 方法

<script>
    let obj = {};
    let oldValue = "Example"
    Object.defineProperty(obj, 'name', {
        set(newValue) {
            if (oldValue !== newValue) {
                console.log("set方法被执行了");
                oldValue = newValue;
            }
        }
    });
    obj.name = 'BNTang'
</script>

Vue双向数据绑定原理-中_set方法_02

总结

通过上面的例子可以看出, 只要给某个属性添加了get/set方法, 那么以后只要获取这个属性的值就会自动调用get, 设置这个属性的值就会自动调用set。还有就是如果设置了get/set方法, 那么就不能通过value直接赋值, 也不能编写writable:true。



标签:Vue,obj,get,绑定,set,oldValue,双向,defineProperty,属性
From: https://blog.51cto.com/u_15652665/8415858

相关文章

  • 非严格模式下,this有4种绑定机制(默认、隐式、显式、new)
    执行以下选项中的程序,输出结果是undefined的是()Avaro={age:18,a:{fn:function(){console.log(this.age);}}}o.a.fn();BclassAnimal{constructor(color){this.color=color;}getColor(){console.log("animal的颜色是"+this.color)......
  • git拉取项目失败怎么办? 前端vue2 都需要install 什么依赖
    gitconfig--list--show-origin查看git文件下面所有对应文件目录下面是设计配置文件http的缓存大小和那个最低时间和速度gitconfig--globalhttp.lowSpeedTime999999gitconfig--globalhttp.lowSpeedLimit0gitconfig--globalhttp.postBuffer1048576000 ......
  • 若依vue启动报Error: error:0308010C:digital envelope routines::unsupported
    解决:若依vue启动报Error:error:0308010C:digitalenveloperoutines::unsupported1.描述:问题产生原因是因为node.jsV17版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响.解决方法:有很多种,我把适合我的写在第一......
  • Vue中Pinia简介
    Pinia是一个进行vue状态管理的组件,他会创建一个带有state、actions、getters的option对象constuseCounterStore=defineStore('counter',{state:()=>({count:0}),getters:{double:(state)=>state.count*2},actions:{increment(){......
  • 如何优雅使用 vuex
    大纲本文内容更多的是讲讲使用vuex的一些心得想法,所以大概会讲述下面这些点:Q1:我为什么会想使用vuex来管理数据状态交互?Q2:使用vuex框架有哪些缺点或者说副作用?Q3:我是如何在项目里使用vuex的?初识vuex对于vuex,有人喜欢,有人反感喜欢的人觉得它可以很好的解决复杂的数......
  • vue中el-upload结合vuedraggable实现图片的上传、排序、删除以及预览等功能_element u
    <template><div><ulclass="el-upload-listel-upload-list--picture-card"style="display:flex;"><div><!--start:拖拽开始end:拖拽结束imageLists:需要展示图片的数组-->......
  • 【开源】基于Vue.js的高校实验室管理系统
    一、摘要1.1项目介绍基于JAVA+Vue+SpringBoot+MySQL的高校实验室管理系统包含实验室类型模块、实验室档案模块、实验模块、实验设备模块、实验订单模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,高校实验室......
  • 【开源】基于Vue.js的衣物搭配系统的设计和实现
    一、摘要1.1项目介绍基于Vue+SpringBoot+MySQL的衣物搭配系统,包含衣物档案模块、衣物搭配模块、衣物收藏模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,衣物搭配管理系统基于角色的访问控制,给普通用户、衣物......
  • 【Vue】组件传值的六种方法
    Vue组件之间的通信大概归类为:父子组件通信:props;ref;$attrs/$listeners;$parent/$children兄弟组件通信:eventBus;vuex跨级通信:eventBus;Vuex;$attrs/$listeners一、props/$emit1.父组件向子组件传值通过props传值。父组件的代码:<template><divclass="secti......
  • vue 实现文件切片上传
    在实际开发项目过程中有时候需要上传比较大的文件,然后呢,上传的时候相对来说就会慢一些,so,后台可能会要求前端进行文件切片上传,很简单哈,就是把比如说1个G的文件流切割成若干个小的文件流,然后分别请求接口传递这个小的文件流。流程简说实现文件切片导入,首先我们使用elementUI也好,......