每天对自己多问几个为什么,总是有着想象不到的收获。 一个菜鸟小白的成长之路(copyer)
官网地址:Props
props的形式
数组形式:
<my-cpn title="james" :age="12"/>
props: ['title', 'age']
对象形式:
<my-cpn title="james" :age="12"/>
props: {
title: String,
age: Number
}
props: {
title: {
type: String,
default: 'kobe',
required: true
}
}
props的单项数据流
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。
另外,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。
如果真想对props传递下来的数据进行操作?
就使用组件内部的变量来保存props传递下来的值,然后进行系列操作
props: ['initialCounter'],
data() {
return {
counter: this.initialCounter
}
}
props: ['size'],
computed: {
normalizedSize: function () {
return this.size.trim().toLowerCase()
}
}
props验证
注意:
props: {
propA: Number,
propB: [String, Number],
propC: {
type: String,
required: true
},
propD: {
type: Number,
default: 100
},
propE: {
type: Object,
default: function() {
return { message: 'hello' }
}
},
propF: {
validator: function(value) {
return ['success', 'warning', 'danger'].indexOf(value) !== -1
}
},
propG: {
type: Function,
default: function() {
return 'Default function'
}
}
}
类型检测:
- String
- Number
- Boolean
- Array
- Object
- Date
- Function
- Symbol
此外,type 还可以是一个自定义的构造函数,并且通过 instanceof 来进行检查确认。
function Person(firstName, lastName) {
this.firstName = firstName
this.lastName = lastName
}
app.component('blog-post', {
props: {
author: Person
}
})
TS + PropType进行类型检测
针对于数组,和对象,我们就只能对类型限定,而不能确定其内部属性的内容的类型,这是不符合TS 标准的,所以vue3提供一个泛型接口,用来处理数组和对象
import { PropType } from 'vue'
假如多人的基本信息:
interface UserInfo {
name: string
age: number
hobbies?: string[]
}
以前的做法:
<my-cpn :userListInfo="userListInfo" />
props: {
userListInfo: {
type: Array
}
}
vue3正确的做法:
<my-cpn :userListInfo="userListInfo" />
props: {
userListInfo: {
type: Array as PropType<UserInfo[]>
}
}
|