Amadeus's blog Amadeus's blog
首页
  • 前端文章

    • JavaScript
    • Vue
    • TypeScript
    • 前端工程化
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • stylus
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 口语
  • 音标
  • 语法
  • 简单
  • 中等
  • 困难
  • 20年10月
  • 20年11月
  • 20年12月
  • 21年01月
  • 21年02月
  • 21年03月
  • 21年04月
  • 21年05月
  • 21年06月
  • 21年07月
  • 21年08月
  • 21年09月
  • 21年10月
  • 21年11月
  • 21年12月
  • 22年01月
  • 22年02月
  • 22年03月
  • 22年04月
  • 22年05月
  • 22年06月
  • 22年07月
  • 22年08月
  • 22年09月
  • 21年3月
  • 知识笔记
  • 22年5月
  • 22年8月
  • 22年9月
  • 学习
  • 书法
  • 面试
  • 音乐
  • 驾照
  • 深度强化学习
  • 心情杂货
  • 友情链接
关于
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Amadeus

起风了,唯有努力生存!
首页
  • 前端文章

    • JavaScript
    • Vue
    • TypeScript
    • 前端工程化
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • stylus
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 口语
  • 音标
  • 语法
  • 简单
  • 中等
  • 困难
  • 20年10月
  • 20年11月
  • 20年12月
  • 21年01月
  • 21年02月
  • 21年03月
  • 21年04月
  • 21年05月
  • 21年06月
  • 21年07月
  • 21年08月
  • 21年09月
  • 21年10月
  • 21年11月
  • 21年12月
  • 22年01月
  • 22年02月
  • 22年03月
  • 22年04月
  • 22年05月
  • 22年06月
  • 22年07月
  • 22年08月
  • 22年09月
  • 21年3月
  • 知识笔记
  • 22年5月
  • 22年8月
  • 22年9月
  • 学习
  • 书法
  • 面试
  • 音乐
  • 驾照
  • 深度强化学习
  • 心情杂货
  • 友情链接
关于
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • TypeScript笔记

  • 前端工程化

  • 面试

  • 小程序

  • Vue3源码解析

    • Vue3
    • 响应系统Reactivity
  • 设计模式

  • NestJS笔记

  • JavaScript文章

  • Vue文章

  • 学习笔记

  • 前端
  • Vue3源码解析
Amadeus
2023-02-10

响应系统Reactivity

# 响应系统Reactivity

会影响视图变化的数据是响应数据

JS的程序性。

let total = product.price * product.quantity
product.quantity = 10
// 当对象改变时,total不会发生变化,因为是值引用
1
2
3

Object.defineProperty():在对象上定义新属性,或者修改一个对象的属性,并返回该对象

/**
* product 为对象变量
* 'quantity' 为product的一个属性
* set()、get()自定义属性的set和get方法
*/
Object.defineProperty(product,'quantity',{
    set(newVal){
        quantity = newVal
        product.price * product.quantity // 并更新总价值
    },
    get(){
        return quantity
    }
})

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

在Vue3中使用Proxy代替了Object.defineProperty。通过Proxy实现响应性核心API后,Vue不会再存在新增属性而失去响应性的问题。

由于JS的限制Vue不能监听对象和数组的变化。

Proxy的最佳拍档Reflect

let product = {
    'price': 10,
    'quantity': 2,
    get Total(){	// 方法变成了属性
        return this.price * this.quantity
    }
}
Reflect.get(product, 'Total') //获取product的Total属性值
Reflect.get(product, 'Total', p2)	//添加第三个参数可以修改对象中的this指向
1
2
3
4
5
6
7
8
9

响应性数据:

reactive => new Proxy() , 并设置handler为mutableHandlers = {get,set,deleteProperty,has,ownKeys},这些函数都是Vue定义好的,指定了这些行为的操作。为了防止重复生成Proxy,使用WeakMap

effect

ref

computed

watch

Map和WeakMap的区别

WeakMap的键必须是对象,且是弱引用。

弱引用:此引用不会影响垃圾回收机制。当引用的对象,除WeakMap中的引用都不存在时,WeakMap中的此对象也会消失。

Map的键不一定是对象,且是强引用。

编辑 (opens new window)
Vue3
TypeORM

← Vue3 TypeORM→

最近更新
01
最长递增子序列
04-21
02
非递减子序列
04-21
03
全排列
04-21
更多文章>
Theme by Vdoing | Copyright © 2020-2024 Amadeus | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式