博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dropdown 组件实现思路
阅读量:7039 次
发布时间:2019-06-28

本文共 2956 字,大约阅读时间需要 9 分钟。

概述:Dropdown 下拉菜单与 Select 的区别在于它是包含了一部分操作,所以它的 Option 下拉项要对其进行支持。

publish:2019-03-31

自从我写了关于中后台系统组件的以来,已经三个月了。由于业务场景的较为简单,所以它没有其他组件库的功能那么强大,但是整体结构较为类似,代码结构清晰,容易扩展。

将 Dropdown 分为两个模块,父组件 Dropdown,子组件 Dropdown-option。其中Dropdown 负责控制整体的显示,Drop-option 负责下拉菜单的每一个选项。

Dropdown - 组件结构

├── Dropdown

├── Dropdown-option

Dropdown

父组件主要负责的是选中项的显示以及下拉菜单状态(开、合)的控制。

具体的代码如下

首先对处理下拉菜单开关状态的控制,依据 trigger 也就是触发方式的不同,可以分为两类 hover || click

  • trigger = 'hover' 时,对最外层的 div 添加 is-hover 的类名,它主要是负责添加 :hover 伪类来显示下拉菜单
&.is-hover {        &:hover {            .dropdown__menu {                display: block;            }        }        .dropdown__menu {            display: none;        }    }复制代码

​ 同时依据 trigger 初始化 isOpen 状态为 true

  • trigger = 'click' 时,利用 isOpen 的状态来控制下拉菜单的开、合。主要是依据事件来触发,利用 @click.stop="isOpen = !isOpen",来完成下来菜单的展开操作。之后,对最外层的 div 添加 tabindex="0" 属性使得它能够触发失焦事件 blur,同时添加 @blur="trigger !== 'hover' && (isOpen = false)",意味着当它失效的时候,自动关闭下拉菜单。

以上完成了 Dropdown 对下拉菜单控制的功能,利用 provide ,完成它与 Dropdown-option 的通讯,传递 selectValueselectItemoptionKey

Dropdown-option

Dropdown-option 是下拉菜单的每个选项,其基本结构

复制代码

主要是利用默认插槽,和 label 属性来构建每一项,并且包含着两种状态,是否 disabled 或 selected。disabled 状态是依据 props: disabled 来改变的,而 selected 则是由 computed 来完成的

复制代码

首先利用 inject 将父组件 Dropdown 注入,这样可以通过 this.Dropdown 来访问它的状态、属性。

然后在 isSelected() 中获取 selectValue,与当前 Dropdown-option 的 key 值进行比对,查看是否为选中项。

为了要引入 optionKey,是因为在实际的业务中,有的场景会以 label 作为去区分项,有的则是以 value,故引入,方便自定义。

每个 Dropdown-option 具备选中功能,但是从 @mousedown="handleClick" 可以看出,利用 mousedown 来代替 click 事件

由于我们利用 Dropdown 的 blur 事件来控制下拉列表的展开与关闭,此时如果利用 click 事件,则会在 blur 之后触发,所以无法选中。故采用 mousedown 来完成该功能。

methods: {    handleSelect(key) {        let {            Dropdown: { multiple, trigger },            value,            label        } = this;        this.Dropdown.$emit("change", key);        this.Dropdown.$emit("select", key);        if (trigger !== "hover") {            this.Dropdown.isOpen = false;        }    },        handleClick() {            let {                Dropdown: { optionKey },                disabled            } = this;            const key = this[optionKey] || this.$attrs[optionKey];            if (!disabled) {                this.$slots.default[0].elm.click && this.$slots.default[0].elm.click();                key && this.handleSelect(key);            }        }}复制代码

这一份部分的逻辑就比较简单了,只有一处需要解释下

this.$slots.default[0].elm.click && this.$slots.default[0].elm.click();复制代码

由于我们利用 mousedown 来代替原来的 click 事件,但我们利用 slot 插槽来完成下拉菜单的开发时,就无法触发 slot 的点击时间,所以利用上述代码来手动触发。

由于 Dropdown 组件中,使用了 v-model 来完成数据的双向绑定

model: {    prop: "selectValue",    event: "select"}复制代码

所以在 Dropdown-option 中则需要利用 this.Dropdown.$emit("select", key); 来完成双向绑定。

总结

代码地址:

实例:

转载于:https://juejin.im/post/5ca1833a5188256a9e1bf8a7

你可能感兴趣的文章
思考设计SQL优化方案
查看>>
tomcat 调优-生产环境必备
查看>>
浅析C++的引用与const指针与各种传递方式
查看>>
Java并发编程75道面试题及答案
查看>>
仓储+调度,YOGO智能配送站能否改变外卖配送格局?
查看>>
jQuery-easyui和validate表单验证实例
查看>>
【对讲机的那点事】5G时代的到来,2G和3G将会被关停?
查看>>
DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--week3 超参数调试、Batch正则化和程序框架...
查看>>
NSMutableArray 简单细说
查看>>
Docker 助力百年研发院校的现代化改造,让 IT 资源物尽其用!
查看>>
各个 C# 版本的主要特性、发布日期和发布方式(C# 1.0 - 7.3)
查看>>
什么是nofollow标签?如何影响网站排名?
查看>>
开源技术“打进”好莱坞,学术软件基金会成立
查看>>
Android项目实战(十四):TextView显示html样式的文字
查看>>
你真的了解Python的字符串吗?
查看>>
创建ORC结果表
查看>>
从普通程序员到身价过百亿:追求长期价值的耐心,决定了你能走多远
查看>>
比原链Bytom错误码一览
查看>>
Windows CMD中的findstr命令详解
查看>>
破天荒!苹果终于对 MacBook Air 大更新,还有全新 iPad Pro 和 Mac mini
查看>>