【翻译】不丢失响应式的情况下解构 props

Author

华丽

PublishDate

2023-02-08

category

编程

原文 Weekly Vue News #80 - Destructure Props in Composition API Without Losing Reactivity

<script setup> 中,我们使用 defineProps() 这个编译器宏来访问 props 。

<script setup lang="ts">
const props = defineProps<{ count: number }>()
</script>

同时,我们很喜欢在 JavaScript 使用对象解构,我们可以尝试一下解构 props。

<script setup lang="ts">
const { count } = defineProps<{ count: number }>()
</script>

当我们直接解构 props 时,响应会丢失!

props 对象进行解构,得到的 count 会变成一个原始对象(在我们这个例子中,它的类型是 number),不再是一个 refreactive 响应式对象。

为了保留响应式,最简便的办法是通过 props.count 进行数据访问。

<script setup lang="ts">
import { computed } from 'vue'
const props = defineProps<{ count: number }>()
const doubleCount = computed(() => props.count * 2)  // <-----
</script>

<template>Double Count: {{ doubleCount }}</template>

如果你一定要使用解构,那么可以使用 Vue 提供的一个工具 toRefs

<script setup lang="ts">
import { computed, toRefs } from 'vue'
const props = defineProps<{ name: string }>()
const { count } = toRefs(props)  // <-----
const doubleCount = computed(() => count.value * 2)
</script>

<template>Double Count: {{ doubleCount }}</template>

通过 toRefs(props) ,props 会变成一个普通对象,但是其所有的属性都变成原始属性的响应式引用。因此,我们在 computed 中,需要使用 name.value 的格式来获取数据,因为解构出来的对象是一个 ref 对象。

点击访问 示例

闽 ICP 备 2021009779 号 - 1 | Copyright © 2020 华丽 | Powered By Hugo