怎样做dropselect的多选 | 青训营笔记

205 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天

问题引入

参照项目要求文档给出的要求,并考察了AntD select组件文档,心里想,啊这不就是<select>标签嘛,什么选项分组完全可以用<optiongroup>啊!

表示对这个复杂组件很不以为然,直到我看到了多选!

image.png

要知道原生的<select>标签开启了multiple选项之后只会有这个样式

image.png

是的,它的输入框不见了,只能看到scroll

我觉得应该是select样式的原因吧,那我去调一下select的样式可不可以,下面的答案来自 MDN文档

image.png

答案是:不能直接使用原生样式完全控制select的样式!

那应该怎么办呢?

分析问题

我对antd的文档站开启debug 分别对输入框和下拉菜单进行元素选择

输入框的元素:div image.png

对下拉菜单进行元素选择,稍微有点困难,因为即使将输入框的状态focus等全部强制选择,下拉菜单的显示是由@click事件函数决定的,我猜想它一定会维护一个boolean参数,用于控制下拉菜单的显示,每次点击(无论是页面除下拉菜单外的任何区域,抑或是console中的任意位置)都会改变该boolean参数,以至于无法仅仅在正常预览情况下使用元素选择,看到下拉菜单的元素。

image.png

开启console 可以看到每次对于多选的操作,点击右侧的js,可以看到这一步是由该代码所控制

var r = function(i) {
            console.log("selected ".concat(i))
        }

image.png

我们打个断点,进入debugger状态,再次点击就发现可以使用元素选择看到下拉菜单的元素也是div容器了。

image.png

而select标签的debug却是这样的: image.png 可以看到两者均是div容器,而并非select标签,也就是说——dropselect的多选不是用原生select标签制作的!

解决思路

以上debug的结果也解释了为什么可以实现那么多种的样式,

每一个回显的选项实际上都是一个容器,

在vue3中可以使用v-model双向绑定后通过设定变量比如 const option-selected = ref([''])获得该选择的选项,

这样,选择选项时,即可向该变量数组push一个值,而该数组可以显示在输入框的容器中。