首页 > 其他分享 >Vue3.5+ 响应式 Props 解构

Vue3.5+ 响应式 Props 解构

时间:2024-09-17 08:50:42浏览次数:3  
标签:const Props 解构 content 3.5 Vue3.5 props foo defineProps

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

在 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>

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

标签:const,Props,解构,content,3.5,Vue3.5,props,foo,defineProps
From: https://blog.csdn.net/m0_37943716/article/details/142307333

相关文章

  • 关于JS解构数据结构的表现形式
    对数组或对象类数据结构,尤其是复杂的JOSN数据结构,要从中取出想要的个别数据,往往会采用遍历方法进行,即麻烦又增加了运行时间。从ES6开始,JS增加了解构进行简化,本质上是打散复杂的数据结构,将其折分为更小的部分(复制出的小结构),从而使用数据更为方便快捷。一、对象解构1.单层对......
  • JS中的 解构、可扩展运算符(...)
    一、解构([x,x,x]=[1,2,3])解构,英文名叫Destructuring。核心就是[A,B,C]=[1,2,3]这种形式。其核心思想就是把数组/对象的每个元素解构出来。虽然这话说的很抽象,但举个例子你就明白了。1.1数组解构const[a,b,c]=[1,2,3]console.log(a)//1console.log(b)/......
  • 牛逼!在Vue3.5中仅仅2分钟就能封装一个自动cancel的fetch函数
    前言在欧阳的上一篇这应该是全网最详细的Vue3.5版本解读文章中有不少同学对Vue3.5新增的onWatcherCleanup有点疑惑,这个新增的API好像和watchAPI回调的第三个参数onCleanup功能好像重复了。今天这篇文章来讲讲新增的onWatcherCleanup函数的使用场景:封装一个自动cancel的fetch......
  • 使用Vue3.5的onWatcherCleanup封装自动cancel的fetch函数
    前言在欧阳的上一篇这应该是全网最详细的Vue3.5版本解读文章中有不少同学对Vue3.5新增的onWatcherCleanup有点疑惑,这个新增的API好像和watchAPI回调的第三个参数onCleanup功能好像重复了。今天这篇文章来讲讲新增的onWatcherCleanup函数的使用场景:封装一个自动cancel的fetch函......
  • 【useTranslation】兼容数组解构和对象解构的三种实现方式
    useTranslation使用:数组解构:const[t,i18n]=useTranslation();对象解构:const{t,i18n}=useTranslation();useTranslation兼容数组解构和对象解构的三种实现方式:1.返回带属性的数组在这种实现方式中,返回一个数组,并为该数组添加对象属性。这样可以同时使用数组......
  • 这应该是全网最详细的Vue3.5版本解读
    版本号这次的版本号是天元突破红莲螺岩,这是07年出的一个二次元动漫,作者是没看过的。在此之前我一直以为这次的版本号会叫黑神话:悟空,可能悟空不够二次元吧。响应式响应式相关的内容主要分为:重构响应式、响应式props支持解构、新增onEffectCleanup函数、新增basewatch函数......
  • React 中的 props 属性传递技巧
    在React开发中,组件之间的通信是非常重要的。props 是React中用于组件间通信的主要机制之一。通过 props,父组件可以向子组件传递数据和回调函数。本文将详细介绍 props 的基本用法、常见问题及如何避免错误,并通过具体的代码示例帮助理解。一、props 的基本用法1.传递基......
  • 这应该是全网最详细的Vue3.5版本解读kh
    合集-vue3代码修炼秘籍(16)1.答应我,在vue中不要滥用watch好吗?02-292.一文搞懂Vue3defineModel双向绑定:告别繁琐代码!02-043.没有虚拟DOM版本的vue(VueVapor)01-264.有了CompositionAPI后,有些场景或许你不需要pinia了01-235.你不知道的vue3:使用runWithContext实现在非setup期......
  • 这应该是全网最详细的Vue3.5版本解读
    前言Vue3.5正式版在这两天发布了,网上已经有了不少关于Vue3.5版本的解读文章。但是欧阳发现这些文章对3.5中新增的功能介绍都不是很全,所以导致不少同学有个错觉,觉得Vue3.5版本不过如此,选择跳过这个版本等下个大版本再去更新。所以欧阳写了这篇超级详细的Vue3.5版本解读文章,小伙伴......
  • 在 Vue 3 中,使用 `PropType` 定义复杂类型的 props
    在Vue3中,使用PropType可以定义复杂类型的props。这对于确保组件props接收到的值符合预期的结构非常有用。下面是一些定义复杂类型的常见方法。1.定义对象类型你可以使用TypeScript的接口或类型别名来定义复杂对象类型。import{defineComponent,PropType}from'......