您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關利用vue3怎么實現一個switch功能組件,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
用 js 的方式來對比一下:
用戶可以通過一個 VSwitch 組件來應用 switch 功能
通過 case 來確定匹配的條件
然后每一個 case 匹配的條件用 template 來表示
這樣我們已經規定好用戶該如何使用了,剩下的其實就是實現了
這一步背后的思想就是確定組件的規格,也可以說是確定組件的使用接口
那么我們應該如何實現呢?
我們先來思考一下 switch 的功能
拆分 Switch 功能
某個等于 case 值的那個模板顯示,別的都不應該顯示
舉個栗子:
case = "xiaohong" 時
那么就只能顯示名字為 "xiaohong" 的插槽
如果沒有匹配到任何一個 case ,并且還有 defalut 插槽時,顯示 defalut 插槽
當然,switch 還有更復雜的功能,我們這里先從最核心的功能入手,慢慢在復雜化(迭代思想)
實現原理
首先我們必須先知道該組件的 slots,都有哪些
在 vue3 中,我們只需要通過以下方式就可以輕松獲取 slots
setup(props,{slots}){ console.log(slots) }
如果打印 slots 的話,你會發現可以得到一個對象,而 key 的值就是 slot 的名稱,而 value 是一個函數,調用這個函數就可以獲取到對應的 vnode。
那比如我想顯示 xiaohei 這個插槽要怎么做呢?
只需要這樣
setup(props, { slots }) { return () => { return slots.xiaohei() }; },
setup 除了可以返回一個對象,作為導出給 template 用的數據,還可以直接返回一個函數作為 render。
而 render 函數只要返回對應的 vnode ,那么最終就會被渲染到 view 上。
所以按照上面代碼的寫法的話最終會顯示 xiaohei slot 內部的內容
那當明白上述知識點后,我們在回來看看第一個功能
是不是只要我們把和 case 匹配的 slots 渲染出來即可
看代碼:
export default { props: ["case"], setup(props, { slots }) { console.log(slots); return () => { if (slots[props.case]) { return slots[props.case](); } }; }, };
注意哦,一定要加條件判斷,因為很有可能是沒有對應的 slot 的
看,懂了原理之后是不是很輕松的實現第一個功能了。
我們在來看第二個功能的時候是不是也很簡單了
只需要在加一段代碼即可:
export default { props: ["case"], setup(props, { slots }) { console.log(slots); return () => { if (slots[props.case]) { return slots[props.case](); } if (slots["default"]) { return slots["default"](); } }; }, };
如果在第一個條件那沒有匹配到的話,肯定會到達第二個條件判斷,也就是 if (slots["default"])
接著就是如果有 default slot 的話,那么就返回即可
至此,你已經實現了一個簡單的 Switch 功能組件了
讓我們來總結總結你已經學到了哪些知識點
設計組件時,先設計該組件的規則(接口)
tasking 的思想,把大功能拆小,然后逐一擊破
在 vue3 中獲取 slots 的方式
setup 不止可以返回對象,還可以返回一個函數,效果同 render 函數一樣
render 函數返回的 vnode 最終會被渲染到 view 上
如果你學到的話,那么請用你的小手點個贊唄~~~
// VSwitch.vue <script> export default { props: ["case"], setup(props, { slots }) { return () => { if (slots[props.case]) { return slots[props.case](); } if (slots["default"]) { return slots["default"](); } }; }, }; </script>
關于利用vue3怎么實現一個switch功能組件就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。