《Vue.js 设计与实现》读书笔记 - 第6章、原始值的响应式方案 & 响应式总结
第6章、原始值的响应式方案
6.1 引入 ref 的概念
既然原始值无法使用 Proxy 我们就只能把原始值包裹起来。
function ref(val) {
  const wrapper = {
    value: val,
  };
  Object.defineProperty(wrapper, '__v_isref', {
    value: true,
  });
  return reactive(wrapper);
}
为了判断一个对象是否是原始值的包裹对象,添加一个不可写不可枚举属性来判断。
6.2 响应丢失问题
响应丢失问题就是我们在通过扩展运算符获取响应式对象的值后,我们得到的值变成了普通对象。
const obj = reactive({ foo: 1, bar: 2 })
const newObj = {
  ...obj,
}
effect(() => {
  console.log(newObj.foo)
})
obj.foo = 100
可以在新建对象,然后把对应属性的get访问器设置为读取之前对象的值,这样就可以出发响应了。
function toRef(obj, key) {
  const wrapper = {
    get value() {
      return obj[key]
    },
    set(val) {
      obj[key] = val
    }
  }
  Object.defineProperty(wrapper, '__v_isref', {
    value: true,
  })
  return wrapper
}
const newObj = {
  foo: toRef(obj, 'foo'),
  bar: toRef(obj, 'bar'),
}
如果属性多的时候,需要进行批量转换
function toRefs(obj) {
  const ret = {}
  for (let key in obj) {
    ret[key] = toRef(obj, key)
  }
  return ret
}
const newObj = { ...toRefs(obj) }
自动脱 ref
我们在模板中使用 ref 对象值的时候,不需要用户再添加 .value 去使用,所以需要有一个自动脱 ref 的功能。思路就是通过一个 Proxy 代理对象,在读取的值为 ref 时,再读取对象的 .value 值,同时设置值也应该有自动设置到 value  属性的功能。
function proxyRefs(target) {
  return new Proxy(target, {
    get(target, key, receiver) {
      const value = Reflect.get(target, key, receiver)
      return value.__v_isRef ? value.value : value
    },
    set(target, key, newValue, receiver) {
      const value = target[key]
      if (value.__v_isRef) {
        value.value = newValue
        return true
      }
      Reflect.set(target, key, newValue, receiver)
    },
  })
}
响应式总结

《Vue.js 设计与实现》读书笔记 - 第6章、原始值的响应式方案 & 响应式总结的更多相关文章
- 【vue.js权威指南】读书笔记(第一章)
		最近在读新书<vue.js权威指南>,一边读,一边把笔记整理下来,方便自己以后温故知新,也希望能把自己的读书心得分享给大家. [第1章:遇见vue.js] vue.js是什么? vue.j ... 
- 【vue.js权威指南】读书笔记(第二章)
		[第2章:数据绑定] 何为数据绑定?答曰:数据绑定就是将数据和视图相关联,当数据发生变化的时候,可以自动的来更新视图. 数据绑定的语法主要分为以下几个部分: 文本插值:文本插值可以说是最基本的形式了. ... 
- Linux内核设计与实现  读书笔记 转
		Linux内核设计与实现 读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ... 
- 【2018.08.13 C与C++基础】C++语言的设计与演化读书笔记
		先占坑 老实说看这本书的时候,有很多地方都很迷糊,但却说不清楚问题到底在哪里,只能和Effective C++联系起来,更深层次的东西就想不到了. 链接: https://blog.csdn.net/ ... 
- 《Linux内核设计与实现》第八周读书笔记——第四章 进程调度
		<Linux内核设计与实现>第八周读书笔记——第四章 进程调度 第4章 进程调度35 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配 ... 
- 《Linux内核设计与分析》第六周读书笔记——第三章
		<Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ... 
