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 相关文章推荐
firefo xml 读写实现js代码
Jun 11 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
Jun 03 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
Mar 18 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
Jul 31 Javascript
jQuery中wrapAll()方法用法实例
Jan 16 Javascript
Redis基本知识、安装、部署、配置笔记
Mar 05 Javascript
jQuery实现表格行上移下移和置顶的方法
May 22 Javascript
JavaScript定时器和优化的取消定时器方法
Jul 03 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
Apr 24 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
Aug 15 Javascript
JavaScript中关于base64的一些事
May 06 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
Oct 29 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
全文搜索和替换
2006/10/09 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
PHP使用函数用法详解
2018/09/30 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
jquery实用代码片段集合
2010/08/12 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
python生成随机密码或随机字符串的方法
2015/07/03 Python
Python字符串处理实现单词反转
2017/06/14 Python
python 调用c语言函数的方法
2017/09/29 Python
import的本质解析
2017/10/30 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
2014年销售部工作总结
2014/12/01 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
Python中json.dumps()函数的使用解析
2021/05/17 Python
springboot临时文件存储目录配置方式
2021/07/01 Java/Android
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle