先上一段官方文檔
- 組件實(shí)例剛剛被創(chuàng)建好時(shí),
created生命周期被觸發(fā)。此時(shí),組件數(shù)據(jù)this.data就是在Component構(gòu)造器中定義的數(shù)據(jù)data。 此時(shí)還不能調(diào)用setData。 通常情況下,這個(gè)生命周期只應(yīng)該用于給組件this添加一些自定義屬性字段。 - 在組件完全初始化完畢、進(jìn)入頁(yè)面節(jié)點(diǎn)樹后,
attached生命周期被觸發(fā)。此時(shí),this.data已被初始化為組件的當(dāng)前值。這個(gè)生命周期很有用,絕大多數(shù)初始化工作可以在這個(gè)時(shí)機(jī)進(jìn)行。 - 在組件離開頁(yè)面節(jié)點(diǎn)樹后,
detached生命周期被觸發(fā)。退出一個(gè)頁(yè)面時(shí),如果組件還在頁(yè)面節(jié)點(diǎn)樹中,則detached會(huì)被觸發(fā)。
文檔說(shuō)絕大多數(shù)初始化工作都在 attached 生命周期進(jìn)行,但是小程序組件數(shù)據(jù)分為組件的內(nèi)部數(shù)據(jù) data: {}和從頁(yè)面?zhèn)鬟f過(guò)來(lái)的 properties: {}。但是有個(gè)問題是在組件的 attached 中無(wú)法拿到使用組件的頁(yè)面中setData的值。
// 頁(yè)面的js
data: {
myString: '這是頁(yè)面初始的數(shù)據(jù)'
},
onLoad: function (options) {
this.setData({
mySrting: '這是頁(yè)面setData后的數(shù)據(jù)',
})
}
給組件傳遞myString
// 頁(yè)面的wxml
<c2b-customImg myString="{{myString}}"></c2b-customImg>
組件接受myString
properties: {
myString: {
type: String,
value: '組件里mySrting的默認(rèn)值'
}
},
/**
* 組件的初始數(shù)據(jù)
*/
data: {
},
/**
* 組件的方法列表
*/
methods: {
},
lifetimes: {
created: function(){
console.log(this.properties.myString, 'created')
},
// "組件里mySrting的默認(rèn)值" "created"
attached: function() {
// 在組件實(shí)例進(jìn)入頁(yè)面節(jié)點(diǎn)樹時(shí)執(zhí)行
console.log(this.properties.myString, 'attached')
},
// "這是頁(yè)面初始的數(shù)據(jù)" "attached"
ready: function(){
console.log(this.properties.myString, 'ready')
},
// "這是頁(yè)面setData后的數(shù)據(jù)" "ready"
detached: function() {
// 在組件實(shí)例被從頁(yè)面節(jié)點(diǎn)樹移除時(shí)執(zhí)行
},
},
所以可以看出在組件里 mySrting 在created 取的是組件的默認(rèn)值, attached取的是頁(yè)面里 data 的初始數(shù)據(jù),ready 取的才是頁(yè)面 setData 之后的值。具體原理應(yīng)該要研究下組件的生命周期函數(shù)的源碼了,可能是在組件 attached 之后頁(yè)面才 onLoad。反正直接在組件里使用 mySrting 就不會(huì)有這些問題,但如果想用頁(yè)面 setData 后的 myString 來(lái)對(duì)組件的數(shù)據(jù)初始化,就只能放在組件的 ready 里而不能放在 attached 里、