开发者问题收集

Vue2 将对象作为 prop 发送到组件,可以是空的,也可以是具有属性的

2021-07-16
599

假设我们有两个路由: edit/1edit/new

根容器(在挂载时)检查是否存在 this.$route.params.id ,如果存在,则从 API 获取数据并填充 obj 。否则,相关的 obj 仍为空。

此对象被发送到具有以下内容的子组件:

<template>
  <input v-model="obj.name">
  <input v-model=obj.email">
</template>

<script>
export default {
  props: {
    obj {
      type: Object,
      default: () => {}
    }
  },
}
</script>

我现在遇到的问题是,当我发送一个空对象时,什么都不会渲染。这个问题与空对象有什么关系吗?据我所知,可以在 Vue 中像这样动态添加属性。

如果您需要更多信息,请询问!

2个回答

仅供参考

default: () => {}

返回一个空对象作为默认值。 箭头函数将返回 void。 如果您尝试将空对象设置为默认值,请使用

default: () => ({})

无论如何,由于 prop 突变不仅不被鼓励,而且在 Vue2 中被视为反模式(请参阅 Vue 2 - Mutating props vue-warn ),您应该添加一个数据字段,该字段要么已经声明了默认值,要么从相应的 prop 字段获取其默认值

props: {
  obj: {
    type: Object,
    default: () => ({ name: '', email: '' })
  }
}
data() {
  return {
    name: this.obj.name,
    email: this.obj.email,
  }
}
Braks
2021-07-16

问题是您需要在对象中声明 prop 成员,或者使用 Vue.set 从父级添加新的反应属性。

default: () => ({name:null, email:null})
// or
default: () => { return {name:null, email:null} }

或在父级中

Vue.set(defaultObjWithoutMembers, 'name', 'foo')

Vue2 无法检测或跟踪不属于原始对象声明的属性。

请参阅 https://v2.vuejs.org/v2/guide/reactivity.html

Steven Spungin
2021-07-16