你可以基于对象的语法使用以下选项:
- type:可以是下列原生构造函数中的一种:String、Number、Boolean、Array、Object、Date、Function、Symbol、任何自定义构造函数、或上述内容组成的数组。会检查一个 prop 是否是给定的类型,否则抛出警告。
- default:any 为该 prop 指定一个默认值。如果该 prop 没有被传入,则使用这个值。对象或数组的默认值必须从一个工厂函数返回
- required:Boolean 定义该 prop 是否是必填项。在非生产环境中,如果这个值为 truthy 且该 prop 没有被传入的,则一个控制台警告将会被抛出。
- validator:Function 自定义验证函数会将该 prop 的值作为唯一的参数代入。在非生产环境下,如果该函数返回一个 falsy 的值 (也就是验证失败),一个控制台警告将会被抛出。你可以在这里查阅更多 prop 验证的相关信息。
// businessData: {// type: Object as PropType<BusinessData>,// default: function () {// return {// labelSelected: null, //选择的 Label// labelOptions: [], // Label 可选项// keyOptions: [], // Key 可选项// attrLists: [// {// keySelected: null,// valueSelected: { selected: [] },// valuePageNum: 1,// valueOptions: []// }// ] // 属性列表// }// },// required: true// }
单向数据流
所有的 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
父组件通过 prop 传递来一个初始值;这个子组件将其另存为一个本地的 data property 数据来使用。
props: ['initialCounter'],data() {return {editInitialCounter: this.initialCounter}}
prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性:
props: ['size'],computed: {normalizedSize() {return this.size.trim().toLowerCase()}}
子组件视图动态响应Props
如果不使用watch来监听父组件传递的prop,子组件中另存的data property不会随着父组件传递的prop进行改变,因为另存为data property时,仅仅只是定义一个初始值。
props: ['initialCounter'],data() {return {editInitialCounter: this.initialCounter}}watch: {initialCounter(newVal,oldVal){this.editInitialCounter = newVal}}
