vue源码限于水平,看的乱七八糟,只是看了一些文章解析有些收获,遂记。

现在vue3已经出来了,是不是研究vue2.x过时了?非也非也。

抛去大部分vue使用者还在用的情况,vue3的很多思路都可以在vue2中得到体现,所以学习还是有必要的。

这篇文章就聊聊到响应式原理,从百草园到三味书屋,哦不,从 Vue2 到 Vue3。 聊Vue2响应式就必须聊聊 Objet.defineProperty⇲…

talk is cheap…

Objet.defineProperty

用过 vue 的都知道,vue 如果有个数据 firstName 改变了,那么相应用到 firstName 的地方都得改变,
比如
计算属性(computed

computed: {fullName: () => this.firstName + this.lastName
}

数据监听(watch

watch: {firstName: function (val, oldVal) {// dosomething}
}

模板渲染(render

<span>姓: {{ firstName }}<span>

这三个地方就相当于 firstName 的依赖(Watcher),后面细讲。

另外 Vue 中数据定义是这样的

new Vue({el: '#app',data: { firstName: '王' }
})

那么怎么才能监听到 fisrtName 的改变并更新相应的数据呢?

在 Object.defineProperty 之前, 是 MutationObserver -MDN ⇲,他的作用如下

MutationObserver接口提供了监视对DOM树所做更改的能力。它被设计为旧的Mutation Events功能的替代品

这是已经淘汰的东西,不多做介绍, vue2.x 做法就是利用 Objet.defineProperty 监听 data 的改变从而去触发各个部分的更新。

做个简单的介绍,可以猛戳 这里⇲ 了解更多.
以上面为例

const data = { firstName: '李' };
const vm = {};
Object.defineProperty(vm, "firstName", {enumerable: true,configurable: true,get() { console.log('我被获取了!'); return data.firstName; },set(newValue) { data.firstName = newValue;console.log('我被改变了, 这是新值:', newValue) },
});
vm.firstName = '李';
console.log(vm.firstName)
// 我被改变了, 这是新值: 李
// 我被获取了!
// 李

上面给 vm 定义一个 响应式 firstName 属性,并且这个属性可枚举(enumerable : true)、可配置(configurable : true)。firstName 改变就就会触发 set 方法,获取 firstName 就会触发 get 方法。

把响应式核心 实现方法说了,再来理一理 vue 响应式实现原理。

vue响应式原理

先上一张图,来自 掘金小册(推荐!) 剖析 Vue.js 内部运行机制⇲

上面的图基本就很经典的概括了 Vue 的生命周期。包含 初始化、编译、挂载、更新 。。。而Vue的响应式也基本贯穿了整个周期。

另外注意:

  • 上图 watcher 不是代码中的 vue 中的 watch ,而是依赖
  • watcher(依赖) 有三类: computed watcherwatch watcherrender watcher,这里提一嘴,后面再说。

关于响应式原理这张图概括的比较全了

你这手写vue2.x/3.x的响应式保熟吗?相关推荐

  1. 前端进阶-手写Vue2.0源码(三)|技术点评

    前言 今天是个特别的日子 祝各位女神女神节快乐哈 封面我就放一张杀殿的帅照表达我的祝福 哈哈 此篇主要手写 Vue2.0 源码-初始渲染原理 上一篇咱们主要介绍了 Vue 模板编译原理 它是 Vue ...

  2. 【源码共享】我花2小时写了微信官网的响应式布局HTML+CSS 换成旅行主题风格更炫酷了

    微信官网仿写效果 ↑ 移动端响应式效果 ↑ 微信官网首页,简约干净,能学习写好这个首页,就能掌 握HTML网页设计前端盒子的布局.嵌套,及css效果的 使用... 微信官网首页主要有以下几个需要关注的 ...

  3. 【手写 Vue2.x 源码】第二十八篇 - diff 算法-问题分析与 patch 优化

    一,前言 首先,对 6 月的更文内容做一下简单回顾: Vue2.x 源码环境的搭建 Vue2.x 初始化流程介绍 对象的单层.深层劫持 数组的单层.深层劫持 数据代理的实现 对象.数组数据变化的观测 ...

  4. html中响应式字体怎么写,如何实现网页中字体响应式

    回顾上一篇文章"[实战]用Media Query实现响应式Web布局",谈到页面框架实现响应式布局,那么这里就有一个疑问:字体也可以吗?答案:完全可以. 大伙都知道,现在设置字体大 ...

  5. 手写vue2的Lazyload

    调用方式,express写个后台服务调图片,具体使用不贴了 import VueLazyload from "./modules/vue-lazyload";Vue.use(Vue ...

  6. 【手写 Vue2.x 源码】第十八篇 - 根据 render 函数,生成 vnode

    一,前言 上篇,介绍了 render 函数的生成,主要涉及以下两点: 使用 with 对生成的 code 进行一次包装 将包装后的完整 code 字符串,通过 new Function 输出为 ren ...

  7. 【手写 Vue2.x 源码】第十九篇 - 根据 vnode 创建真实节点

    一,前言 上篇,根据 render 函数,生成 vnode,主要涉及以下几点: 封装 vm._render 返回虚拟节点 _s,_v,_c的实现 本篇,根据 vnode 虚拟节点渲染真实节点 二,根据 ...

  8. 【手写 Vue2.x 源码】第二十二篇 - dep 和 watcher 关联

    一,前言 上篇,主要介绍了 Vue 依赖收集的过程分析: 介绍了 Vue 的响应式特性 介绍了 Vue 的依赖收集过程 介绍了 dep 和 watcher 以及观察者模式: 本篇,Vue 依赖收集的实 ...

  9. 【手写 Vue2.x 源码】第三十一篇 - diff 算法 - 比对优化(下)

    一,前言 上篇,diff 算法-比对优化(上),主要涉及以下几个点: 介绍了如何对儿子节点进行比对: 新老儿子节点可能存在的 3 种情况及代码实现: 新老节点都有儿子时,diff 的方案介绍与处理逻辑 ...

  10. 基于人工智能方法的手写数字图像识别_【工程分析】基于ResNet的手写数字识别...

    ねぇ 呐 私に気付いてよ 快点注意到我吧 もう そんな事 那种事 一定 望んでも 再去奢求 しょうがないだろ 也无可奈何吧 --真野あゆみ<Bipolar emotion>(作詞:Mits ...

最新文章

  1. html作业登陆界面
  2. B2c商城图片尺寸设定研究 尺寸应该多大合适
  3. mybatis-spring整合jar包功能
  4. Windows服务器版本简介
  5. VTK:Points之PowercrustExtractSurface
  6. Docker cgroups资源控制
  7. 用cmd命令下载百度云的资源
  8. 数学-盲点题:九个点用四条直线连起来
  9. 2014年第五届蓝桥杯C/C++程序设计本科B组省赛-史丰收速算
  10. OCJP 考试题之八
  11. 电脑钢琴模拟器——Flash版(附曲谱)
  12. idea springboot mybaits扫描不到第三方jar中的mapper
  13. 社区宽带繁忙是什么意思_康平附近企业宽带价位,附近光纤宽带上门安装多少钱...
  14. Python数据分析入门与实践
  15. 软件用户手册编写指南
  16. python股票成交量柱状图_成交量柱状图怎样判断股票行情
  17. 阿里二面: 说一下从url输入到返回请求的过程
  18. 【Java】关于编程环境
  19. 嵌入式学习——周总结
  20. 关于皕杰小程序打开公众号推文

热门文章

  1. APP Launch 优化
  2. 淘宝+京东+拼多多+苏宁易购+聚划算百亿补贴,双11秒杀抢购助手脚本,分享源码
  3. OSChina 周四乱弹 —— 不要生气!我不要生气!
  4. 电脑重启桌面 计算机图标消失,电脑重启后计算机图标不见了怎么办
  5. 打印机扫描显示服务器拒绝访问,怎么解决打印机拒绝访问问题?打印机拒绝访问的解决方法...
  6. linux 设置mail
  7. codeforces 1183H
  8. Matlab提示Ill-conditioned covariance created at iteration
  9. 【游戏开发进阶】玩转贝塞尔曲线,教你在Unity中画Bezier贝塞尔曲线(二阶、三阶),手把手教你推导公式
  10. 使用Mac下的sequel Pro数据库错误MySQL said: Authentication plugin 'caching_sha2_password'