当前位置: 首页 > news >正文

《Vuejs与实现》第 6 章(原始值响应式方案)

目录

6.1 引入 ref 的概念

6.2 响应丢失问题

6.3 自动解包 ref

6.4 总结


原始值指的是 Boolean、Number、 BigInt、String、Symbol、undefined 和 null 等类型的值
原始值是按值传递的,而非按引用传递。这意味着,如果一个函数接收原始值作为参数,那么形参与实参之间没有引用关系,它们是两个完全独立的值,对形参的修改不会影响实参。
Proxy 无法提供对原始值的代理,因此想要将原始值变成响应式数据,就必须对其做一层包裹。

6.1 引入 ref 的概念

Proxy的代理目标必须是非原始值,使我们无法拦截对原始值的操作。例如,我们无法阻止修改字符串:

let str = 'vue'
str = 'vue3' // 无法拦截这个操作

解决这个问题的方法是使用非原始值来“包裹”原始值,例如,我们可以用一个对象来包裹原始值:

const wrapper = {value: 'vue'
}
const name = reactive(wrapper) // 使用 Proxy 代理 wrapper,间接实现对原始值的拦截
name.value // vue
name.value = 'vue3' // 修改值可以触发响应

但这种方法存在两个问题:

  • 用户需要创建一个包裹对象来创建响应式的原始值。
  • 包裹对象的命名由用户定义,可能不规范,例如,可以使用 wrapper.value 或 wrapper.val。

为解决这些问题,我们可以封装一个函数,将包裹对象的创建工作封装在其中:

// 封装一个 ref 函数
function ref(val) {// 在 ref 函数内部创建包裹对象const wrapper = {value: val}// 将包裹对象变成响应式数据return reactive(wrapper)
}

上述代码,我们将创建 wrapper 对象的任务封装到 ref 函数内,然后使用 reactive 函数使其成为响应式数据并返回。这样,上述两个问题都得到了解决。

// 创建原始值的响应式数据
const refVal = ref(1)effect(() => {// 在副作用函数内通过 value 属性读取原始值console.log(refVal.value)
})
// 修改值能够触发副作用函数重新执行
refVal.value = 2

上述代码如期执行,但还有一个问题,如何区分 refVal 是原始值的包裹对象还是非原始值的响应式数据?例如:

const refVal1 = ref(1)
const refVal2 = reactive({ value: 1 })

上述代码 refVal1 和 refVal2 我们需要区分它们,因为这涉及到自动脱 ref 能力。
我们可以通过在

http://www.xdnf.cn/news/363331.html

相关文章:

  • 蓝桥杯青少 图形化编程(Scratch)编程题每日一练——图形特效
  • 嵌套路由~
  • leetcode - 双指针问题
  • Linux C语言线程编程入门笔记
  • uni-app 中的条件编译与跨端兼容
  • 区块链详解
  • 独立自主的网络浏览器——Ladybird
  • 类加载器, JVM类加载机制
  • 【PostgreSQL 中插入数据时跳过已存在记录的方法】
  • 阿里云服务器数据库故障排查指南?
  • springboot 加载 tomcat 源码追踪
  • Web端项目系统访问页面很慢,后台数据返回很快,网络也没问题,是什么导致的呢?
  • NVME / DoCA 是什么?
  • 开源数字人框架 AWESOME-DIGITAL-HUMAN 技术解析与应用指南
  • 【Ansible】模块详解
  • 切比雪夫不等式专题习题解析
  • 国联股份卫多多与北京经纬智诚签署战略合作协议
  • 使用Python和TensorFlow实现图像分类的人工智能应用
  • 计算人声录音后电平的大小(dB SPL->dBFS)
  • Leetcode刷题 由浅入深之字符串——541. 反转字符串Ⅱ
  • Spring中除DI之外获取 BEAN 的方式​
  • 数据结构每日一题day18(链表)★★★★★
  • 在自然语言处理任务中,像 BERT 这样的模型会在输入前自动加上一些特殊token
  • MCP(Model Context Protocol)是专为LLM(大语言模型)应用设计的标准化协议
  • CKESC STONE 200A-M 工业级电调技术测评:全场景适配的动力控制核心
  • 【谭浩强】第七章第14题
  • 【C语言】--指针超详解(三)
  • Qwen智能体qwen_agent与Assistant功能初探
  • 昆仑万维一季度营收增长46% AI业务成新增长点
  • epoch、batch size和steps_per_epoch的区别