我试图在Vue 3中观看props ,但奇怪的是,当我分解props 时,观察者就不工作了.但在不 destruct struct 的情况下,它可以按预期工作.我错过了什么?

P.S. I am using Vue 3 + Vite

This is not working

export default {
    props: {
        modelValue: {
            type: Boolean,
            default: false,
        },
    },

    setup({ modelValue }, context)
    {
        watch(() => modelValue, (newValue, oldValue) => {
            console.log(newValue)
        })
    },
}

但如果我不分解它,那么it works

setup(props, context) {
    watch(() => props.modelValue, (newValue, oldValue) => {
        console.log(newValue)
    })
}

推荐答案

props传给setup的是reactive个物体,所有的react 都与物体周围的代理紧密相连.

如果对该对象的属性取值,则可以得到:

  1. 对象(如果值为Object),它也是被动的
  2. 值(例如整数),该值本身不能react

而解构只是价值分配:

const  { modelValue } = props

...与以下内容相同:

const modelValue = props.modelValue 

可以使用docs中描述的toRefs

export default {
    props: {
        modelValue: {
            type: Boolean,
            default: false,
        },
    },

    setup(props, context)
    {
        let { modelValue } = toRefs(props)

        watch(modelValue, (newValue, oldValue) => {
            console.log(newValue)
        })
    },
}

现在modelValueref,所以它可以作为watch的第一个参数传递(函数不需要这样做),在大多数情况下,必须使用modelValue.Value来获取它的值

Vue.js相关问答推荐

Vue 3 需要 main.js 中的文件

Vuetify 3 v-radio-group 将模型设置为 null

如何 for each 用户分组聊天消息?

实现登录命令并访问 vuex 存储

使用数组元素的计算(computed)属性

正确使用 Vue $refs

VueJS + VueRouter:有条件地禁用路由

React.js 是否有类似 Vue.js

Axios-一次发出多个请求(vue.js)

在Vue.js中从父组件执行子方法

Vuex - 何时从 http 服务器加载/初始化存储数据

v-if inside v-for - 在两列中显示项目列表

VS代码中的红点是什么意思

如何通过 Axios 发送文件到 Laravel

如何让 vuetify 数据表在卡片内时跨越容器的整个宽度?

在vue中单击时如何模糊元素

组件已注册但未使用 vue/no-unused-components

在Vue中调用方法时的括号

单击 v-select 项目时如何获取对象而不是单个值?

如何在 vue 组件中使用 vuex?