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

Vue双向数据绑定原理-上

时间:2023-11-15 14:03:21浏览次数:35  
标签:Vue obj name 绑定 value Object 双向 defineProperty 属性

Vue响应式的原理(数据改变界面就会改变)是什么?

时时监听数据变化, 一旦数据发生变化就更新界面, 这就是Vue响应式的原理。

Vue是如何实现时时监听数据变化的

通过原生JS的defineProperty方法, 通过get和set方法来监听数据的变化。

defineProperty方法的特点

可以直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。

defineProperty用法

?> 可以直接在一个对象上定义一个新属性

假设我有这么一个需求,给obj对象动态新增一个name属性, 并且name属性的取值必须是BNTang,通过 defineProperty 方法实现。

<script>
    let obj = {};

    Object.defineProperty(obj, 'name', {
        value: 'BNTang'
    });

    console.log(obj);
</script>

defineProperty 是属于 Object 对象的方法,所以我们可以直接通过 Object.defineProperty 来调用。

  • 第一个参数是要定义属性的对象(obj: 需要操作的对象)
  • 第二个参数是要定义或修改的属性的名称(prop: 需要操作的属性)
  • 第三个参数是将被定义或修改的属性描述符(descriptor: 属性描述符)

最终语法如下:

Object.defineProperty(obj, prop, descriptor)

在上面提出的需求中,我们需要动态新增一个 name 属性,所以第一个参数就是 obj 对象,第二个参数就是 name 属性,第三个参数就是 name 属性的描述符。
我在第三个参数中定义了一个 value 属性,这个 value 属性的值就是 BNTang,这样我们就实现了动态新增一个 name 属性,并且 name 属性的值是 BNTang。
value 属性描述符的作用可以通过value来告诉defineProperty方法新增的属性的取值是什么。

!> 默认情况下通过defineProperty新增的属性的取值是不能修改的。

<script>
    let obj = {};

    Object.defineProperty(obj, 'name', {
        value: 'BNTang'
    });
    obj.name = 'test';
    console.log(obj);
</script>

Vue双向数据绑定原理-上_数据

如果想修改, 那么就必须显示的告诉defineProperty方法,这个属性是可修改的,通过writable属性描述符来实现。

<script>
    let obj = {};

    Object.defineProperty(obj, 'name', {
        value: 'BNTang',
        writable: true,
    });
    obj.name = 'test';
    console.log(obj);
</script>

Vue双向数据绑定原理-上_描述符_02

!> 默认情况下通过defineProperty新增的属性是不能删除的。

<script>
    let obj = {};

    Object.defineProperty(obj, 'name', {
        value: 'BNTang',
        writable: true,
    });
    obj.name = 'test';
    delete obj.name;
    console.log(obj);
</script>

Vue双向数据绑定原理-上_数据_03

如果想删除, 那么就必须显示的告诉defineProperty方法,这个属性是可删除的,通过configurable属性描述符来实现。

<script>
    let obj = {};

    Object.defineProperty(obj, 'name', {
        value: 'BNTang',
        writable: true,
        configurable: true,
    });
    obj.name = 'test';
    delete obj.name;
    console.log(obj);
</script>

Vue双向数据绑定原理-上_描述符_04

!> 默认情况下通过defineProperty新增的属性是不能遍历(迭代的)。

<script>
    let obj = {};

    Object.defineProperty(obj, 'name', {
        value: 'BNTang'
    });

    for (let key in obj) {
        console.log(key, obj[key]);
    }
</script>

如果想迭代, 那么就必须显示的告诉defineProperty方法,这个属性是可迭代的,通过enumerable属性描述符来实现。

<script>
    let obj = {};

    Object.defineProperty(obj, 'name', {
        value: 'BNTang',
        enumerable: true
    });

    for (let key in obj) {
        console.log(key, obj[key]);
    }
</script>

Vue双向数据绑定原理-上_描述符_05

