一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - vue.js - vue3中輕松實現switch功能組件的全過程

vue3中輕松實現switch功能組件的全過程

2021-12-28 17:27春去春又來 vue.js

這篇文章主要給大家介紹了關于vue3中輕松實現switch功能組件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

what

編程語言里面,除了使用 if 語句來做條件判斷,還有另外一個常用的就是 switch 了。

而在 vue 中,官方已經幫助我們實現了 v-if 這個指令,但是還沒有 switch ,那我們能不能自己實現一個呢?

這篇文章就是來探索這個問題,并且最終實現一個 Switch 組件

以終為始

先來看看我們希望用戶是如何使用 Switch 的

vue3中輕松實現switch功能組件的全過程

用 js 的方式來對比一下:

vue3中輕松實現switch功能組件的全過程

用戶可以通過一個 VSwitch 組件來應用 switch 功能

通過 case 來確定匹配的條件

然后每一個 case 匹配的條件用 template 來表示

這樣我們已經規定好用戶該如何使用了,剩下的其實就是實現了

這一步背后的思想就是確定組件的規格,也可以說是確定組件的使用接口

how

那么我們應該如何實現呢?

我們先來思考一下 switch 的功能

拆分 Switch 功能

某個等于 case 值的那個模板顯示,別的都不應該顯示

舉個栗子:

case = "xiaohong" 時

那么就只能顯示名字為 "xiaohong" 的插槽

vue3中輕松實現switch功能組件的全過程

如果沒有匹配到任何一個 case ,并且還有 defalut 插槽時,顯示 defalut 插槽

vue3中輕松實現switch功能組件的全過程

當然,switch 還有更復雜的功能,我們這里先從最核心的功能入手,慢慢在復雜化(迭代思想)

實現原理

首先我們必須先知道該組件的 slots,都有哪些

在 vue3 中,我們只需要通過以下方式就可以輕松獲取 slots

setup(props,{slots}){
 console.log(slots)
}

如果打印 slots 的話,你會發現可以得到一個對象,而 key 的值就是 slot 的名稱,而 value 是一個函數,調用這個函數就可以獲取到對應的 vnode。

vue3中輕松實現switch功能組件的全過程

那比如我想顯示 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>

擴展思考

那其實這里實現的 switch 功能并不完整,如果說用戶匹配滿足多個條件呢?并且沒有 break,那么我們是不是應該把匹配到的 template 都顯示出來呢?

自己嘗試一下實現看看?

到此這篇關于vue3中輕松實現switch功能組件的文章就介紹到這了,更多相關vue3實現switch功能組件內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/6914198729482305550

延伸 · 閱讀

精彩推薦
  • vue.js用vite搭建vue3應用的實現方法

    用vite搭建vue3應用的實現方法

    這篇文章主要介紹了用vite搭建vue3應用的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    Asiter7912022-01-22
  • vue.jsVue中引入svg圖標的兩種方式

    Vue中引入svg圖標的兩種方式

    這篇文章主要給大家介紹了關于Vue中引入svg圖標的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的...

    十里不故夢10222021-12-31
  • vue.jsVue2.x 項目性能優化之代碼優化的實現

    Vue2.x 項目性能優化之代碼優化的實現

    這篇文章主要介紹了Vue2.x 項目性能優化之代碼優化的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    優小U9632022-02-21
  • vue.jsVue多選列表組件深入詳解

    Vue多選列表組件深入詳解

    這篇文章主要介紹了Vue多選列表組件深入詳解,這個是vue的基本組件,有需要的同學可以研究下...

    yukiwu6752022-01-25
  • vue.jsVue項目中實現帶參跳轉功能

    Vue項目中實現帶參跳轉功能

    最近做了一個手機端系統,其中遇到了父頁面需要攜帶參數跳轉至子頁面的問題,現已解決,下面分享一下實現過程,感興趣的朋友一起看看吧...

    YiluRen丶4302022-03-03
  • vue.js詳解vue 表單綁定與組件

    詳解vue 表單綁定與組件

    這篇文章主要介紹了vue 表單綁定與組件的相關資料,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Latteitcjz6432022-02-12
  • vue.js梳理一下vue中的生命周期

    梳理一下vue中的生命周期

    看過很多人講vue的生命周期,但總是被繞的云里霧里,尤其是自學的同學,可能js的基礎也不是太牢固,聽起來更是吃力,那我就已個人之淺見,以大白話...

    CRMEB技術團隊7992021-12-22
  • vue.jsVue2.x-使用防抖以及節流的示例

    Vue2.x-使用防抖以及節流的示例

    這篇文章主要介紹了Vue2.x-使用防抖以及節流的示例,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Kyara6372022-01-25
主站蜘蛛池模板: 99久久伊人精品波多野结衣 | 精品一区二区免费视频蜜桃网 | chinese老太grandma | 日韩影院在线观看 | 欧美成人禁片在线观看俄罗斯 | 免费理伦片手机在线播放 | 国产高清在线看 | 四虎影院久久 | 日韩精品视频福利资源站 | 日韩精品免费一区二区三区 | 男人和女人日 | 包臀裙女教师波多野结衣 | 美女口述又粗又大感觉 | 性欧美黑人巨大喷潮xxoo | 久久国产免费 | 插鸡视频在线观看 | 精品国产福利在线观看一区 | 欧美成人中文字幕 | 免费一级欧美大片在线观看 | 国模娜娜a4u1546全套 | 欧美一区精品二区三区 | 经典千人斩一区二区视频 | bt天堂在线最新版在线 | 亚洲娇小性hd | 男人的视频网站 | 男人把大ji巴放进男人免费视频 | 国产成人精品午夜在线播放 | 久久久无码精品亚洲A片猫咪 | yellow视频在线观看免费 | 日韩一区二区三区四区区区 | 日本视频一区在线观看免费 | 久久国产主播福利在线 | 色婷婷激婷婷深爱五月老司机 | 男人和女人日 | 国产在线观看福利片 | 欧美日韩国产成人综合在线影院 | 久久成人精品免费播放 | 97香蕉超级碰碰碰久久兔费 | 嗯啊好大视频 | 亚洲AV午夜福利精品香蕉麻豆 | 亚洲2017久无码 |