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 相关文章推荐
Javascript 判断 object 的特定类转载
Feb 01 Javascript
js将long日期格式转换为标准日期格式实现思路
Apr 07 Javascript
前台js调用后台方法示例
Dec 02 Javascript
jquery禁用右键示例
Apr 28 Javascript
jquery判断浏览器后退时候弹出消息的方法
Aug 11 Javascript
wap图片滚动特效无css3元素纯js脚本编写
Aug 22 Javascript
Vue.js每天必学之表单控件绑定
Sep 05 Javascript
bootstrap table表格使用方法详解
Apr 26 Javascript
详解ESLint在Vue中的使用小结
Oct 15 Javascript
详解mpvue开发微信小程序基础知识
Sep 23 Javascript
微信分享invalid signature签名错误踩过的坑
Apr 11 Javascript
React生命周期原理与用法踩坑笔记
Apr 28 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摘要生成函数(无乱码)
2012/02/04 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
jQuery制作仿Mac Lion OS滚动条效果
2015/02/10 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
JS实现“全选”和&quot;全不选&quot;功能代码实例
2020/02/06 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
Python中对列表排序实例
2015/01/04 Python
python实时分析日志的一个小脚本分享
2017/05/07 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
Python如何telnet到网络设备
2021/02/18 Python
美丽的珠宝配饰:SmallThings
2019/09/04 全球购物
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
幼儿园教师国培感言
2014/02/02 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
坎儿井导游词
2015/02/09 职场文书
检讨书格式
2015/05/07 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
SpringBoot详解执行过程
2022/07/15 Java/Android