Vue3.5+ 响应式 Props 解构

ops/2024/9/21 11:26:25/

你好同学,我是沐爸,欢迎点赞、收藏、评论和关注。

在 Vue 3.5+ 中,响应式 Props 解构已经稳定并默认启用。这意味着在 <script setup> 中从 defineProps 调用解构的变量现在是响应式的。这一改进大大简化了声明带有默认值的 props 的方式,并使得在子组件中直接使用解构后的 props 变量时能够保持响应性。

最新语法

Vue 的响应系统基于属性访问跟踪状态的使用情况。例如,在计算属性或侦听器中访问 props.foo 时,foo 属性将被跟踪为依赖项。

因此,在以下代码的情况下:

const { foo } = defineProps(["foo"]);
watchEffect(() => {// 在 3.5之前只运行一次// 在 3.5+ 中在 "foo" prop 变化时重新执行console.log(foo);
});

在 3.5 之前的版本中, foo是一个实际的常量,永远不会改变。在 3.5 及以上版本,当在同一个 <script setup> 代码块中访问由 defineProps 解构的变量时,Vue 编译器会自动在前面添加 props.。因此,上面的代码等同于以下代码:

const props = defineProps(["foo"]);
watchEffect(() => {// `foo` 由编译器转换为`props.foo`console.log(props.foo);
});

此外,你可以使用 JavaScript 原生的默认值语法声明 props 默认值。这在使用基于类型的 props 声明时特别有用。

const { foo = 'hello' } = defineProps<{ foo?: string }>()

watch 监听解构的 props

const { foo } = defineProps(["foo"]);watch(foo, /_ ... _/);

这并不会按预期工作,因为它等价于 watch(props.foo, ...)——我们给 watch 传递的是一个值而不是响应式数据源。实际上,Vue 的编译器会捕捉这种情况并发出警告。

与使用 watch(() => props.foo, ...) 来侦听普通 prop 类似,我们也可以通过将其包装在 getter 中来侦听解构的 prop:

watch(() => foo/* ... */
);

此外,当我们需要传递解构的 prop 到外部函数中并保持响应性时,这是推荐做法:

useComposable(() => foo);

外部函数可以调用 getter (或使用 toValue 进行规范化) 来追踪提供的 prop 变更。例如,在计算属性或侦听器的 getter 中。

示例一 watchEffect

3.5+ 版本
<template><div>{{ content }}</div>
</template><script setup>javascript">import { defineProps, watchEffect } from "vue";// 解构 props,注意这里的变量是响应式的const { content } = defineProps(["content"]);watchEffect(() => {// 在 3.5 之前只运行一次// 在 3.5+ 中在 "content" prop 变化时重新执行console.log(content);});
</script>

3.5 前的版本

<template><div>{{ content }}</div>
</template><script setup>javascript">import { defineProps, watchEffect } from "vue";const props = defineProps(["content"]);watchEffect(() => {console.log(props.content);});
</script>

示例二 watch

3.5+ 版本
<template><div>{{ content }}</div>
</template><script setup>javascript">import { defineProps, watch } from 'vue'const { content } = defineProps(['content'])watch(() => content,(newValue) => {console.log(newValue))
</script>

3.5 前的版本

<template><div>{{ content }}</div>
</template><script setup>javascript">import { defineProps, watch } from 'vue'const props = defineProps(['content'])watch(() => props.content,(newValue) => {console.log(newValue))
</script>

示例三 computed

3.5+ 版本
<template><div>{{ content }}<br />{{ formatContent }}</div>
</template><script setup>javascript">import { defineProps, computed } from "vue";const { content } = defineProps(["content"]);const formatContent = computed(() => content.toUpperCase());
</script>

3.5 前的版本

<template><div>{{ content }}<br />{{ formatContent }}</div>
</template><script setup>javascript">import { defineProps, computed } from "vue";const props = defineProps(["content"]);const formatStr = computed(() => props.content.toUpperCase());
</script>

好了,分享结束,谢谢点赞,下期再见。


http://www.ppmy.cn/ops/113764.html

相关文章

比较:wav2vec2_large_librivox.yaml与 wav2vec2_base_librispeech.yaml配置文件

比较:wav2vec2_large_librivox.yaml 与 wav2vec2_base_librispeech.yaml 配置文件 在使用 Fairseq 训练 wav2vec 2.0 模型时,有多个预定义的配置文件可供选择,每个配置文件适用于不同的数据集和模型大小。本文将详细比较 wav2vec2_large_librivox.yaml 和 wav2vec2_base_li…

HarmonyOS Next鸿蒙扫一扫功能实现

直接使用的是华为官方提供的api&#xff0c;封装成一个工具类方便调用。 import { common } from kit.AbilityKit; import { scanBarcode, scanCore } from kit.ScanKit;export namespace ScanUtil {export async function startScan(context: common.Context) : Promise<s…

【分布式哈希表DHT】

1. P2P分布式文件系统发展历史 1.1 基于中央数据库协调的P2P文件网络 第 1代 P2P 文件网络需要中央数据库协调&#xff0c;例如在 2000年前后风靡一时的音乐文件分享系统 Napster。在 Napster中&#xff0c;使用一个中心服务器接收所有的查询&#xff0c;服务器会向客户端返回…

Java项目实战II基于Java+Spring Boot+MySQL的洗衣店订单管理系统(开发文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着生活节奏的加快&#xff0c;现代人对便捷、高效服务的需求日益增长&#xff0c;洗衣店作为日常生…

【网络安全】对称密码体制

1. 对称密码体制概述 1.1 定义与特点 对称密码体制&#xff0c;也称为单钥密码体制&#xff0c;是一种加密方法&#xff0c;其中加密和解密过程使用相同的密钥。这种加密方式的主要特点包括简单、高效和计算速度快&#xff0c;适合于大量数据的快速加密和解密。对称密码体制的…

numpy的花式引用

在 NumPy 中&#xff0c;花式索引&#xff08;Fancy Indexing&#xff09;是一种强大的数组索引方式&#xff0c;允许使用整数数组或布尔数组来访问数组的元素&#xff0c;而不仅仅是通过传统的切片操作。这种方式特别适合从数组中根据条件或特定位置获取元素。下面详细介绍花式…

k8s中的微服务

目录 一、什么是微服务 二、微服务的类型 三、IPVS模式 1、ipvs模式配置方式 &#xff08;1&#xff09;在所有节点中安装ipvsadm &#xff08;2&#xff09;修改master节点的代理配置 &#xff08;3&#xff09;重启pod 四、微服务类型详解 1、clusterip 示例&#…

青柠视频云——如何开启HTTPS服务?

前言 由于青柠视频云的语音对讲会使用到HTTPS服务&#xff0c;这里我们说一下如何申请证书以及如何在实战中部署并且配置使用。 一、证书申请 1、进入控制台 我们拿阿里云的免费个人证书为例&#xff0c;首先登录阿里云&#xff0c;在控制台找到数字证书管理服务&#xff0c;进…