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 相关文章推荐
JavaScript动态改变HTML页面元素例如添加或删除
Aug 10 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
Jan 13 Javascript
js实现简单秒表走动的时钟特效
Mar 25 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
Nov 09 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
Jun 13 Javascript
Angular.Js的自动化测试详解
Dec 09 Javascript
bootstrap输入框组使用方法
Feb 07 Javascript
js学习心得_一个简单的动画库封装tween.js
Jul 14 Javascript
Vue.js划分组件的方法
Oct 29 Javascript
微信小程序实现折叠面板
Jan 31 Javascript
Vue项目查看当前使用的elementUI版本的方法
Sep 27 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
May 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 JSON 数据解析代码
2010/05/26 PHP
PHP自定义函数收代码
2010/08/01 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
jQuery 表格工具集
2010/04/25 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
JavaScript中的细节分析
2012/06/30 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
React简单介绍
2017/05/24 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
layui的select联动实现代码
2019/09/28 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
幼儿教师自我鉴定
2013/11/02 职场文书
中国梦的演讲稿
2014/01/08 职场文书
九年级体育教学反思
2014/01/23 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
演讲开场白台词大全
2015/05/29 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
如何制定一份可行的计划!
2019/06/21 职场文书