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获取函数名称、函数参数、对象属性名称的代码实例
Apr 12 Javascript
javascript中scrollTop详解
Apr 13 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
Jun 06 Javascript
JS实现按钮颜色切换效果
Sep 05 Javascript
基于vue.js快速搭建图书管理平台
Oct 29 Javascript
微信小程序排坑指南详解
May 23 Javascript
微信小程序之判断页面滚动方向的示例代码
Aug 30 Javascript
vue 中 beforeRouteEnter 死循环的问题
Apr 23 Javascript
微信小程序云开发实现增删改查功能
May 17 Javascript
深入了解响应式React Native Echarts组件
May 29 Javascript
微信小程序左右滚动公告栏效果代码实例
Sep 16 Javascript
jquery选择器和属性对象的操作实例分析
Jan 10 jQuery
微信小程序实现美团菜单
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简单命令代码集锦
2007/09/24 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
node中modules.exports与exports导出的区别
2018/06/08 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
django定期执行任务(实例讲解)
2017/11/03 Python
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
python构建深度神经网络(续)
2018/03/10 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
2020/11/28 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
html5各种页面切换效果和模态对话框用法总结
2014/12/15 HTML / CSS
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
卡拉威高尔夫官方网站:Callaway Golf
2020/09/16 全球购物
大学生四个方面的自我评价
2013/09/19 职场文书
粗加工管理制度
2014/02/04 职场文书
财务工作个人总结
2015/02/27 职场文书
教师工作表现自我评价
2015/03/05 职场文书
被委托人身份证明
2015/08/07 职场文书
商业计划书格式、范文
2019/03/21 职场文书
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL