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 24 Vue.js
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 Vue.js
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 Vue.js
vue中使用echarts的示例
Jan 03 Vue.js
详解实现vue的数据响应式原理
Jan 20 Vue.js
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
Vue3中的Refs和Ref详情
Nov 11 Vue.js
Vue h函数的使用详解
Feb 18 Vue.js
关于Vue中的options选项
Mar 22 Vue.js
vue 实现弹窗关闭后刷新效果
Apr 08 Vue.js
vue route新窗口跳转页面并且携带与接收参数
Apr 10 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 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
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
php的4种常见运行方式
2015/03/20 PHP
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
查询json的数据结构的8种方式简介
2014/03/10 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
详解vue组件通信的三种方式
2017/06/30 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
vue项目实现图片上传功能
2019/12/23 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
Python入门教程之if语句的用法
2015/05/14 Python
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
python实现动态创建类的方法分析
2019/06/25 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
舞蹈毕业生的自我评价
2014/03/05 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
中学生自我评价范文
2015/03/03 职场文书
银行求职自荐信范文
2015/03/04 职场文书
部门2015年度工作总结
2015/04/29 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
Python中json.dumps()函数的使用解析
2021/05/17 Python
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python