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日期和时间选择控件升级版(自写)
Aug 02 Javascript
JavaScript中的类数组对象介绍
Dec 30 Javascript
详解JavaScript ES6中的Generator
Jul 28 Javascript
js 判断各种数据类型的简单方法(推荐)
Aug 29 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
Apr 14 Javascript
js模块加载方式浅析
Aug 12 Javascript
ES6解构赋值实例详解
Oct 31 Javascript
element el-input directive数字进行控制
Oct 11 Javascript
说说如何利用 Node.js 代理解决跨域问题
Apr 22 Javascript
sortable+element 实现表格行拖拽的方法示例
Jun 07 Javascript
详解vue 命名视图
Aug 14 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 05 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高级对象构建 多个构造函数的使用
2012/02/05 PHP
PHP中call_user_func_array()函数的用法演示
2012/02/05 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
微信小程序实现图片压缩功能
2018/01/26 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
用python实现的去除win下文本文件头部BOM的代码
2013/02/10 Python
python中 logging的使用详解
2017/10/25 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
opencv3/C++ 平面对象识别&amp;透视变换方式
2019/12/11 Python
python爬虫如何解决图片验证码
2021/02/14 Python
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
罗技美国官网:Logitech美国
2020/01/22 全球购物
数据库连接池的工作原理
2012/09/26 面试题
策划主管的工作职责
2013/11/24 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
公司寄语大全
2014/04/10 职场文书
小学社会实践活动总结
2014/07/03 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
python保存图片的四个常用方法
2022/02/28 Python