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设计一个日历表
Dec 03 Vue.js
Vue+penlayers实现多边形绘制及展示
Dec 24 Vue.js
vue动态设置路由权限的主要思路
Jan 13 Vue.js
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
vue路由实现登录拦截
Mar 24 Vue.js
vue3中的组件间通信
Mar 31 Vue.js
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
Vue3中toRef与toRefs的区别
Mar 24 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
Vue2项目中对百度地图的封装使用详解
Jun 16 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
PHP 选项及相关信息函数库
2006/12/04 PHP
php IP及IP段进行访问限制的代码
2008/12/17 PHP
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
WordPress JQuery处理沙发头像
2009/06/22 Javascript
Script的加载方法小结
2011/01/12 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
2014/05/23 Javascript
javascript面向对象之定义成员方法实例分析
2015/01/13 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
2019/11/04 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
python对html过滤处理的方法
2018/10/21 Python
Python简单I/O操作示例
2019/03/18 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
2020/11/17 Python
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
幼儿园长自我鉴定
2013/10/17 职场文书
工作过失检讨书
2014/02/23 职场文书
门卫岗位职责说明书
2014/08/18 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
中学生思想品德评语
2014/12/31 职场文书
沈阳故宫导游词
2015/01/31 职场文书
毕业生党员个人总结
2015/02/14 职场文书
2015政治思想表现评语
2015/03/25 职场文书
换届选举主持词
2015/07/03 职场文书
如何利用Python实现一个论文降重工具
2021/07/09 Python
一篇文章弄懂Python中的内建函数
2021/08/07 Python