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

Vue3.5+ 响应式 Props 解构

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

在 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>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>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>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>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>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>import { defineProps, computed } from "vue";const props = defineProps(["content"]);const formatStr = computed(() => props.content.toUpperCase());
</script>

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PDF扫描版文字识别OCR
  • C/C++实现植物大战僵尸(PVZ)(打地鼠版)
  • Android使用LiquidFun物理引擎实现果冻碰撞效果
  • 计算机网络-第二章【新】
  • 如何提高网站搜索排名
  • 编程基础:函数栈帧的创建和销毁
  • YOLOv8 人体姿态估计动作识别关键点检测(代码+教程)
  • 【我的 PWN 学习手札】Unsortedbin Attack
  • Vue2时间轴组件(TimeLine/分页、自动顺序播放、暂停、换肤功能、时间选择,鼠标快速滑动)
  • Sa-Token的v1.39.0自定义鉴权注解怎么玩
  • SQL案例分析:计算延迟法定退休年龄
  • 【C++】——继承详解
  • CMS之Wordpress建设
  • 数学基础 -- 线性代数之奇异值
  • iOS 18 正式上線,但 Apple Intelligence 還要再等一下
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • java8-模拟hadoop
  • MySQL几个简单SQL的优化
  • php的插入排序,通过双层for循环
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • 阿里云前端周刊 - 第 26 期
  • 后端_MYSQL
  • 讲清楚之javascript作用域
  • 聚簇索引和非聚簇索引
  • 离散点最小(凸)包围边界查找
  • 浏览器缓存机制分析
  • 设计模式(12)迭代器模式(讲解+应用)
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • (39)STM32——FLASH闪存
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (力扣)循环队列的实现与详解(C语言)
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (算法)大数的进制转换
  • (译) 函数式 JS #1:简介
  • (转)LINQ之路
  • (转)项目管理杂谈-我所期望的新人
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET : 在VS2008中计算代码度量值
  • .NET CLR Hosting 简介
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET 给NuGet包添加Readme
  • .NET 快速重构概要1
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net程序集学习心得
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET建议使用的大小写命名原则
  • .NET命名规范和开发约定
  • .net下的富文本编辑器FCKeditor的配置方法
  • @31省区市高考时间表来了,祝考试成功
  • @EnableWebMvc介绍和使用详细demo