到此为止,定义一个新属性的方法就介绍完了,接下来我们来看看如何修改一个对象的现有属性。

其实非常的简单,只需要在我们定义对象的时候初始化一个属性,并且给这个属性一个初始值,然后在调用 defineProperty 方法的时候,将这个属性的值修改为我们想要的值就可以了。

代码如下:

<script>
    let obj = {name: 'Example'};

    Object.defineProperty(obj, 'name', {
        value: 'BNTang'
    });

    console.log(obj);
</script>

Vue双向数据绑定原理-上_数据_06



标签:Vue,obj,name,绑定,value,Object,双向,defineProperty,属性
From: https://blog.51cto.com/u_15652665/8390084

相关文章

  • Vue实验记录
    webpack安装首先下载node.jshttps://nodejs.org/en下载完成后进行安装,直接下一步就可以安装完成后,在cmd中查看是否安装成功然后安装webpack安装脚手架创建项目选择第二个创建完成后的效果进入项目并运行在学习通中下载源码,把源码按照项目格式放到创建好的项目......
  • vuejs3.0 从入门到精通——项目搭建
    项目搭建一、环境准备软件名称软件版本nodev20.9.0npm10.1.0Windows10专业版22H2vue/cli5.0.8vitev4.5.0二、vite创建项目>npminitvite@latestsaas--templatevue√Selectaframework:»Vue√Selectavariant:»TypeScriptSca......
  • Vue-cli 用自定义的组件有遇到过哪些问题?
    在components目录新建你的组件文件(indexPage.vue),script一定要exportdefault{}在需要用的页面(组件)中导入:importindexPagefrom'@/components/indexPage.vue'注入到vue的子组件的components属性上面,components:在template视图view中使用,例如命名为inde......
  • Vue3+Element plus 实现表格可编辑
    <template><div><el-buttontype="primary"@click="handleAdd">新增</el-button></div><div><el-table:data="tableData"style="width:100%&quo......
  • vue3 与 vue2 的区别
    布尔型Attribute​布尔型attribute依据true/false值来决定attribute是否应该存在于该元素上。disabled就是最常见的例子之一。v-bind在这种场景下的行为略有不同:<button:disabled="isButtonDisabled">Button</button>当isButtonDisabled为真值或一个空字符串(......
  • Vue_MQTT项目搭建记录
    新建vue3项目#新建vite+vue3的项目npminitvue@latestyarn安装依赖包yarnaddmqtt初探-连接阿里云物联网平台代码:<template><div><h1>LED-IOT</h1><button@click="connectToBroker">Connect</button><button@......
  • vue3源码学习api-vue-sfc文件编译
    vue最有代表性质的就是.VUE的文件,每一个vue文件都是一个组件,那么vue组件的编译过程是什么样的呢Vue单文件组件(SFC)和指令ast语法树一个Vue单文件组件(SFC),通常使用*.vue作为文件扩展名,它是一种使用了类似HTML语法的自定义文件格式,用于定义Vue组件。一个Vue单......
  • Vue 组件里的定时器要怎么销毁?
    如果页面上有很多定时器,可以在data选项中创建一个对象timer,给每个定时器取个名字一一映射在对象timer中,在beforeDestroy构造函数中清除,beforeDestroy(){ for(letkinthis.timer){ clearInterval(k) }}如果页面只有单个定时器,可以这么做consttimer=setInterv......
  • 记录--Vue2屎山之 Table 屎山
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言Vue2将在2023年年底停止维护了,但是Vue2的代码却不会在2023年消失,还会越来越多;难以想象几十万行或者几百万行的Vue2代码迁移到Vue3,这是不可能办到的;老一点的前端程序员肯定经历过把大型项目从jQue......
  • VUE 前端读取excel表格内容
    <el-uploadclass="upload-demo":action="''":show-file-list="false":auto-upload="false":before-upload="beforeUpload":on-success="handleSuccess&quo......