vue组件实现可搜索下拉框扩展


Posted in Javascript onOctober 23, 2020

本文实例为大家分享了vue组件实现可搜索下拉框的具体代码,供大家参考,具体内容如下

一、效果

vue组件实现可搜索下拉框扩展

二、代码

dropdown-ext.vue

<template>
  <div class="vue-dropdown-ext" :class="themestyle" v-show-extend="show">
    <div class="search-module clearfix" v-show="itemlist.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" :style="{maxHeight:maxH+'px'}">
      <li v-for ="(item,index) in datalist" @click="appClick(item,$event)" 
      :key="index" :title="item.name">
        <span v-if="addIcon" :class="iconClass"></span>
        :style="itemTextStyle">{{item.name}}</span>
        <span v-if="statusIconType == 'text' && hasStatus" 
        :class="item.statusClass">{{item.statusText}}</span>
         :class="item.statusClass"></span>
      </li>
    </ul>
    <div class="tip__nodata" v-show="!length&&itemlist.length">
    {{nodatatext}}
    </div>
  </div>
</template>

<script>
  export default {
    data(){
      return {
        datalist:[]
      }
    },
    props:{
      'show':{//用于外部控制组件的显示/隐藏
        type:Boolean,
        default:true
      },
      'itemlist':Array,
      'placeholder':String,
      'nodatatext':String,
      'themestyle':{
        type:String,
        default:'default-theme'
      },
      'item-text-style':{
        type:Object,
        default:function(){
          return {
            width:'80%'
          }
        }
      },
      'add-icon':{
        type:Boolean,
        default:true
      },
      'icon-class':{
        type:String,
        default:''
      },
      'has-status':{
        type:Boolean,
        default:false
      },
      'status-icon-type':{
        type:String,
        default:'text'//text or icon
      },
      'max-h':{
        type:Number,
        default:$(window).height()-400
      }
    },
    watch:{
      itemlist:function(val){
        this.datalist = val.concat();
      }
    },
    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,event){
        this.$emit('item-click',data,event);
      },
      search:function(e){
        let vm = this,searchvalue = e.currentTarget.value;
        vm.datalist = vm.itemlist.filter(
        function(item,index,arr){
          return item.name.indexOf(searchvalue) != -1;
        });
      },
      statusIconClass:function(status){
        let statusClass = '';
        return statusClass;
      }
    },
    computed:{
      length:function(){
        return this.datalist.length;
      }
    }
  }
</script>

<style lang="scss" scoped>
  .text-overflow__style {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  }
  .vue-dropdown-ext {

    .search-module { position: relative;
      .search-text { width: 100%;
        height: 30px;
        padding-right: 2em;
        padding-left:0.5em;
        box-shadow: none;
        border: 1px solid #ccc;
        background: #fff;
        &:focus { border-color: #2198f2;
        }
      }

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

    }

    .list-module {
      overflow: auto;
      li { position: relative;
        margin-top: 0.5em;
        padding: 0.5em;
        border: 1px solid #ccc;
        white-space: nowrap;

        &>span { display: inline-block;
          vertical-align: middle;
        }

      }
    }

    .tip__nodata {
      font-size: 12px;
      margin-top: 1em;
    }

    &.default-theme {
      .list-module li { &:hover { cursor: pointer;
          border-color: #00a0e9;
        }

        &.active {
          border-color: #00a0e9;
          color: #00a0e9;
        }
      }

    }
  }
</style>

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

Javascript 相关文章推荐
js计数器代码
Nov 04 Javascript
Track Image Loading效果代码分析
Aug 13 Javascript
JAVASCRIPT下判断IE与FF的比较简单的方式
Oct 17 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
又一枚精彩的弹幕效果jQuery实现
Jul 25 Javascript
移动端点击态处理的三种实现方式
Jan 12 Javascript
简单实现js无缝滚动效果
Feb 05 Javascript
ES6基础之默认参数值
Feb 21 Javascript
electron实现静默打印的示例代码
Aug 12 Javascript
浅谈vuex的基本用法和mapaction传值问题
Nov 08 Javascript
vue实现图片上传到后台
Jun 29 Javascript
Vue2.x-使用防抖以及节流的示例
Mar 02 Vue.js
微信小程序实现美团菜单
Jun 06 #Javascript
详解express + mock让前后台并行开发
Jun 06 #Javascript
vue element项目引入icon图标的方法
Jun 06 #Javascript
vue脚手架搭建过程图解
Jun 06 #Javascript
vue左右侧联动滚动的实现代码
Jun 06 #Javascript
Express本地测试HTTPS的示例代码
Jun 06 #Javascript
微信小程序仿美团城市选择
Jun 06 #Javascript
You might like
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
2015/11/05 PHP
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
详解vue实现坐标拾取器功能示例
2020/11/18 Vue.js
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
Python字符串中查找子串小技巧
2015/04/10 Python
Python 列表理解及使用方法
2017/10/27 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
python 搜索大文件的实例代码
2019/07/08 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
python推导式的使用方法实例
2021/02/28 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
局域网定义和特性
2016/01/23 面试题
西安当代医院管理研究院笔试题
2015/12/11 面试题
初中生个人学习的自我评价
2013/12/04 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
MySQL系列之二 多实例配置
2021/07/02 MySQL
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers
win7配置本地ftp服务器的图文教程
2022/08/05 Servers