Vue内部运行机制剖析-模拟Vue的响应式原理

本文主要是介绍Vue内部运行机制剖析-模拟Vue的响应式原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • Vue.js 是一款 MVVM 框架:核心实现就是响应式系统;理解这里的响应式指的是数据的响应式

模拟视图更新

  • 使用Object.defineProperty 封装方法
function cb(val) { /* 渲染视图 */console.log("视图更新啦~");
}function defineReactive(obj, key, val) {Object.defineProperty(obj, key, {enumerable: true,/* 属性可枚举 */configurable: true,/* 属性可被修改或删除 */get: function reactiveGetter() {console.log(val)return val; /* 实际上会依赖收集,下一小节会讲 */},set: function reactiveSetter(newVal) {if (newVal === val) return;console.log(newVal)}});
}
上面的Object.defineProperty()用法解读
  • 功能:方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。如果不指定configurable, writable, enumerable ,则这些属性默认值为false,如果不指定value, get, set,则这些属性默认值为undefined
  • 语法:Object.defineProperty(obj, prop, descriptor)
    • obj: 需要被操作的目标对象
    • prop: 目标对象需要定义或修改的属性的名称
    • descriptor: 将被定义或修改的属性的描述符
var obj = new Object();Object.defineProperty(obj, 'name', {configurable: false,writable: true,enumerable: true,value: '张三'
})console.log(obj.name)  //张三
另一种相似的Object.defineProperties()
  • 功能:方法直接在一个对象上定义一个或多个新的属性或修改现有属性,并返回该对象。
  • 语法: Object.defineProperties(obj, props)
    • obj: 将要被添加属性或修改属性的对象
    • props: 该对象的一个或多个键值对定义了将要为对象添加或修改的属性的具体配置
var obj = new Object();
Object.defineProperties(obj, {name: {value: '张三',configurable: false,writable: true,enumerable: true},age: {value: 18,configurable: true}
})console.log(obj.name, obj.age) // 张三, 18

封装一层observer

  • 这个函数传入一个 value(需要「 响应式」化 的对象),通过遍历所有属性的方式对该对象的每一个属性都通过defineReactive方法
function cb(val) { /* 渲染视图 */console.log("调用set方法视图更新啦~");
}function defineReactive(obj, key, val) {Object.defineProperty(obj, key, {enumerable: true,/* 属性可枚举 */configurable: true,/* 属性可被修改或删除 */get: function reactiveGetter() {console.log("调用get方法,打印值为:"+val);return val; },set: function reactiveSetter(newVal) {if (newVal === val) return;cb(newVal)}});
}function observer(value) {if (!value || (typeof value !== 'object')) {return;}Object.keys(value).forEach((key) => {defineReactive(value, key, value[key]);});
}// 定义一个对象
var aobj = {'name': 'wyh','sex': 'man',
};// 观察aobj
observer(aobj)// 查看数据调用get方法
aobj.name// 修改调用set 方法
aobj.name = '123';

以上浏览器的打印:
在这里插入图片描述

模拟封装成VUE的方式

  • 在 Vue 的构造函数中,对 的 进行处理,这里的 想必大家很熟悉,就是平时我们在写 Vue 项目时组件中的 属性(实际上是一个函数,这里当作一个对象来简单处理)。
class Vue {/* Vue 构造类 */constructor(options) {console.log(options)this._data = options.data;observer(this._data);}
}let vue = new Vue({data: {test: "I am test."},methods:"function list"
});
// 修改test的值 等价于vue的this.XXX=XXX;
vue._data.test = "hello,world."; /* 视图更新啦~ */// 打印值
console.log(vue._data.test)

在这里插入图片描述

此文为最近学习小册“剖析VueJS内部运行机制”的学习总结;

这篇关于Vue内部运行机制剖析-模拟Vue的响应式原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083619

相关文章

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用