摘要:用函數(shù)化組件展示一個根據(jù)數(shù)據(jù)智能選擇不同組件的場景函數(shù)化組件根據(jù)數(shù)據(jù)選擇組件函數(shù)化組件根據(jù)數(shù)據(jù)選擇組件函數(shù)化組件主要適用于以下兩個場景程序化地在多個組件中選擇一個。
函數(shù)化組件
Vue提供了一個functional的布爾值選項(xiàng),設(shè)置為true可以使組件無狀態(tài)和無實(shí)例,也就是沒有data和this上下文。這樣用render函數(shù)返回虛擬節(jié)點(diǎn)可以更容易渲染,因?yàn)楹瘮?shù)化組件只是一個函數(shù),渲染開銷要小很多。
使用函數(shù)化組件時,Render函數(shù)提供了第二個參數(shù)context來提供臨時上下文。組件需要的data、prop、slots、children、parent都是通過這個上下文來傳遞。比如this.level要改寫為context.props.level,this.$slots.default改變?yōu)?b>context.children。
用函數(shù)化組件展示一個根據(jù)數(shù)據(jù)智能選擇不同組件的場景:
See the Pen Vue-函數(shù)化組件-根據(jù)數(shù)據(jù)選擇組件 by whjin (@whjin) on CodePen.
JSX寫法:
See the Pen Vue-JSX by whjin (@whjin) on CodePen.
發(fā)布一條留言,需要的數(shù)據(jù)有昵稱和留言內(nèi)容,發(fā)布操作應(yīng)該在根實(shí)例app內(nèi)完成。留言列表的數(shù)據(jù)也是從app獲取。
數(shù)組list存儲了所有的留言內(nèi)容,通過函數(shù)handleSend給list添加一項(xiàng)留言數(shù)據(jù),添加成后把texrarea文本框置空。
Render函數(shù)內(nèi)的節(jié)點(diǎn)使用v-model:動態(tài)綁定value,并且監(jiān)聽input事件,把輸入的內(nèi)容通過$emit("input")派發(fā)給父組件。
列表數(shù)據(jù)list為空時,渲染一個“列表為空”的信息提示節(jié)點(diǎn);不為空時,每個list-item贏包含昵稱、留言內(nèi)容和回復(fù)按鈕3個子節(jié)點(diǎn)。
this.list.forEach相當(dāng)于template里的v-for指令,遍歷出每條留言。句柄handleReply直接向父組件派發(fā)一個事件reply,父組件(app)接收后,將當(dāng)前list-item的昵稱提取,并設(shè)置到v-textarea內(nèi)。
See the Pen Vue-留言列表 by whjin (@whjin) on CodePen.