Vue3——第四章(响应式基础:reactive、ref)

news/2024/11/27 23:44:19/

一、用reactive()声明响应式状态

  • 我们可以使用 reactive() 函数创建一个响应式对象或数组:
    在这里插入图片描述

  • 响应式对象其实是 JavaScript Proxy,其行为表现与一般对象相似。不同之处在于 Vue 能够跟踪对响应式对象属性的访问与更改操作。

  • 要在组件模板中使用响应式状态,需要在 setup() 函数中定义并返回。
    在这里插入图片描述

  • 自然,我们也可以在同一个作用域下定义一个更新响应式状态的函数,并作为一个方法与状态一起暴露出去:
    在这里插入图片描述

  • 暴露的方法通常会被用作事件监听器:
    在这里插入图片描述

二、reactive() 的局限性

  1. 仅对对象类型有效(对象、数组和 Map、Set 这样的集合类型),而对 string、number 和 boolean 这样的 原始类型 无效。

  2. 因为 Vue 的响应式系统是通过属性访问进行追踪的,因此我们必须始终保持对该响应式对象的相同引用。这意味着我们不可以随意地“替换”一个响应式对象,因为这将导致对初始引用的响应性连接丢失:
    在这里插入图片描述

  • 同时这也意味着当我们将响应式对象的属性赋值或解构至本地变量时,或是将该属性传入一个函数时,我们会失去响应性:
    在这里插入图片描述

三、用 ref() 定义响应式变量

  • reactive() 的种种限制归根结底是因为 JavaScript 没有可以作用于所有值类型的 “引用” 机制。
  • 为此,Vue 提供了一个 ref() 方法来允许我们创建可以使用任何值类型的响应式 ref:
    在这里插入图片描述
  • ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象:
    在这里插入图片描述
  • 和响应式对象的属性类似,ref 的 .value 属性也是响应式的。
  • 同时,当值为对象类型时,会用 reactive() 自动转换它的 .value。
  • 一个包含对象类型值的 ref 可以响应式地替换整个对象:
    在这里插入图片描述
  • ref 被传递给函数或是从一般对象上被解构时,不会丢失响应性:
    在这里插入图片描述
  • 简言之,ref() 让我们能创造一种对任意值的 “引用”,并能够在不丢失响应性的前提下传递这些引用。
1、ref 在模板中的解包
  • 当 ref 在模板中作为顶层属性被访问时,它们会被自动“解包”,所以不需要使用 .value。
    在这里插入图片描述
  • 请注意,仅当 ref 是模板渲染上下文的顶层属性时才适用自动“解包”。 例如, foo 是顶层属性,但 object.foo 不是。
    在这里插入图片描述
2、ref 在响应式对象中的解包
  • 当一个 ref 被嵌套在一个响应式对象中,作为属性被访问或更改时,它会自动解包,因此会表现得和一般的属性一样:
    在这里插入图片描述

  • 如果将一个新的 ref 赋值给一个关联了已有 ref 的属性,那么它会替换掉旧的 ref:
    在这里插入图片描述

3、响应性语法糖 (实验性)
  • 相对于普通的 JavaScript 变量,我们不得不用相对繁琐的 .value 来获取 ref 的值。
  • 这是一个受限于 JavaScript 语言限制的缺点。
  • 然而,通过编译时转换,我们可以让编译器帮我们省去使用 .value 的麻烦。
  • 请注意它仍处于实验性阶段,在最终提案落地前仍可能发生改动。
    在这里插入图片描述

四、<script setup>

  • 在 setup() 函数中手动暴露大量的状态和方法非常繁琐。
  • 幸运的是,我们可以通过使用构建工具来简化该操作。
  • 当使用单文件组件(SFC)时,我们可以使用<script setup>来大幅度地简化代码。
    在这里插入图片描述
  • <script setup>中的顶层的导入和变量声明可在同一组件的模板中直接使用。
  • 你可以理解为模板中的表达式和 <script setup> 中的代码处在同一个作用域中。


http://www.ppmy.cn/news/10908.html

相关文章

【Linux】Linux 项目自动化构建工具 -- make/makefile

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux 文章目录一、前言二、概念三、demo 实现四、原理与规则1、依赖关系和依赖方法① 感性理解② 深层理解…

计算机网络培训总结

在11月份我参加了这次计算机网络培训&#xff0c;虽然这次计算机网络培训的时间很短&#xff0c;但对我来说受益匪浅,充分认识到了自己在计算机应用与网络方面存在很多不足。培训使我的眼界开阔了、思考问题的角度改变了&#xff0c; 许多疑问得到了解决或者启发。 作为一名信息…

STL空间配置器框架分析

目录 一、空间配置器概念 二、空间配置器的作用 三、内存池技术 四、空间配置器的实现原理 3.1 流程概述 3.2 一级空间配置器 3.3 二级空间配置器 3.3.1 二级空间配置器设计 3.3.2 内存碎片问题 一、空间配置器概念 即为各个容器高效的管理空间(空间的申请与回收)的。…

分享48个Go源码,总有一款适合您

Go源码 分享48个Go源码&#xff0c;总有一款适合您 Go源码下载链接&#xff1a;https://pan.baidu.com/s/1FhQ6NzB3TWsv9res1OsJaA?pwdr2d3 提取码&#xff1a;r2d3 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;…

Linux 环境使用定时任务执行shell脚本

前言&#xff1a;Linux添加定时任务需要依赖crond服务&#xff0c;如果没有该服务&#xff0c;需要先安装&#xff1a;yum -y install crontabs 1、crond服务相关命令介绍 启动crond服务&#xff1a;service crond start 停止crond服务&#xff1a;service crond stop 重启cro…

Python jieba 中文分词

jieba库主要有三种方法1 lcut(data) 精确模式2 lcut(data,cut_allTrue) 全模式3 lcut_for_search(data) 搜索引擎模式import jieba txt "花半开最美&#xff0c;情留白最浓&#xff0c;懂得给生命留白&#xff0c;亦是一种生活的智慧。" modle1 jieba.lcut(txt) pri…

Apache APISIX Ingress 1.6 正式发布!

距离上一个版本 v1.5 发布&#xff0c;已经过了 3 个月&#xff0c;我们很高兴地宣布 Apache APISIX Ingress v1.6 正式发布&#xff01; 在该版本中&#xff0c;共有 29 位贡献者 参与代码提交&#xff0c;其中 17 位是新晋贡献者 &#xff0c;感谢大家的支持和参与&#xff…

你的电路是抄来的还是算出来的?

在你看这篇文章之前&#xff0c;我想提出几点说明&#xff1a; &#xff08;1&#xff09;最近在看拉扎维的书&#xff0c;写下来这些东西&#xff0c;这也只是我个人在学习过程中的一点总结&#xff0c;有什么观点大家可以相互交流&#xff1b;&#xff08;2&#xff09;不断的…