- 《LINUX内核设计与实现》第三周读书笔记——第一二章
		<Linux内核设计与实现>读书笔记--第一二章 20135301张忻 估算学习时间:共2小时 读书:1.5 代码:0 作业:0 博客:0.5 实际学习时间:共2.5小时 读书:2.0 代 ... 
- 《Linux内核设计与实现》第四周读书笔记——第五章
		<Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ... 
- 《Linux内核设计与实现》第五周读书笔记——第十一章
		<Linux内核设计与实现>第五周读书笔记——第十一章 20135301张忻 估算学习时间:共2.5小时 读书:2.0 代码:0 作业:0 博客:0.5 实际学习时间:共3.0小时 读书: ... 
- 《Linux内核设计与实现》读书笔记——第五章
		<Linux内核设计与实现>读书笔记--第五章 标签(空格分隔): 20135321余佳源 第五章 系统调用 操作系统中,内核提供了用户进程与内核进行交互的一组接口.这些接口让应用程序受限 ... 
随机推荐
- 【Java】MultiThread 多线程 Re02 线程通讯
			一.等待与唤醒 /** * 线程通讯问题 * Object wait, notify, notifyAll * Condition await signal signAll * CountDownLa ... 
- 【RabbitMQ】03 订阅模式
			Pub / Sub 订阅模式 特点是 一条消息可以给多个消费者接收了 首先创建订阅模式生产者发生一些代码变动: package cn.dzz.pubSub; import com.rabbitmq.c ... 
- Python报错:performance hint: av/logging.pyx:232:5:  the GIL to be acquired
			参考: https://stackoverflow.com/questions/77410272/problems-installing-python-av-in-windows-11 https:/ ... 
- Ubuntu Server无桌面无显示器情况下虚拟屏幕xvfb的安装及设置—ubuntu18.04server服务器系统下为python安装虚拟显示器  (使用jupyter notebook在web端播放openai的gym下保存的运行视频——需安装ipython)
			1. 安装xvfb sudo apt-get install xvfb Xvfb是流行的虚拟现实库,可以使很多需要图形界面的程序虚拟运行. 2. 安装pyvirtualdisplay pyvirtu ... 
- 【转载】How to Use t-SNE Effectively    ——  (机器学习数据可视化)  t-SNE使用指南
			原文地址:https://distill.pub/2016/misread-tsne/ 说明: 原文是比较有名的一个指南性博文,讲的就是t-SNE技术的一些使用注意事项和说明,属于说明性文章,内容很不 ... 
- tensorflow/pytorch/mindspore在VGG16前向传播上的性能对比
			首先说下mindspore,作为华为的主打软件产品,该计算框架可用性一直较差,不同版本不同计算硬件下的代码往往都不是完全兼容的,也就是说你在mindspore的官网上找到的VGG预训练模型的代码是mi ... 
- 神经网络之卷积篇:详解边缘检测示例(Edge detection example)
			详解边缘检测示例 卷积运算是卷积神经网络最基本的组成部分,使用边缘检测作为入门样例.在这个博客中,会看到卷积是如何进行运算的. 在之前的博客中,说过神经网络的前几层是如何检测边缘的,然后,后面的层有可 ... 
- 2024年Apache DolphinScheduler RoadMap:引领开源调度系统的未来
			非常欢迎大家来到Apache DolphinScheduler社区!随着开源技术在全球范围内的快速发展,社区的贡献者 "同仁" 一直致力于构建一个强大而活跃的开源调度系统社区,为用 ... 
- 利用Stream实现简单的等差数列求和
			我们都熟知高斯的故事,认识等差数列也是从这个故事开始的,编程课程为了练习for循环,也在不断的练习这个从1加到100的例子,那么原始的办法是这样的: int sum1 = 0; for (int i ... 
- UCX84X笔记
			1. 管脚定义 COMP: 误差放大器补偿引脚.将外部补偿元件连接到此引脚,以修改误差放大器输出.误差放大器内部有电流限制,因此用户可以通过外部强制COMP接地来命令零占空比. UCx84x系列中的误 ... 
