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 相关文章推荐
番茄的表单验证类代码修改版
Jul 18 Javascript
javascript各浏览器中option元素的表现差异
Apr 07 Javascript
很棒的学习jQuery的12个网站推荐
Apr 28 Javascript
深入理解JavaScript系列(15) 函数(Functions)
Apr 12 Javascript
javascript格式化指定日期对象的方法
Apr 21 Javascript
初识Javascript小结
Jul 16 Javascript
微信小程序 获取二维码实例详解
Jun 23 Javascript
原生JS实现的双色球功能示例
Feb 02 Javascript
vue下history模式刷新后404错误解决方法
Aug 18 Javascript
react+ant design实现Table的增、删、改的示例代码
Dec 27 Javascript
vue项目添加多页面配置的步骤详解
May 22 Javascript
vue中的v-model原理,与组件自定义v-model详解
Aug 04 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
PHP读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
php中的动态调用实例分析
2015/01/07 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
2015/03/27 PHP
linux下php上传文件注意事项
2016/06/11 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
最好用的省市二级联动 原生js实现你值得拥有
2013/09/22 Javascript
利用jquery操作Radio方法小结
2014/10/20 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
HTML的select控件美化
2017/03/27 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
python TCP包注入方式
2020/05/05 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
匡威帆布鞋美国官网:Converse美国
2016/08/22 全球购物
委托书范本
2014/04/02 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
县委务虚会发言材料
2014/10/20 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
小学班级管理心得体会
2016/01/07 职场文书
二手手机买卖合同范本(2019年版)
2019/10/28 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python