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>

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

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

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

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

如果想删除, 那么就必须显示的告诉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>

!> 默认情况下通过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>

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

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

代码如下:

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

Vue双向数据绑定原理-上的更多相关文章

  1. vue双向数据绑定原理简单实现

    vue双向数据绑定原理实现 准备工作 ​ 新建一个index.js文件, 一个index.html文件 ​ index.js文件中, 定义Vue类, 并将Vue并称全局变量 window.Vue = ...

  2. vue双向数据绑定原理探究(附demo)

    昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...

  3. Vue双向数据绑定原理分析(转)

    add by zhj: 目前组里使用的是前端技术是jQuery + Bootstrap,后端使用的Django,Flask等,模板是在后端渲染的.前后端没有分离,这种做法有几个缺点 1. 模板一般是由 ...

  4. Vue双向数据绑定原理深度解析

    首先,什么是双向数据绑定?Vue是三大MVVM框架之一,数据绑定简单来说,就是当数据发生变化时,相应的视图会进行更新,当视图更新时,数据也会跟着变化. 在分析其原理和代码的时候,大家首先了解如下几个j ...

  5. 手写MVVM框架 之vue双向数据绑定原理剖析

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. Vue双向数据绑定原理解析

    基本原理 Vue.采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter和getter,数据变动时发布消息给订阅者,触发相应函数的回调 ...

  7. vue 双向数据绑定原理

    博客地址: https://ainyi.com/8 采用defineProperty的两个方法get.set 示例 <!-- 表单 --> <input type="tex ...

  8. Vue 双向数据绑定原理分析 以及 Object.defineproperty语法

    第三方精简版实现 https://github.com/luobotang/simply-vue Object.defineProperty 学习,打开控制台分别输入以下内容调试结果 userInfo ...

  9. Vue双向数据绑定原理

    https://www.cnblogs.com/kidney/p/6052935.html?utm_source=gold_browser_extension

  10. 详解 vue 双向数据绑定的原理,并实现一组双向数据绑定

    1:vue 双向数据绑定的原理: Object.defineProperty是ES5新增的一个API,其作用是给对象的属性增加更多的控制Object.defineProperty(obj, prop, ...

随机推荐

  1. Intellij IDEA 显示 access.log 日志

    先配置  SpringBoot 记录 access.log 日志,先让accesslog 显示出来

  2. springboot线程池的使用方式2

    一.简单介绍 方式1:Executors.newCachedThreadPool线程池.Executors有7种不同的线程池. private static final ExecutorService ...

  3. springboot 实现接收前端发来的图片和视频以及在页面上展示图片和视频

    springboot 实现接收前端发来的图片和视频以及在页面上展示图片和视频 一.效果: 1.上传图片 2.显示上传的图片 3.上传的视频 4.显示上传的视频 二.代码 没依赖特殊的包,引入sprin ...

  4. 《深入理解计算机系统》(CSAPP)实验四 —— Attack Lab

    这是CSAPP的第四个实验,这个实验比较有意思,也比较难.通过这个实验我们可以更加熟悉GDB的使用和机器代码的栈和参数传递机制. @ 目录 实验目的 准备工作 内容简介 代码注入攻击 Level 1 ...

  5. 封装http并挂载到全局

    https://www.bilibili.com/video/BV1BJ411W7pX?p=32 具体使用:https://blog.csdn.net/weixin_44763569/article/ ...

  6. uni-app点赞效果

  7. 30 秒使用 Sealos 搭建个人密码管理器 Vaultwarden

    我与 LastPass 的曲折恋情 超过 8 年网龄的我,注册过很多网站帐号,每个网站的密码我都用不同的复杂密码.一开始我全靠脑力记忆这些密码,后来渐渐觉得记起来很困难,就记录在笔记本上.但是随着时间 ...

  8. 小白学标准库之 mux

    本文介绍第三方库 gorilla/mux,相比于 Go 自带的 net/http 它能提供更为强大的路由处理功能. mux 表示 HTTP request multiplexer (HTTP 请求多路 ...

  9. Blazor的技术优点

    Blazor是一种使用.NET和C#构建客户端Web应用程序的新兴技术.它允许开发者在浏览器中直接运行.NET代码,而无需依赖JavaScript.Blazor的技术优点主要表现在以下几个方面: 单一 ...

  10. Manjaro Linux永久修改主机名

    技术背景 Linux系统中默认的主机名可以通过hostname指令进行查询,一般默认的是一串的随机字符串: [dechin@dechin-20n2s01200 numba]$ hostname dec ...