乐趣区

关于vue.js:在-vue3-中轻松实现-switch-功能组件-简单易懂

编程语言外面,除了应用 if 语句来做条件判断,还有另外一个罕用的就是 switch 了。

而在 vue 中,官网曾经帮忙咱们实现了 v-if 这个指令,然而还没有 switch,那咱们能不能自己实现一个呢?

这篇文章就是来摸索这个问题,并且最终实现一个 Switch 组件

以终为始

先来看看咱们心愿用户是如何应用 Switch 的

用 js 的形式来比照一下:

用户能够通过一个 VSwitch 组件来利用 switch 性能

通过 case 来确定匹配的条件

而后每一个 case 匹配的条件用 template 来示意

这样咱们曾经规定好用户该如何应用了,剩下的其实就是实现了

这一步背地的思维就是确定组件的规格,也能够说是确定组件的应用接口

how

那么咱们应该如何实现呢?

咱们先来思考一下 switch 的性能

拆分 Switch 性能

某个等于 case 值的那个模板显示,别的都不应该显示

举个栗子:

case = “xiaohong” 时

那么就只能显示名字为 “xiaohong” 的插槽

如果没有匹配到任何一个 case,并且还有 defalut 插槽时,显示 defalut 插槽

当然,switch 还有更简单的性能,​咱们这里先从最外围的性能动手,缓缓在复杂化(迭代思维)

实现原理

首先咱们必须先晓得该组件的 slots,都有哪些

在 vue3 中,咱们只须要通过以下形式就能够轻松获取 slots

setup(props,{slots}){
 console.log(slots)
}复制代码

如果打印 slots 的话,你会发现能够失去一个对象,而 key 的值就是 slot 的名称,而 value 是一个函数,调用这个函数就能够获取到对应的 vnode。

那比方我想显示 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 都显示进去呢?

作者:春去春又来

退出移动版