摘要:具名插槽適用于具有一定結構且有多處不固定內容的組件此時在定義組件時其實就是預留了多個空缺位置且分別命名如果只有一個當然也可以采用具名插槽,但肯定不如默認插槽,只會徒增配置成本。然后在使用時將內容分成多塊分別命名成預留空缺位置的名字。
本文主要描述不才在學習Vue和Bootstrap中遇到的關于插槽的問題及解決方案插槽理解
vue官網和很多熱心朋友又很多關于默認插槽,具名插槽,插槽作用域相關的解釋,我就不重復搬過來占用篇幅了,這里簡單的談談我個人的淺見。
插槽就是預留位置
插槽其實就是定義組件時預留的一些位置,將使用組件時組件內額外的一些標簽寫入到對應的預留位置就是插槽的作用了。
插槽適用于不固定內容的組件
正是因為無法預見組件內部所有可能的標簽或內容,所以干脆留一個空缺,全權交給使用者,想填啥就用啥。
具名插槽適用于具有一定結構且有多處不固定內容的組件
此時在定義組件時其實就是預留了多個空缺位置且分別命名(如果只有一個當然也可以采用具名插槽,但肯定不如默認插槽,只會徒增配置成本)。然后在使用時將內容分成多塊分別命名成預留空缺位置的名字。
為什么要定義組件?
答:定義組件是一種封裝的形式,使用最簡單的標簽及屬性配置表達一大段比較豐富的結構效果及一些數據和事件。
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven"t heard of them accusamus labore sustainable VHS.
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven"t heard of them accusamus labore sustainable VHS.
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven"t heard of them accusamus labore sustainable VHS.
該示例代碼比較長
結構是很有規律的,很容易發現幾個共同的結構:card, card-header, card-body...
文案是具體的展示信息,也是我們希望組件能夠配置的
最精簡的組件配置 Anim pariatur ...Anim pariatur ...Anim pariatur ...
header一般文本就夠用了,所以直接配置在標簽屬性上
content, 如"Anim pariatur ..."我們預想其可能是其他的一個或多個組件甚至大段html(會有標簽),此時放到屬性內就不合適了,配置起來超級麻煩
組件封裝獲取header簡單。遍歷$children從其attrs對象中可以讀取到,放到data中的一個數組里,采用v-for指令即可很容易渲染出來
獲取content不容易。$children都是虛擬DOM,反向變成html的API沒找到;再者就算找到了,同header一樣遍歷渲染出來,也只是當成字符串渲染出來,加上v-html指令,標準的HTML標簽倒是確實渲染出來了,可已定義的組件標簽未能正確解析渲染(不知道vue有沒有相應的API方法解決)。
插槽
具名插槽
問題解決!
組件定義Vue.component("widget-collapse", { template: `組件使用`, data() { let children = this.$slots, items = []; for (let i in children) { let node = children[i][0]; if (node.tag) { items[i] = ({ header: VTool.attr(node, "header") || ("Item " + items.length), }) } } return { vitems: items } } })
組件優化 Anim pariatur ...Anim pariatur ...Anim pariatur ...
使用時每個節點都寫一個slot太累贅,容易寫錯,刪除某個節點或調整節點順序后更改麻煩,能否程序動態幫忙添加該slot屬性?
答:未找到對應API,但對比默認與具名插槽的$slots數據對象發現key分別為default和具名name
Vue.component("widget-collapse", { template: `刪除使用時的插槽命名`, data() { let children = this.$slots.default, items = []; for (let i = 0, len = children.length; i < len; i++) { let node = children[i]; if (node.tag) { let id = VTool.random(); this.$slots[id] = node; items.push({ id: id, header: VTool.attr(node, "header") || ("Item " + items.length), }) } } return { vitems: items } } })
同步更新 Anim pariatur ...Anim pariatur ...Anim pariatur ...
以上設置基本初始化是沒有任何問題了,但在vue對象更新時會更改$slots對象
(經跟蹤代碼查找到updateChildComponent方法內在更新下層組件時執行了vm.$slots = resolveSlots(renderChildren, parentVnode.context);覆蓋了之前縮處理過的$slots,且會在vm._render方法中重新渲染,且在此之前沒有公布任何事件,那就暴力覆蓋重寫了)
Vue.component("widget-collapse", { ... created() { let _render = this._render; this._render = function() { let $slots = this.$slots; for (let name in $slots) { if (name !== "default") { return _render.apply(this, arguments); } } // 此時肯定是重新new的$slots, 重寫對應關系 let children = this.$slots.default, items = []; for (let i = 0, len = children.length; i < len; i++) { let node = children[i]; if (node.tag) { let id = VTool.random(); this.$slots[id] = node; items.push({ id: id, header: VTool.attr(node, "header") || ("Item " + items.length), }) } } this.vitems = items; return _render.apply(this, arguments); } }, ... })
本文對于vue插槽的處理辦法略顯暴力,但的確解決了我遇到的問題,各位大拿有更好的經驗還請不吝賜教,拜謝!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/116740.html
摘要:具名插槽適用于具有一定結構且有多處不固定內容的組件此時在定義組件時其實就是預留了多個空缺位置且分別命名如果只有一個當然也可以采用具名插槽,但肯定不如默認插槽,只會徒增配置成本。然后在使用時將內容分成多塊分別命名成預留空缺位置的名字。 本文主要描述不才在學習Vue和Bootstrap中遇到的關于插槽的問題及解決方案 插槽理解 vue官網和很多熱心朋友又很多關于默認插槽,具名插槽,插槽作用...
摘要:項目介紹旨在通過項目的形式同時學習和,實現一個在線配置頁面的功能。通過封裝好的組件樣式提供界面需要的組件,通過實現組件狀態更改及頁面渲染。 本文是不才在學習Vue和Bootstrap過程中遇到問題解決的一些思路,主要描述了項目搭建,組件封裝、獲取、編輯、更新的一步步實現,一些解決方案也沒找到正確的官方API,還請大拿們多多提點。 項目介紹 旨在通過項目的形式同時學習Vue和Bootst...
摘要:項目介紹旨在通過項目的形式同時學習和,實現一個在線配置頁面的功能。通過封裝好的組件樣式提供界面需要的組件,通過實現組件狀態更改及頁面渲染。 本文是不才在學習Vue和Bootstrap過程中遇到問題解決的一些思路,主要描述了項目搭建,組件封裝、獲取、編輯、更新的一步步實現,一些解決方案也沒找到正確的官方API,還請大拿們多多提點。 項目介紹 旨在通過項目的形式同時學習Vue和Bootst...
摘要:特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入匯總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應和斧正,會及時更新,平時業務工作時也會不定期更...
摘要:中文官網英文官網組織發出一個問題之后,不要暫時的離開電腦,如果沒有把握先不要提問。珍惜每一次提問,感恩每一次反饋,每個人工作還是業余之外抽出的時間有限,充分準備好應有的資源之后再發問,有利于問題能夠高效質量地得到解決。 Vue.js資源分享 更多資源請Star:https://github.com/maidishike... 文章轉自:https://github.com/maid...
閱讀 2899·2021-09-22 15:54
閱讀 1897·2019-08-30 15:53
閱讀 2247·2019-08-29 16:33
閱讀 1424·2019-08-29 12:29
閱讀 1395·2019-08-26 11:41
閱讀 2375·2019-08-26 11:34
閱讀 2961·2019-08-23 16:12
閱讀 1427·2019-08-23 15:56