基于vue实现可搜索下拉框定制组件


Posted in Javascript onMarch 26, 2020

实践加深对vue的理解和运用有效途径,本文是基于vue的可搜索下拉框定制组件实现,在此记录.

一、效果

基于vue实现可搜索下拉框定制组件

二、组件代码

dropdown.vue

<template>
 <div class="vue-dropdown default-theme" v-show-extend="show">
 <div class="search-module clearfix" v-show="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">
 <li v-for ="(item,index) in datalist" @click="appClick(item)" 
 :key="index">
 <span class="list-item-text">{{item.name}}</span>
 </li>
 </ul>
 <div class="tip__nodata" v-show="!datalist.length">{{nodatatext}}</div>
 </div>
</template>

<script>
 export default {
 data(){
 return {
 _datalist:this.itemlist.concat(),
 datalist:this.itemlist.concat(),
 length:this.itemlist.length
 }
 },
 props:{
 'show':{//用于外部控制组件的显示/隐藏
 type:Boolean,
 default:true
 },
 'itemlist':Array,
 'placeholder':String,
 'nodatatext':String
 },
 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){
 this.$emit('item-click',data);
 },
 search:function(e){
 let vm = this,searchvalue = e.currentTarget.value;
 vm.datalist = vm.$data._datalist.filter(function(item,index,arr){
  return item.name.indexOf(searchvalue) != -1;
 });
 }
 },
 mounted:function(){

 }
 }
</script>

<style lang="scss" scoped>
 .vue-dropdown.default-theme {
 position: absolute;
 left:15%;
 display: none;
 width: 70%;
 margin: 0 auto;
 margin-top: 1em;
 padding: 1em;
 z-index:10;
 box-shadow: 0px 0px 10px #ccc;
 &._self-show {
 display: block!important;
 }

 .search-module {
 position: relative;
 .search-text {
 width: 100%;
 height: 30px;
 padding-right: 2em;
 padding-left:0.5em;
 border-radius: 0.5em;
 box-shadow: none;
 border: 1px solid #ccc;

 &:focus {
  border-color: #2198f2;
 }
 }

 .search-icon {
 position: absolute;
 top: 24%;
 right: 0.5em;
 color: #aaa;
 }

 }

 .list-module {
 max-height: 200px;
 overflow-y: auto;
 li {
 &._self-hide {
  display: none;
 }
 margin-top: 0.5em;
 padding: 0.5em;
 &:hover {
  cursor:pointer;
  color: #fff;
  background: #00a0e9;

 }
 }
 }
 }
 .tip__nodata {
 font-size: 12px;
 margin-top: 1em;
 }
</style>

三、组件使用

<dropdown :itemlist="itemlist" :placeholder="placeholder" :nodatatext="nodatatext"></dropdown>

更多搜索功能实现的精彩文章,请点击专题:javascript搜索功能汇总 进行学习

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

Javascript 相关文章推荐
用JavaScript 处理 URL 的两个函数代码
Aug 13 Javascript
jQuery实现 注册时选择阅读条款 左右移动
Apr 11 Javascript
对Jquery中的ajax再封装,简化操作示例
Feb 12 Javascript
ie浏览器使用js导出网页到excel并打印
Mar 11 Javascript
jQuery实现新消息在网页标题闪烁提示
Jun 23 Javascript
JavaScript实现文字跟随鼠标特效
Aug 06 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
Sep 26 Javascript
JavaScript函数中关于valueOf和toString的理解
Jun 14 Javascript
jQuery简单注册和禁用全局事件的方法
Jul 25 Javascript
vue axios登录请求拦截器
Apr 02 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
Apr 03 Javascript
node(koa2) web应用模块介绍详解
Mar 29 Javascript
深入浅析Vue中的 computed 和 watch
Jun 06 #Javascript
详解创建自定义的Angular Schematics
Jun 06 #Javascript
vue组件实现进度条效果
Jun 06 #Javascript
Express的HTTP重定向到HTTPS的方法
Jun 06 #Javascript
vue组件实现可搜索下拉框扩展
Oct 23 #Javascript
微信小程序实现美团菜单
Jun 06 #Javascript
详解express + mock让前后台并行开发
Jun 06 #Javascript
You might like
DOTA2 探索永无止境 玩家自创强悍插眼攻略
2020/04/20 DOTA
用PHP+MySql编写聊天室
2006/10/09 PHP
php防止站外远程提交表单的方法
2014/10/20 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
2016/10/11 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
[31:29]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第一场 12.20
2020/12/23 DOTA
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
python嵌套字典比较值与取值的实现示例
2017/11/03 Python
Python3.5 Pandas模块之Series用法实例分析
2019/04/23 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
英国最大的在线床超市:Bed Star
2019/01/24 全球购物
整个世界的设计师家具在哈恩:Designathome
2019/03/25 全球购物
C语言笔试题
2014/09/04 面试题
什么是继承
2013/12/07 面试题
门卫岗位职责
2013/11/15 职场文书
公司合并协议书范本
2014/09/30 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
javascript实现计算器功能详解流程
2021/11/01 Javascript
win7配置本地ftp服务器的图文教程
2022/08/05 Servers