vue3中轻松实现switch功能组件的全过程


Posted in Vue.js onJanuary 07, 2021

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功能组件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue动态合并单元格并添加小计合计功能示例
Nov 26 Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
vue绑定class的三种方法
Dec 24 Vue.js
Vue中强制组件重新渲染的正确方法
Jan 03 Vue.js
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
vue引入Excel表格插件的方法
Apr 28 Vue.js
Vue Element UI自定义描述列表组件
May 18 Vue.js
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
教你部署vue项目到docker
Apr 05 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 #Vue.js
详解Vue2的diff算法
Jan 06 #Vue.js
vuex的使用步骤
Jan 06 #Vue.js
vue3.0中友好使用antdv示例详解
Jan 05 #Vue.js
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
Jan 05 #Vue.js
Vue+scss白天和夜间模式切换功能的实现方法
Jan 05 #Vue.js
jenkins自动构建发布vue项目的方法步骤
Jan 04 #Vue.js
You might like
请离开include_once和require_once
2013/07/18 PHP
PHP中SimpleXML函数用法分析
2014/11/26 PHP
基于PHP实现简单的随机抽奖小程序
2016/01/05 PHP
PHP连接MYSQL数据库实例代码
2016/01/20 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
Web层改进II-用xmlhttp 无声息提交复杂表单
2007/01/22 Javascript
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
使用JavaScript和C#中获得referer
2014/11/14 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
django rest framework 实现用户登录认证详解
2019/07/29 Python
通过cmd进入python的步骤
2020/06/16 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
2021/01/27 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
巴西香水和化妆品购物网站:The Beauty Box
2019/09/03 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
运动会广播稿200字
2014/01/15 职场文书
幸福家庭事迹材料
2014/02/03 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
预备党员转正材料
2014/12/19 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang