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

Vue双向数据绑定原理-中

时间:2023-09-30 20:33:06浏览次数:36  
标签: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>

image-20230930202458805

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>

image-20230930202623403

总结

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

标签:Vue,obj,get,绑定,set,oldValue,双向,defineProperty,属性
From: https://www.cnblogs.com/BNTang/p/17738187.html

相关文章

  • 解决服务器取证过程中宝塔强制绑定手机号的问题
    声明本文中提及的方式仅是为了便于服务器取证的研究,仅适用于无法出网的真实取证鉴定情况。请不要在生产环境随意修改宝塔服务的任何文件!分析目前,宝塔面板已经强制要求绑定手机号。这给取证工作带来很大的不便,尤其是在实际工作中,服务器是不可以连接互联网的,因此必须解决掉这个......
  • 【RuoYi移动端】uni-app中通过vuex的store来实现全局变量的修改和读取
    一、在store文件中新建csjVar.js文件constcsjVar={csjMess:[{aaa:"ok"},{bbb:"no"}]}exportdefaultcsjVar二、修改store文件中新建index.js文件importVuefrom'vue'importVuexfrom'vuex'importuserfrom'@/store/modules/user�......
  • vue:自定义validator/验证规则([email protected])
    一,官方文档地址:https://element-plus.gitee.io/zh-CN/component/form.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%A1%E9%AA%8C%E8%A7%84%E5%88%99二,js代码:123456789101112131415161718192021222324252627282930313233343536373......
  • vue:el-table在resize时报错([email protected])
    一,报错信息:Uncaughtruntimeerrors:×ERRORResizeObserverloopcompletedwithundeliverednotifications.athandleError(webpack-internal:///./node_modules/webpack-dev-server/client/overlay.js:299:58)ateval(webpack-internal:///./node_modules/webpa......
  • 下拉框选择与数据集参数的绑定
    步骤:1.制作数据集,并且在数据集的where条件后面添加上数据集参数。2.在报表设计器中添加控件:下拉框选择控件。3.给下拉框控件绑定参数(命名),绑定到数据集中where后面的参数中。4.选中下拉框选项。经过上面四步,发现在选择了下拉框选项中的参......
  • vue处理响应式的思路
    首先看如下js代码leta='张三'console.log(a)//当前页面展示的是张三a='李四'首先页面刚开始渲染的时候数据a为张三,之后将a修改为了李四以后页面不会发生改变,但是数据已经修改了,vue为了解决这一问题,采用响应式的办法。通过对象的defineProperty方法,在回调函数中监听;......
  • Vue自定义指令
    定义指令全局定义//指令名称为:mydirec1Vue.directive('mydirec1',{//指令配置})//指令名称为:mydirec2Vue.directive('mydirec2',{//指令配置})之后,所有的组件均可以使用mydirec1和mydirec2指令<template><!--某个组件代码--><div><MyCompv-......
  • vue_error_Runtime directive used on component with non-element root node. The di
    翻译:'运行时指令,用于非元素根节点的组件。这些指令将无法发挥预期的作用';这个错误发生在我将v-show放在自定义组件上时,我想是因为自定义组件在渲染时会被自定义组件的内部元素替换,因此设置是无效的解决:在自定义组件外加一个div,把v-show写在div上......
  • 带您了解视频融合/视频监控平台EasyCVR分组批量绑定/取消设备功能
    EasyCVR平台是一款具备丰富灵活视频能力的安防视频监控与集中存储解决方案。该平台支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,并且可以接入各种厂家的私有协议与SDK,例如海康Ehome、海大宇等设备的SDK。EasyCVR平台不仅具备传统安防视频监控的能力,还具备接入AI智能......
  • 基于vue和element-ui开发仿桌面文件夹组件
    ......