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 api参考 visualjquery 中国线路 速度快
Nov 30 Javascript
基于jquery的bankInput银行卡账号格式化
Aug 22 Javascript
escape函数解决js中ajax传递中文出现乱码问题
Oct 30 Javascript
js检测判断日期大于多少天的方法
May 04 Javascript
javascript正则表达式之分组概念与用法实例
Jun 16 Javascript
JavaScript随机生成颜色的方法
Oct 15 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
Apr 12 Javascript
webpack本地开发环境无法用IP访问的解决方法
Mar 20 Javascript
基于angular6.0实现的一个组件懒加载功能示例
Apr 12 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
Jul 12 Javascript
vue中导出Excel表格的实现代码
Oct 18 Javascript
Vue 组件复用多次自定义参数操作
Jul 27 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中如何定义和使用常量
2013/02/28 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
JAVASCRIPT HashTable
2007/01/22 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
快速入门Vue
2016/12/19 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
基于vue.js路由参数的实例讲解——简单易懂
2017/09/07 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
Python日志模块logging简介
2015/04/13 Python
Python使用微信SDK实现的微信支付功能示例
2017/06/30 Python
python 对象和json互相转换方法
2018/03/22 Python
Numpy数组的保存与读取方法
2018/04/04 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
对python实时得到鼠标位置的示例讲解
2018/10/14 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
银行优秀员工事迹材料
2014/05/29 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
2014年业务工作总结
2014/11/17 职场文书
内乡县衙导游词
2015/02/05 职场文书
个人求职信格式范文
2015/03/20 职场文书
企业计划生育责任书
2015/05/09 职场文书
vue实现在data里引入相对路径
2022/06/05 Vue.js
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript