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 相关文章推荐
jquery 图片 上一张 下一张 链接效果(续篇)
Apr 20 Javascript
javascript验证上传文件的类型限制必须为某些格式
Nov 14 Javascript
基于javascript滚动图片具体实现
Nov 18 Javascript
标题过长使用javascript按字节截取字符串
Apr 24 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
Aug 06 Javascript
分享我对JS插件开发的一些感想和心得
Feb 04 Javascript
浅谈Angularjs link和compile的使用区别
Oct 21 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
Nov 16 Javascript
JavaScript定义全局对象的方法示例
Jan 12 Javascript
将Sublime Text 3 添加到右键中的简单方法
Dec 12 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
Jan 08 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
Nov 24 Javascript
微信小程序实现美团菜单
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
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
2016/08/19 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
PyCharm设置护眼背景色的方法
2018/10/29 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
python解释器安装教程的方法步骤
2020/07/02 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
Vision Direct比利时:在线订购隐形眼镜
2019/08/27 全球购物
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
校班主任推荐信范文
2013/12/03 职场文书
学期研究性学习个人的自我评价
2014/01/09 职场文书
淘宝活动策划方案
2014/02/06 职场文书
青年文明号创建承诺
2014/03/31 职场文书
培训讲师岗位职责
2014/04/13 职场文书
2014年电厂工作总结
2014/12/04 职场文书
python爬虫--selenium模块
2021/03/31 Python
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL
redis缓存存储Session原理机制
2021/11/20 Redis
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python