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>

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

Vue 3中,使用props来传递数据给子组件是非常常见的。props是父组件向子组件传递数据的一种方式,可以将数据从父组件传递到子组件,并在子组件中使用这些数据。 在Vue 3中,使用props的步骤如下: 1. 在子组件中定义props:在子组件的选项中,使用props属性来定义需要接收的属性。可以使用数组或对象的形式来定义props,数组形式用于简单的属性定义,对象形式用于更复杂的属性定义。 2. 在父组件中传递props:在父组件中使用子组件时,可以通过在子组件标签上使用属性的方式来传递props。可以直接传递数据,也可以使用v-bind指令动态绑定数据。 3. 在子组件中使用props:在子组件中,可以通过this关键字来访问props中的数据。可以直接在模板中使用props的值,也可以在JavaScript代码中使用props的值。 下面是一个示例代码,演示了如何在Vue 3中使用props: ```javascript // 子组件 <template> <div> <p>{{ message }}</p> </div> </template> <script> export default { props: { message: String } } </script> // 父组件 <template> <div> <child-component :message="parentMessage"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentMessage: 'Hello from parent component' } } } </script> ``` 在上面的示例中,子组件通过props属性定义了一个名为message的属性,类型为String。父组件通过v-bind指令将parentMessage的值传递给子组件的message属性。子组件在模板中使用了props中的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐爸muba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值