你可以基于对象的语法使用以下选项:

  • type:可以是下列原生构造函数中的一种:String、Number、Boolean、Array、Object、Date、Function、Symbol、任何自定义构造函数、或上述内容组成的数组。会检查一个 prop 是否是给定的类型,否则抛出警告。
  • default:any 为该 prop 指定一个默认值。如果该 prop 没有被传入,则使用这个值。对象或数组的默认值必须从一个工厂函数返回
  • required:Boolean 定义该 prop 是否是必填项。在非生产环境中,如果这个值为 truthy 且该 prop 没有被传入的,则一个控制台警告将会被抛出。
  • validator:Function 自定义验证函数会将该 prop 的值作为唯一的参数代入。在非生产环境下,如果该函数返回一个 falsy 的值 (也就是验证失败),一个控制台警告将会被抛出。你可以在这里查阅更多 prop 验证的相关信息。
  1. // businessData: {
  2. // type: Object as PropType<BusinessData>,
  3. // default: function () {
  4. // return {
  5. // labelSelected: null, //选择的 Label
  6. // labelOptions: [], // Label 可选项
  7. // keyOptions: [], // Key 可选项
  8. // attrLists: [
  9. // {
  10. // keySelected: null,
  11. // valueSelected: { selected: [] },
  12. // valuePageNum: 1,
  13. // valueOptions: []
  14. // }
  15. // ] // 属性列表
  16. // }
  17. // },
  18. // required: true
  19. // }

单向数据流

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。

vue不推荐直接在子组件中修改父组件传来的props的值,会报错
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop’s value. Prop being mutated: “result” (found in component )

子组件可通过以下方式间接修改父组件传递的props

  1. 父组件通过 prop 传递来一个初始值;这个子组件将其另存为一个本地的 data property 数据来使用

    1. props: ['initialCounter'],
    2. data() {
    3. return {
    4. editInitialCounter: this.initialCounter
    5. }
    6. }
  2. prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性:

    1. props: ['size'],
    2. computed: {
    3. normalizedSize() {
    4. return this.size.trim().toLowerCase()
    5. }
    6. }

子组件视图动态响应Props

如果不使用watch来监听父组件传递的prop,子组件中另存的data property不会随着父组件传递的prop进行改变,因为另存为data property时,仅仅只是定义一个初始值。

  1. props: ['initialCounter'],
  2. data() {
  3. return {
  4. editInitialCounter: this.initialCounter
  5. }
  6. }
  7. watch: {
  8. initialCounter(newVal,oldVal){
  9. this.editInitialCounter = newVal
  10. }
  11. }