关于Vue中prop默认值得一个疑问

原文说Object与数组类型default需要用一个函数返回,但是Type可以为Function,Function不也是Object吗?Function类型得default直接default:()=>{}就行了,为啥不需要default:()=>()=>{}
有人说是为了不影响父组件,可是你用不用默认值修改引用类型得prop都会改变父组件得啊,文档中得Object不知道到底包不包括Function,关于子组件修改Prop这一段,原文说Object与Array会影响父组件,然而我想Function也是引用类型同样也会影响父组件,而关于prop默认值却只是Object与Array需要用工厂函数返回,不然报错,Function类型却可以直接default:()=>{}

阅读 1.6k
2 个回答

这么做是为了,解决一些错误操作下的的不正确更新的问题,可以尝试以下代码

<div id="app">
  <Counter></Counter>
  <div></div>
  <Counter></Counter>
</div>

var Counter = {
  template: `<span @click="++a.b">incr {{a.b}}</span>`,
  props: {
    a: {
      type: Object,
      default: {
        b: 1,
      },
    },
  },
}

new Vue({
  el: '#app',
  components: {
    Counter,
  },
})

如果不用函数返回,且没有给该组件传prop,且还在子组件中修改prop那么所用该组件的实例都会收到该prop的更新

这个主要是因为ObjectFunction的使用场景来看的。

Object主要是用传递数据的,是有状态的:

const datum = {
 a: "a",
 b: "b"
}

我们使用主要是datum.a = "aa",这是时候子组件和父组件都持有datum的引用,都可以进行修改这个数据,这个单向性就无法保证。
同理,Array也是如此。

但是对于Function而言,主要是来传递操作的,是无状态的:

const op = (msg) => {console.log(msg);}

父组件和子组件都可以执行这个函数,是没有问题的,对单向性不会产生影响。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题