摘要:使用目標(biāo)到目前為止,僅從組件自身的角度來看,它已經(jīng)可以滿足大多數(shù)的業(yè)務(wù)場景了。但我們會發(fā)現(xiàn)一個問題,就是當(dāng)前組件的狀態(tài)對于調(diào)用者來說,完全是黑盒狀態(tài),即調(diào)用者無法初始化,也無法更改組件的開關(guān)狀態(tài),這在一些場景無法滿足需求。
07 使用 State Initializers 目標(biāo)
到目前為止,僅從 toggle 組件自身的角度來看,它已經(jīng)可以滿足大多數(shù)的業(yè)務(wù)場景了。但我們會發(fā)現(xiàn)一個問題,就是當(dāng)前 toggle 組件的狀態(tài)對于調(diào)用者來說,完全是黑盒狀態(tài),即調(diào)用者無法初始化,也無法更改組件的開關(guān)狀態(tài),這在一些場景無法滿足需求。
對于無法初始化開關(guān)狀態(tài)的問題,倒是很好解決,我們可以在 toggle 組件聲明一個 prop 屬性 on 來代表組件的默認(rèn)開關(guān)狀態(tài),同時在 mounted 生命周期函數(shù)中將這個默認(rèn)值同步到組件 data 相應(yīng)的屬性中去。
對于無法更改開關(guān)狀態(tài)的問題,似乎無法簡單通過聲明一個 prop 屬性的方式來解決,并且如果我們期望的更改邏輯是異步的話,同樣無法滿足。
因此這篇文章著重來解決這兩個問題:
toggle 組件能夠支持開關(guān)狀態(tài)的初始化功能
toggle 組件能夠提供一個 reset 方法以供重置開關(guān)狀態(tài)
重置開關(guān)狀態(tài)可以以異步的方式進(jìn)行
實現(xiàn) 初始化開關(guān)狀態(tài)為了使 toggle 組件能夠支持默認(rèn)狀態(tài)的傳入,我們采用聲明 prop 屬性的方式,如下:
on: { type: Boolean, default: false }
之后在其 mounted 生命周期對開關(guān)狀態(tài)進(jìn)行同步,如下:
mounted() { this.status.on = this.on; }
這樣當(dāng)我們期望 toggle 以開的狀態(tài)進(jìn)行渲染時,可以這樣調(diào)用組件:
重置開關(guān)狀態(tài)...
為了能夠從外部更改 toggle 組件的開關(guān)狀態(tài),我們可以在組件內(nèi)部聲明一個觀測 on prop 屬性的監(jiān)聽器,比如:
watch: { on(val){ // do something... } }
但如果這么做,會存在一個問題,即目標(biāo)中關(guān)于開關(guān)狀態(tài)的更改邏輯的編寫者是組件調(diào)用者,而 watch 函數(shù)的編寫者是組件實現(xiàn)者,由于實現(xiàn)者無法預(yù)知調(diào)用者更改狀態(tài)的邏輯,所以使用 watch 是無法滿足條件的。
讓我們換一個角度來思考問題,既然實現(xiàn)者無法預(yù)知調(diào)用者的邏輯,何不把重置開關(guān)狀態(tài)的邏輯全部交由調(diào)用者來實現(xiàn)?別忘了 Vue 組件也是可以傳入 Function 類型的 prop 屬性的,如下:
onReset: { type: Function, default: () => this.on },
這樣就將提供重置狀態(tài)的邏輯暴露給了組件調(diào)用者,當(dāng)然,如果調(diào)用者沒有提供相關(guān)重置邏輯,組件內(nèi)部會自動降級為使用 on 屬性來作為重置的狀態(tài)值。
組件內(nèi)部額外聲明一個 reset 方法,在其內(nèi)部重置當(dāng)前的開關(guān)狀態(tài),如下:
reset(){ this.status.on = this.onReset(this.status.on) this.$emit("reset", this.status.on) }
這里會首先以當(dāng)前開關(guān)狀態(tài)為參數(shù),調(diào)用 onReset 方法,再將返回值賦值給當(dāng)前狀態(tài),并觸發(fā)一個 reset 事件以供父組件訂閱。
之后在 app 組件中,可以按如下方式傳入 onReset 函數(shù),并編寫具體的重置邏輯:
// template... // script ... resetToTrue(on) { return true; }, ...
運(yùn)行效果如下:
支持異步重置在實現(xiàn)同步重置的基礎(chǔ)上,實現(xiàn)異步重置十分簡單,通常情況下,處理異步較好的方式是使用 Promise,使用 callback 也可以,使用 Observable 也是不錯的選擇,這里我們選擇 Promise。
由于要同時處理同步和異步兩種情況,只需把同步情況視為異步情況即可,比如以下兩種情況在效果上是等價的:
// sync this.status.on = this.onReset(this.status.on) // async Promise.resolve(this.onReset(this.status.on)) .then(on => { this.status.on = on })
而 onReset 函數(shù)如果返回的是一個 Promise 實例的話,Promise.resolve 也會正確解析到當(dāng)它為 fullfill 狀態(tài)的值,這樣關(guān)于 reset 方法我們改版如下:
reset(){ Promise.resolve(this.onReset(this.status.on)) .then(on => { this.status.on = on this.$emit("reset", this.status.on) }) }
在 app 組件中,可以傳入一個異步的重置邏輯,這里就不貼代碼了,直接上一個運(yùn)行截圖,組件會在點擊重置按鈕后 1 秒后,重置為開狀態(tài):
成果你可以下面的鏈接來看看這個組件的實現(xiàn)代碼以及演示:
sandbox: 在線演示
github: part-7
總結(jié)Function 類型的 prop 屬性在一些情況下非常有用,比如文章中提及的狀態(tài)初始化,這其實是工廠模式的一種體現(xiàn),在其他的框架中也有體現(xiàn),比如 React 中,HOC 中提及的 render props 就是一種比較具體的應(yīng)用,Angular 在聲明具有循環(huán)依賴的 Module 時,可以通過 () => Module 的方式進(jìn)行聲明等等。
目錄github gist
關(guān)注公眾號 全棧101,只談技術(shù),不談人生
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/98744.html
摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
摘要:寫在前頭去年,曾經(jīng)閱讀過一系列關(guān)于高級組件模式的文章,今年上半年,又抽空陸陸續(xù)續(xù)地翻譯了一系列關(guān)于高級組件模式的文章,碰巧最近接手了一個公司項目,前端這塊的技術(shù)棧是。同時這個組件還擁有一個屬性,用來初始化的狀態(tài)值。 寫在前頭 去年,曾經(jīng)閱讀過一系列關(guān)于高級 react 組件模式的文章,今年上半年,又抽空陸陸續(xù)續(xù)地翻譯了一系列關(guān)于高級 angular 組件模式的文章,碰巧最近接手了一個公...
閱讀 3875·2023-04-25 22:43
閱讀 3923·2021-09-06 15:15
閱讀 1416·2019-08-30 15:54
閱讀 3765·2019-08-30 14:20
閱讀 2976·2019-08-29 17:16
閱讀 3292·2019-08-29 15:28
閱讀 3468·2019-08-29 11:08
閱讀 1173·2019-08-28 18:05