本功能第一次遇到是在百度2017年暑期实习生招聘时遇到的,当时的要求是:实现一个类似百度搜索时,输入给出候选词的功能。这个很容易,一般配合ul li 实现,但是有些特殊场景我当时并没有考虑到,如:
由于候选词都是模糊查询的,故当用户输入为空时,这时候模糊查询返回的结果可能并非为null,此时仍会显示候选词输入结果。即:无论何时,该下拉菜单都会显示。
这与自定义下拉菜单的实现类似,在大多数功能中,这种实现都ok,可以控制用户选择完之后,收缩下拉菜单(候选词),但是当用户在输入过程中,突然不想输入,而想看第一条数据时(大多数靠前的数据都会被遮挡),这时你会发现该菜单无法收缩。
这里常见的做法是:
在该html中设置一层mask,而将下拉菜单及相关的操作层置顶,只要检测到鼠标的操作在mask上,而不是下拉菜单层时,判定用户想关闭下拉菜单,此时再隐藏mask和下拉菜单。
故,以下部分给出vuejs中的实现代码:
<div class="navbar"> <span>标签</span> <div class="mask" @click="dropUp" v-if="candicateArr.length>0"></div> <div class="search-bar"> <Input class="category" v-model="formItem.category" name="category" placeholder="请输入类别..." @keyup.enter="onEnter" @input="onInput" ></Input> <ul> <li v-for="word in candicateArr" @click="chooseTag(word)">{{word.tagName}}</li> </ul> </div> </div> .mask{ position: fixed; top: 0; left: 0; width: 100%; height: 100%; } .navbar .search-bar{ padding-left: 45px; margin-top: -40px; width: 100%; position: absolute; z-index: 1; } methods:{ dropUp(event){ if(event.target.className=='mask'){ this.candicateArr = []; } } }