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中使用mockjs代码实例
Nov 25 Vue.js
vuex的数据渲染与修改浅析
Nov 26 Vue.js
如何实现vue的tree组件
Dec 03 Vue.js
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 Vue.js
Vue与React的区别和优势对比
Dec 18 Vue.js
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
原生JS封装vue Tab切换效果
Apr 28 Vue.js
vue使用Google Recaptcha验证的实现示例
Aug 23 Vue.js
关于Vue中的options选项
Mar 22 Vue.js
vue整合百度地图显示指定地点信息
Apr 06 Vue.js
vue特效之翻牌动画
Apr 20 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 传值赋值与引用赋值的区别
2010/12/29 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
php实现压缩合并js的方法【附demo源码下载】
2016/09/22 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
JS定时器实例
2013/04/17 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
2016/11/17 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
微信小程序系列之自定义顶部导航功能
2019/05/21 Javascript
详解element上传组件before-remove钩子问题解决
2020/04/08 Javascript
python抓取网页图片并放到指定文件夹
2014/04/24 Python
python实现折半查找和归并排序算法
2017/04/14 Python
python放大图片和画方格实现算法
2018/03/30 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
python 获取等间隔的数组实例
2019/07/04 Python
使用IDLE的Python shell窗口实例详解
2019/11/19 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
超市重阳节活动方案
2014/02/10 职场文书
网络工程师专家职业发展路线
2014/02/14 职场文书
项目建议书怎么写
2014/05/15 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技