基于vue实现可搜索下拉框定制组件


Posted in Javascript onMarch 26, 2020

实践加深对vue的理解和运用有效途径,本文是基于vue的可搜索下拉框定制组件实现,在此记录.

一、效果

基于vue实现可搜索下拉框定制组件

二、组件代码

dropdown.vue

<template>
 <div class="vue-dropdown default-theme" v-show-extend="show">
 <div class="search-module clearfix" v-show="length">
 <input class="search-text" 
 @keyup='search($event)' :placeholder="placeholder" />
 <span class="glyphicon glyphicon-search search-icon"></span>
 </div>
 <ul class="list-module" v-show="length">
 <li v-for ="(item,index) in datalist" @click="appClick(item)" 
 :key="index">
 <span class="list-item-text">{{item.name}}</span>
 </li>
 </ul>
 <div class="tip__nodata" v-show="!datalist.length">{{nodatatext}}</div>
 </div>
</template>

<script>
 export default {
 data(){
 return {
 _datalist:this.itemlist.concat(),
 datalist:this.itemlist.concat(),
 length:this.itemlist.length
 }
 },
 props:{
 'show':{//用于外部控制组件的显示/隐藏
 type:Boolean,
 default:true
 },
 'itemlist':Array,
 'placeholder':String,
 'nodatatext':String
 },
 directives:{
 'show-extend':function(el,binding,vnode){//bind和 update钩子
 let value = binding.value,searchInput = null;
 if(value){
  el.style.display='block';
 }else{//隐藏后,恢复初始状态
  el.style.display='none';
  searchInput = el.querySelector(".search-text");
  searchInput.value = '';
  vnode.context.datalist = vnode.context.itemlist;//还原渲染数据
 }
 }
 },
 methods:{
 appClick:function(data){
 this.$emit('item-click',data);
 },
 search:function(e){
 let vm = this,searchvalue = e.currentTarget.value;
 vm.datalist = vm.$data._datalist.filter(function(item,index,arr){
  return item.name.indexOf(searchvalue) != -1;
 });
 }
 },
 mounted:function(){

 }
 }
</script>

<style lang="scss" scoped>
 .vue-dropdown.default-theme {
 position: absolute;
 left:15%;
 display: none;
 width: 70%;
 margin: 0 auto;
 margin-top: 1em;
 padding: 1em;
 z-index:10;
 box-shadow: 0px 0px 10px #ccc;
 &._self-show {
 display: block!important;
 }

 .search-module {
 position: relative;
 .search-text {
 width: 100%;
 height: 30px;
 padding-right: 2em;
 padding-left:0.5em;
 border-radius: 0.5em;
 box-shadow: none;
 border: 1px solid #ccc;

 &:focus {
  border-color: #2198f2;
 }
 }

 .search-icon {
 position: absolute;
 top: 24%;
 right: 0.5em;
 color: #aaa;
 }

 }

 .list-module {
 max-height: 200px;
 overflow-y: auto;
 li {
 &._self-hide {
  display: none;
 }
 margin-top: 0.5em;
 padding: 0.5em;
 &:hover {
  cursor:pointer;
  color: #fff;
  background: #00a0e9;

 }
 }
 }
 }
 .tip__nodata {
 font-size: 12px;
 margin-top: 1em;
 }
</style>

三、组件使用

<dropdown :itemlist="itemlist" :placeholder="placeholder" :nodatatext="nodatatext"></dropdown>

更多搜索功能实现的精彩文章,请点击专题:javascript搜索功能汇总 进行学习

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Cookie 注入是怎样产生的
Apr 08 Javascript
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
May 21 Javascript
XMLHTTPRequest的属性和方法简介
Nov 23 Javascript
jQuery 文本框得失焦点的简单实例
Feb 19 Javascript
Node.js实现在目录中查找某个字符串及所在文件
Sep 03 Javascript
jQuery操作属性和样式详解
Apr 13 Javascript
解析jQueryEasyUI的使用
Nov 22 Javascript
jQuery Password Validation密码验证
Dec 30 Javascript
JavaScript Date 知识浅析
Jan 29 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 Javascript
JavaScript的console命令使用实例
Dec 03 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
May 12 Javascript
深入浅析Vue中的 computed 和 watch
Jun 06 #Javascript
详解创建自定义的Angular Schematics
Jun 06 #Javascript
vue组件实现进度条效果
Jun 06 #Javascript
Express的HTTP重定向到HTTPS的方法
Jun 06 #Javascript
vue组件实现可搜索下拉框扩展
Oct 23 #Javascript
微信小程序实现美团菜单
Jun 06 #Javascript
详解express + mock让前后台并行开发
Jun 06 #Javascript
You might like
php MsSql server时遇到的中文编码问题
2009/06/11 PHP
CI框架中zip类应用示例
2014/06/17 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
JS获取页面input控件中所有text控件并追加样式属性
2013/02/25 Javascript
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
Vue 过滤器filters及基本用法
2017/12/26 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
Python入门之三角函数atan2()函数详解
2017/11/08 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
python异步Web框架sanic的实现
2020/04/27 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
DNA基因检测和分析:23andMe
2019/05/01 全球购物
HSRP的含义以及如何工作
2014/09/10 面试题
导游词之镇江焦山
2019/11/21 职场文书
python process模块的使用简介
2021/05/14 Python
Python闭包的定义和使用方法
2022/04/11 Python