vue中子组件的prop(引用类型)是否需要在data中声明?

image.png
Vue官方api已经说明了prop是单向数据传递的,那么问题是:
如果当前父组件传了一个引用类型,子组件通过prop接受后,是否需要在data中再次声明?
提出需求的场景是,需要在子组件中更改prop(不通过emit,是否本身就违背了单向数据流...)
image.png

image.png

如果此时在data中声明的变量是引用类型,那么去编辑或者修改维护这个data时,毫无疑问prop本身的值也会改变,除非在data中深拷贝prop的值(开销太大),这样更改data后,还可以通过prop的原始值将其复原(有回退操作的需求,或者撤销操作的需求)

综上,想问一下 子组件中是否有必要在data中再声明,引用一下prop?
如果有,大概会是一个怎样的场景?

阅读 3.4k
1 个回答
提出需求的场景是,需要在子组件中更改prop(不通过emit,是否本身就违背了单向数据流...)

场景就有问题,永远不要修改prop。prop是别人的数据,对于子组件来说,就是只读的。如果需要变更,只能通知父组件来修改它。

你可以通过计算属性来简化一下流程。
比如一个自定义输入框组件

模板

<input v-model="localValue">

脚本

props: {
    value: string
},

computed: {
    localValue: {
        get() {
            return this.value
        },
        set(value) {
            this.$emit('input', value)
        }
    }
}

引用类型的prop同理,你可以用...操作符拷贝一份emit出去。

例如

props: {
    value: object
},

methods: {
    someChange() {
        this.localValue = {hello: 'world'}
    }
},

computed: {
    localValue: {
        get() {
            return this.value
        },
        set(value) {
            this.$emit('input', {...value})
        }
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题