W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Function
返回組件實(shí)例的 data 對(duì)象的函數(shù)。在 data
中,我們不建議觀察具有自身狀態(tài)行為的對(duì)象,如瀏覽器 API 對(duì)象和原型 property。一個(gè)好主意是這里只有一個(gè)表示組件 data 的普通對(duì)象。
一旦觀察過,你就無法在根數(shù)據(jù)對(duì)象上添加響應(yīng)式 property。因此推薦在創(chuàng)建實(shí)例之前,就聲明所有的根級(jí)響應(yīng)式 property。
實(shí)例創(chuàng)建之后,可以通過 vm.$data
訪問原始數(shù)據(jù)對(duì)象。組件實(shí)例也代理了 data 對(duì)象上所有的 property,因此訪問 vm.a
等價(jià)于訪問 vm.$data.a
。
以 _
或 $
開頭的 property 不會(huì)被組件實(shí)例代理,因?yàn)樗鼈兛赡芎?Vue 內(nèi)置的 property、API 方法沖突。你可以使用例如 vm.$data._property
的方式訪問這些 property。
// 直接創(chuàng)建一個(gè)實(shí)例
const data = { a: 1 }
// 這個(gè)對(duì)象將添加到組件實(shí)例中
const vm = Vue.createApp({
data() {
return data
}
}).mount('#app')
console.log(vm.a) // => 1
注意,如果你為 data property 使用了箭頭函數(shù),則 this
不會(huì)指向這個(gè)組件的實(shí)例,不過你仍然可以將其實(shí)例作為函數(shù)的第一個(gè)參數(shù)來訪問。
data: vm => ({ a: vm.myProp })
Array<string> | Object
props 可以是數(shù)組或?qū)ο?,用于接收來自父組件的數(shù)據(jù)。props 可以是簡(jiǎn)單的數(shù)組,或者使用對(duì)象作為替代,對(duì)象允許配置高階選項(xiàng),如類型檢測(cè)、自定義驗(yàn)證和設(shè)置默認(rèn)值。
你可以基于對(duì)象的語法使用以下選項(xiàng):
type
:可以是下列原生構(gòu)造函數(shù)中的一種:String
、Number
、Boolean
、Array
、Object
、Date
、Function
、Symbol
、任何自定義構(gòu)造函數(shù)、或上述內(nèi)容組成的數(shù)組。會(huì)檢查一個(gè) prop 是否是給定的類型,否則拋出警告。Prop 類型的更多信息在此。default
:any
為該 prop 指定一個(gè)默認(rèn)值。如果該 prop 沒有被傳入,則換做用這個(gè)值。對(duì)象或數(shù)組的默認(rèn)值必須從一個(gè)工廠函數(shù)返回required
:Boolean
義該 prop 是否是必填項(xiàng)。在非生產(chǎn)環(huán)境中,如果這個(gè)值為 truthy 且該 prop 沒有被傳入的,則一個(gè)控制臺(tái)警告將會(huì)被拋出。validator
:Function
自定義驗(yàn)證函數(shù)會(huì)將該 prop 的值作為唯一的參數(shù)代入。在非生產(chǎn)環(huán)境下,如果該函數(shù)返回一個(gè) falsy 的值 (也就是驗(yàn)證失敗),一個(gè)控制臺(tái)警告將會(huì)被拋出。你可以在這里查閱更多 prop 驗(yàn)證的相關(guān)信息。 const app = Vue.createApp({})
// 簡(jiǎn)單語法
app.component('props-demo-simple', {
props: ['size', 'myMessage']
})
// 對(duì)象語法,提供驗(yàn)證
app.component('props-demo-advanced', {
props: {
// 類型檢查
height: Number,
// 類型檢查 + 其他驗(yàn)證
age: {
type: Number,
default: 0,
required: true,
validator: value => {
return value >= 0
}
}
}
})
{ [key: string]: Function | { get: Function, set: Function } }
計(jì)算屬性將被混入到組件實(shí)例中。所有 getter 和 setter 的 this
上下文自動(dòng)地綁定為組件實(shí)例。
注意,如果你為一個(gè)計(jì)算屬性使用了箭頭函數(shù),則 this
不會(huì)指向這個(gè)組件的實(shí)例,不過你仍然可以將其實(shí)例作為函數(shù)的第一個(gè)參數(shù)來訪問。
computed: {
aDouble: vm => vm.a * 2
}
計(jì)算屬性的結(jié)果會(huì)被緩存,除非依賴的響應(yīng)式 property 變化才會(huì)重新計(jì)算。注意,如果某個(gè)依賴 (比如非響應(yīng)式 property) 在該實(shí)例范疇之外,則計(jì)算屬性是不會(huì)被更新的。
const app = Vue.createApp({
data() {
return { a: 1 }
},
computed: {
// 僅讀取
aDouble() {
return this.a * 2
},
// 讀取和設(shè)置
aPlus: {
get() {
return this.a + 1
},
set(v) {
this.a = v - 1
}
}
}
})
const vm = app.mount('#app')
console.log(vm.aPlus) // => 2
vm.aPlus = 3
console.log(vm.a) // => 2
console.log(vm.aDouble) // => 4
{ [key: string]: Function }
methods 將被混入到組件實(shí)例中??梢灾苯油ㄟ^ VM 實(shí)例訪問這些方法,或者在指令表達(dá)式中使用。方法中的 this
自動(dòng)綁定為組件實(shí)例。
注意
注意,不應(yīng)該使用箭頭函數(shù)來定義 method 函數(shù) (例如 plus:() => this.a++)。理由是箭頭函數(shù)綁定了父級(jí)作用域的上下文,所以 this
將不會(huì)按照期望指向組件實(shí)例,this.a
將是 undefined。
const app = Vue.createApp({
data() {
return { a: 1 }
},
methods: {
plus() {
this.a++
}
}
})
const vm = app.mount('#app')
vm.plus()
console.log(vm.a) // => 2
{ [key: string]: string | Function | Object | Array}
一個(gè)對(duì)象,鍵是需要觀察的表達(dá)式,值是對(duì)應(yīng)回調(diào)函數(shù)。值也可以是方法名,或者包含選項(xiàng)的對(duì)象。組件實(shí)例將會(huì)在實(shí)例化時(shí)調(diào)用 $watch()
,參閱 $watch,了解更多關(guān)于 deep
、immediate
和 flush
選項(xiàng)的信息。
const app = Vue.createApp({
data() {
return {
a: 1,
b: 2,
c: {
d: 4
},
e: 'test',
f: 5
}
},
watch: {
a(val, oldVal) {
console.log(`new: ${val}, old: ${oldVal}`)
},
// 字符串方法名
b: 'someMethod',
// 該回調(diào)會(huì)在任何被偵聽的對(duì)象的 property 改變時(shí)被調(diào)用,不論其被嵌套多深
c: {
handler(val, oldVal) {
console.log('c changed')
},
deep: true
},
// 該回調(diào)將會(huì)在偵聽開始之后被立即調(diào)用
e: {
handler(val, oldVal) {
console.log('e changed')
},
immediate: true
},
// 你可以傳入回調(diào)數(shù)組,它們會(huì)被逐一調(diào)用
f: [
'handle1',
function handle2(val, oldVal) {
console.log('handle2 triggered')
},
{
handler: function handle3(val, oldVal) {
console.log('handle3 triggered')
}
/* ... */
}
]
},
methods: {
someMethod() {
console.log('b changed')
},
handle1() {
console.log('handle 1 triggered')
}
}
})
const vm = app.mount('#app')
vm.a = 3 // => new: 3, old: 1
注意
注意,不應(yīng)該使用箭頭函數(shù)來定義 watcher 函數(shù) (例如 searchQuery: newValue => this.updateAutocomplete(newValue)
)。理由是箭頭函數(shù)綁定了父級(jí)作用域的上下文,所以 this
將不會(huì)按照期望指向組件實(shí)例,this.updateAutocomplete
將是 undefined。
Array<string> | Object
emits 可以是數(shù)組或?qū)ο螅瑥慕M件觸發(fā)自定義事件,emits 可以是簡(jiǎn)單的數(shù)組,或者對(duì)象作為替代,允許配置和事件驗(yàn)證。
在對(duì)象語法中,每個(gè) property 的值可以為 null
或驗(yàn)證函數(shù)。驗(yàn)證函數(shù)將接收傳遞給 $emit
調(diào)用的其他參數(shù)。如果 this.$emit('foo',1)
被調(diào)用,foo
的相應(yīng)驗(yàn)證函數(shù)將接收參數(shù) 1
。驗(yàn)證函數(shù)應(yīng)返回布爾值,以表示事件參數(shù)是否有效。
const app = Vue.createApp({})
// 數(shù)組語法
app.component('todo-item', {
emits: ['check'],
created() {
this.$emit('check')
}
})
// 對(duì)象語法
app.component('reply-form', {
emits: {
// 沒有驗(yàn)證函數(shù)
click: null,
// 帶有驗(yàn)證函數(shù)
submit: payload => {
if (payload.email && payload.password) {
return true
} else {
console.warn(`Invalid submit event payload!`)
return false
}
}
}
})
注意
emits
選項(xiàng)中列出的事件不會(huì)從組件的根元素繼承,也將從 $attrs
property 中移除。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: