Vue实现多标签选择器


Posted in Javascript onNovember 28, 2019

本文实例为大家分享了Vue实现多标签选择器展示的具体代码,供大家参考,具体内容如下

实现效果

Vue实现多标签选择器

实现代码

<html lang="en">

<head>
 <title>Document</title>

 <!-- 引入本地组件库 -->
 <link rel="stylesheet" href="static/element-ui/index.css" >
 <script src="static/element-ui/vue.js"></script>
 <script src="static/element-ui/index.js"></script>

 <!-- 引入CDN样式 -->
 <!-- <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" > -->
 <!-- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> -->
 <!-- <script src="https://unpkg.com/element-ui/lib/index.js"></script> -->

 <style>
  .not-active {
   display: inline-block;
   font-size: 12px;
   margin: 5px 8px;
  }
  
  span {
   margin: 0 2px;
  }
 </style>
</head>

<body>

 <div id="app">
  <!-- 待选标签 -->
  <div v-for='(category, categoryIndex) in categories' :key="category.id">
   <!-- 分类 -->
   <span class="not-active">{{category.name}}:</span>

   <template>
    <span v-if="category.count"class="not-active" @click="clearCategory(category, categoryIndex)"> 不限</span>
    <my-tag v-else>不限</my-tag>
   </template>

   <!-- 标签 -->
   <template v-for='(child, childIndex) in category.children'>
    <my-tag v-if="child.active" :closable='true' @click-child='clickChild(category, categoryIndex, child, childIndex)'>
     {{ child.name }}
    </my-tag>
    <span v-else class="not-active" @click='clickChild(category, categoryIndex, child, childIndex)'>{{ child.name }}</span>
   </template>
  </div>

  <!-- 已选标签 -->
  <div v-if='conditions.length'>
   <span class="not-active" @click="clearCondition">清空已选:<span>
    
   <el-tag
   v-for='(condition, index) in conditions' 
   :key="condition.id"
   type="primary"
   :closable="true"
   size="small"
   :disable-transitions="true"
   @close='removeCondition(condition, index)'
   @click='removeCondition(condition, index)'>
    {{condition.name}}
   </el-tag>
  </div>
 </div>

 <script src="./data.js"></script>

 <script>
  // 简单封装一个公用组件
  Vue.component('my-tag', {
   template: "<el-tag v-bind='$attrs' v-on='$listeners' effect='dark' size='small' :disable-transitions='true' @click='clickChild' @close='clickChild'><slot></slot></el-tag>",

   methods: {
    clickChild() {
     this.$emit("click-child")
    }
   }
  });

  var app = new Vue({
   el: '#app',
   data() {
    return {
     categories, // 分类标签,可从外部加载配置
     conditions: [] // 已选条件
    }
   },

   watch: {
    // 监听条件变化,按照请求接口拼装请求参数
    conditions(val){
     let selectedCondition = {};

     for(let categorie of this.categories){
      let selected_list = [];
      for(let child of categorie.children){
       if(child.active){
        selected_list.push(child.name);
       }
      }
      selectedCondition[categorie.name] = selected_list.join("|")
     }
     console.log(selectedCondition);
    }
   },

   methods: {
    // 处理标签点击事件,未选中则选中,已选中则取消选中
    clickChild(category, categoryIndex, child, childIndex) {
     let uid = `${categoryIndex}-${childIndex}`
     child.uid = uid;
     console.log(uid)
     
     // 取消选择
     if (child.active === true) {
      category.count--;
      child.active = false;
      this.conditions.forEach((conditionChild, index) => {
       if (conditionChild.uid === child.uid) {
        this.conditions.splice(index, 1);
       }
      });
     // 选择
     } else {
      category.count++;
      child.active = true;
      this.conditions.push(child);
     }
    },
   
    // 清除已选整个类别标签
    clearCategory(category, categoryIndex) {
     category.count = 0;
     
     // 可选列表均为未选中状态
     category.children.forEach(child => {
      child.active = false;
     })

     // 清空该类已选元素
     for (let index = this.conditions.length - 1; index >= 0; index--) {
      const conditionChild = this.conditions[index];
      if (conditionChild.uid.startsWith(categoryIndex)) {
       this.conditions.splice(index, 1);
      }
     }
    },
    
    // 移除一个条件
    removeCondition(condition, index) {
     let categoryIndex = condition.uid.split("-")[0];
     this.categories[categoryIndex].count --;

     this.conditions.splice(index, 1)
     condition.active = false;
    },

    // 清空所有条件
    clearCondition() {
     for(let i = this.conditions.length-1; i >=0 ; i--){
      this.removeCondition(this.conditions[i], i);
     }
    }
   }
  });
 </script>

</body>

</html>

标签筛选的数据格式

data.js

var categories = [{
 name: '品牌',
 count: 0,
 children: [{
  name: '联想',
 }, {
  name: '小米',

 }, {
  name: '苹果',

 }, {
  name: '东芝',

 }]
}, {
 name: 'CPU',
 count: 0,
 children: [{
  name: 'intel i7 8700K',

 }, {
  name: 'intel i7 7700K',

 }, {
  name: 'intel i9 9270K',

 }, {
  name: 'intel i7 8700',

 }, {
  name: 'AMD 1600X',


 }]
}, {
 name: '内存',
 count: 0,
 children: [{
  name: '七彩虹8G',

 }, {
  name: '七彩虹16G',

 }, {
  name: '金士顿8G',

 }, {
  name: '金士顿16G',

 }]
}, {
 name: '显卡',
 count: 0,
 children: [{
  name: 'NVIDIA 1060 8G',

 }, {
  name: 'NVIDIA 1080Ti 16G',

 }, {
  name: 'NVIDIA 1080 8G',

 }, {
  name: 'NVIDIA 1060Ti 16G',

 }]
}]

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

Javascript 相关文章推荐
jquery 图片Silhouette Fadeins渐显效果
Feb 07 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
Jun 05 Javascript
在jquery中处理带有命名空间的XML数据
Jun 13 Javascript
解析javascript 浏览器关闭事件
Jul 08 Javascript
JavaScript SetInterval与setTimeout使用方法详解
Nov 15 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
Aug 14 Javascript
jquery设置表单元素为不可用的简单代码
Jul 04 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 Javascript
详解React中的组件通信问题
Jul 31 Javascript
Web开发使用Angular实现用户密码强度判别的方法
Sep 27 Javascript
JS+CSS3实现的简易钟表效果示例
Apr 13 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
Aug 15 Javascript
swiper实现异形轮播效果
Nov 28 #Javascript
Vue请求java服务端并返回数据代码实例
Nov 28 #Javascript
javascript实现异形滚动轮播
Nov 28 #Javascript
javascript实现切割轮播效果
Nov 28 #Javascript
javascript实现商品图片放大镜
Nov 28 #Javascript
javascript实现视频弹幕效果(两个版本)
Nov 28 #Javascript
javascript实现弹幕墙效果
Nov 28 #Javascript
You might like
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
JavaScript 获得选中文本内容的方法
2009/02/15 Javascript
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
jquery的键盘事件修改代码
2011/02/24 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
Python计算一个文件里字数的方法
2015/06/15 Python
python实现远程通过网络邮件控制计算机重启或关机
2018/02/22 Python
python调用staf自动化框架的方法
2018/12/26 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
2019/02/21 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
新西兰Bookabach:查找全球度假屋
2020/12/03 全球购物
服务行业个人求职的自我评价
2013/12/12 职场文书
护士自我介绍信
2014/01/13 职场文书
会计电算化应届生自荐信
2014/02/25 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
行政专员求职信范文
2014/05/03 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
2015年采购工作总结
2015/04/10 职场文书