vue下拉菜单组件(含搜索)的实现代码


Posted in Javascript onNovember 25, 2018

之前也写过这个小组件,最近遇到select下加搜索的功能,所以稍微完善一下。

效果图:

vue下拉菜单组件(含搜索)的实现代码

子组件 dropdown.vue

<template>
 <div class="vue-dropdown default-theme">
  <div class="cur-name" @click="isShow =! isShow">{{itemlist.cur.name}}</div>
  <div class="list-and-search" :class="isShow?'on':''">
  <div class="search-module clearfix" v-show="isNeedSearch">
    <input class="search-text" 
    @keyup='search($event)' :placeholder="placeholder" />
   </div>
   <ul class="list-module">
    <li v-for ="(item,index) in datalist" @click="selectToggle(item)" 
    :key="index">
     <span class="list-item-text">{{item.name}}</span>
    </li>
   </ul>
   <div class="tip-nodata" v-show="isNeedSearch && datalist.length == 0">{{nodatatext}}</div>
  </div>
 </div>
</template>

<script>
 export default {
  data(){
   return {
    datalist:[],
    isShow:false
   }
  },
  props:{
   'itemlist':Object,//父组件传来的数据
   'placeholder':{
    type:String,
    default: '搜索' //input placeholder的默认值
   },
   'isNeedSearch':{ //是否需要搜索框
    type:Boolean,
    default: false
   },
   'nodatatext':{ //是否需要显示搜索
    type:String,
    default: '未找到结果' //没有搜索到时的文本提示
   } 
  },
  created(){
   this.datalist = this.itemlist.data;
   //点击组件以外的地方,收起
   document.addEventListener('click', (e) => {
    if (!this.$el.contains(e.target)){
     this.isShow = false; 
    }
   }, false)
  },
  methods:{
   selectToggle(data){
    this.itemlist.cur.name = data.name;
    this.isShow = false;
    this.$emit('item-click',data);
   },
   search(e){
    let searchvalue = e.currentTarget.value;
    this.datalist = this.itemlist.data.filter((item,index,arr)=>{
     return item.name.indexOf(searchvalue) != -1;
    });
   }
  }
 }
</script>

<style lang="less" scoped>
 .list-and-search{
 background: #fff;
 border: 1px solid #ccc;
 display: none;
  &.on{
   display: block;
  }
 }
 .cur-name{
 height: 32px;
 line-height: 32px;
 text-indent: 10px;
 position: relative;
 color: #777;
 &:after{
 position: absolute;
  right: 9px;
  top: 13px;
  content: " ";
  width: 0;
  height: 0;
  border-right: 6px solid transparent;
  border-top: 6px solid #7b7b7b;
  border-left: 6px solid transparent;
  border-bottom: 6px solid transparent;
 }
 &.show{
 &:after{
 right: 9px;
  top: 6px;
  border-right: 6px solid transparent;
  border-bottom: 6px solid #7b7b7b;
  border-left: 6px solid transparent;
  border-top: 6px solid transparent;
 }
 }
 }
 .vue-dropdown.default-theme {
  width: 200px;
  z-index:10;
  border-radius:3px; 
  border: 1px solid #ccc;
  cursor: pointer;
  -webkit-user-select:none; 
 user-select:none;
  &._self-show {
   display: block!important;
  }
  .search-module {
   position: relative;
   border-bottom: 1px solid #ccc;
   .search-text {
    width: 100%;
    height: 30px;
    text-indent: 10px;
    // border-radius: 0.5em;
    box-shadow: none;
    outline: none;
    border: none;
    // &:focus {
    //  border-color: #2198f2;
    // }
   }
   .search-icon {
    position: absolute;
    top: 24%;
    right: 0.5em;
    color: #aaa;
   }
  }
  input::-webkit-input-placeholder{
   font-size: 14px;
  }
  .list-module {
   max-height: 200px;
   overflow-y: auto;
   li {
    &._self-hide {
     display: none;
    }
    margin-top: 0.4em;
    padding: 0.4em;
    &:hover {
     cursor:pointer;
     color: #fff;
     background: #00a0e9;
    }
   }
  }
 }
 .tip-nodata {
  font-size: 14px;
  padding: 10px 0;
  text-indent: 10px;
 }
</style>

父组件调用

<dropdown :item-click="dropDownClick" :isNeedSearch="true" :itemlist="itemlist"></dropdown>
import Dropdown from '@/components/dropdown.vue'
export default {
 data() {
 return {
  itemlist: {
  cur: {
   val: "",
   name: "所有产品"
  },
  data: [{
   val: "",
   name: "所有产品"
  }, {
   val: 1,
   name: "梦幻西游"
  }, {
   val: 2,
   name: "梦幻无双"
  }, {
   val: 3,
   name: "大话西游"
  }]
  },
 }
 },
 components: {
 Dropdown,
 },
 methods :{
 dropDownClick(e) {
  console.log(e.name, e.val)
 }
 }
}

默认是不带搜索框,如果需要可以传这个 :isNeedSearch="true" 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 仿关机效果的图片层
Dec 26 Javascript
javaScript 判断字符串是否为数字的简单方法
Jul 25 Javascript
Ajax+Json 级联菜单实现代码
Oct 27 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
Feb 26 Javascript
JS小数转换为整数的方法分析
Jan 07 Javascript
VUE页面中加载外部HTML的示例代码
Sep 20 Javascript
微信小程序template模板实例详解
Oct 27 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
Mar 15 Javascript
详解angular部署到iis出现404解决方案
Aug 14 Javascript
Vue中遍历数组的新方法实例详解
Jul 21 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
Sep 05 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
Nov 25 #Javascript
详解Vue CLI 3.0脚手架如何mock数据
Nov 23 #Javascript
详解js静态检查工具eslint配置文件
Nov 23 #Javascript
详解小程序不同页面之间通讯的解决方案
Nov 23 #Javascript
创建echart多个联动的示例代码
Nov 23 #Javascript
详解Angular模板引用变量及其作用域
Nov 23 #Javascript
vue使用better-scroll实现下拉刷新、上拉加载
Nov 23 #Javascript
You might like
目录,文件操作详谈―PHP
2006/11/25 PHP
PHP经典的给图片加水印程序
2006/12/06 PHP
PHP 观察者模式的实现代码
2013/05/10 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Pytorch 实现权重初始化
2019/12/31 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
yy婚礼司仪主持词
2014/03/14 职场文书
经济担保书范文
2014/04/02 职场文书
单位租房协议书样本
2014/10/30 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
南京南京观后感
2015/06/02 职场文书
一个都不能少观后感
2015/06/04 职场文书
上学路上观后感
2015/06/16 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python