vue 实现el-select组件 配合 el-tabs 完成动态tabs然后有勾选 全选,还有模拟提交,回显数据

news2024/11/20 9:35:12

在这里插入图片描述
cv即可使用

<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- <link rel="stylesheet" href="../vue/element_ui.css" /> -->
    <!-- <script src="../vue/vue.js"></script> -->
    <!-- 引入样式 -->
    <link
      rel="stylesheet"
      href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"
    />
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <!-- 开发环境版本,包含了有帮助的命令行警告 -->

    <!-- <script src="../vue/element_ui.js"></script> -->

    <style>
      .increase_list_ipt {
        width: 100%;
      }
      .increase_list_ipt .el-input__suffix {
        top: 1px;
        right: 2px;
      }
      .increase_list_ipt .el-tag {
        height: 32px;
        background: #f7f8fa;
        border: 1px solid #e5e6eb;
        color: #1d2129;
        font-size: 16px;
        border-radius: 14px;
      }
      .increase_list_ipt .el-tag__close.el-icon-close {
        color: #1d2129;
        font-size: 20px;
        background-color: transparent;
      }
      .increase_list_ipt .el-tag__close.el-icon-close:hover {
        color: #1d2129;
        background-color: transparent;
      }

      .model_tabs {
        width: 100%;
        background-color: #f7f8fa;
      }

      .model_tabs .el-tabs__content {
        padding: 0px 15px;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <el-select
        class="increase_list_ipt"
        v-model="type"
        placeholder="请输入"
        multiple
        filterable
        @change="changeBrand"
      >
        <el-option
          v-for="item in typeList"
          :key="item.id"
          :label="item.name"
          :value="item.id"
        >
        </el-option>
      </el-select>

      <el-tabs v-model="index" class="model_tabs" v-if="tabList != 0">
        <el-tab-pane
          v-for="(item, index) in tabList"
          :key="item.name"
          :label="item.name"
          :name="item.name"
        >
          <span slot="label">
            <el-checkbox
              :value="item.checked"
              @change="checkAll(item,index)"
            ></el-checkbox>
            {{item.name}} {{item.checkedArr != 0 ? "+" + item.checkedArr.length
            : ''}}
          </span>
          <el-checkbox-group
            v-model="item.checkedArr"
            @change="checkCheck($event,item)"
          >
            <el-checkbox
              style="margin-bottom: 15px"
              v-for="city in item.model_list"
              :label="city.id"
              :key="city.id"
            >
              {{city.model_name}}</el-checkbox
            >
          </el-checkbox-group>
        </el-tab-pane>
      </el-tabs>

      <!-- 模拟提交 -->
      <el-button @click="submit">提交</el-button>
    </div>
    <script type="module">
      const vm = new Vue({
        el: "#app",
        data() {
          return {
            index: "",
            // select选中的
            type: [],
            // 下面的tab展示的
            tabList: [],
            // 下面则是后台返回所有数组
            typeList: [
              {
                name: "新海诚",
                id: 1,
                model_list: [
                  { model_name: "铃芽户缔", id: 11 },
                  { model_name: "天气之子", id: 12 },
                  { model_name: "你的名字", id: 13 },
                  { model_name: "言叶之庭", id: 14 },
                  { model_name: "秒速五厘米", id: 15 },
                ],
              },
              {
                name: "神作",
                id: 2,
                model_list: [
                  { model_name: "Clannad", id: 21 },
                  { model_name: "无职转生", id: 22 },
                  { model_name: "轻音少女", id: 23 },
                ],
              },
              {
                name: "唯美",
                id: 3,
                model_list: [{ model_name: "紫罗兰永恒花园", id: 31 }],
              },
            ],
          };
        },

        created() {
          // 模拟后端返回数据回显
          let data = localStorage.getItem("set");
          let { bind, ids } = JSON.parse(data);
          if (bind && ids) {
            let check = bind.map((obj) => Object.values(obj)[0]);
            this.tabList = this.typeList
              .filter((item) => ids.includes(item.id))
              .map((v, j) => {
                return {
                  ...v,
                  checked:
                    check[j] != 0
                      ? check[j].split(",").length == v.model_list.length
                      : false,
                  checkedArr:
                    check[j] != 0
                      ? check[j]?.split(",").map((item) => item / 1)
                      : [],
                  model_list: v.model_list.map((i) => {
                    return {
                      ...i,
                      checked:
                        v.checkedArr != 0
                          ? v.checkedArr?.includes(i.id)
                          : false,
                    };
                  }),
                };
              });
            this.type = ids;

            this.index = this.tabList[0].name;
          }
        },
        methods: {
          changeBrand(v) {
            // 筛选出现在的有的
            let arr = this.tabList.map((v) => v.id);
            // 过滤出现在没得
            let res = v.filter((item) => !arr.includes(item));
            // 然后将新增的处理新增字段
            let newData = this.typeList
              .filter((item) => res.includes(item.id))
              .map((v) => {
                return {
                  ...v,
                  checked: false,
                  checkedArr: [],
                  model_list: v.model_list.map((i) => {
                    return {
                      ...i,
                      checked: false,
                    };
                  }),
                };
              });
            // 如果新增则把新增的拼接过来
            this.tabList = [...this.tabList, ...newData];
            // 如果删除则把删除的过滤掉
            this.tabList = this.tabList.filter((item) => v.includes(item.id));
            // 每一次操作让tab回到第一个
            this.index = this.tabList[0]?.name;
          },
          // 全选
          checkAll(item) {
          
            item.checked = !item.checked;
            console.log(item.checked,"点击");
            item.checked
              ? (item.checkedArr = item.model_list.map((v) => v.id))
              : (item.checkedArr = []);
          },

          // 单选
          checkCheck(value, item) {
            let checkedCount = value.length;
            item.checked = checkedCount === item.model_list.length;
          },
          // 提交
          submit() {
            let data = {
              ids: this.tabList.map((v) => v.id),
              bind: this.tabList.map((v) => {
                return { [v.id]: v.checkedArr.join(",") };
              }),
            };
            // console.log(data);
            localStorage.setItem("set", JSON.stringify(data));
          },
        },
      });
    </script>
  </body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/450896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python读取DataFrame的某行或某列

行索引、列索引、loc和iloc import pandas as pd import numpy as np # 准备数据 df pd.DataFrame(np.arange(12).reshape(3,4),indexlist("abc"),columnslist("WXYZ"))行索引(index)&#xff1a;对应最左边那一竖列 列索引(columns)&#xff1a;对应最…

使用手机在网状态查询 API 有效防止虚假注册的设计思路

引言 随着移动互联网的普及&#xff0c;手机在网状态成为重要的数据指标。在网状态反映了手机用户的实际使用情况&#xff0c;对于各类企业和机构具有重要意义。 本文将为大家介绍手机在网状态 API 的主要特点和优势&#xff0c;并且探讨手机在网状态 API 的应用场景和效果展…

【小DS】ABC250 E - Prefix Equality

一开始看题解把我CPU干烧了 后来豁然开朗 E - Prefix Equality (atcoder.jp) 题意&#xff1a; 给定两个数组a,b&#xff0c;每次询问两个位置x和y&#xff0c;问a数组前x个构成的集合和b数组前y个构成的集合是不是一样 思路&#xff1a; 一开始纯暴力RE了 #include <…

IDEA 重磅插件 - Bito – GPT-4

笔者会陆续在个人主页 “AI” 专栏推荐优质 AI 软件、插件、网站… 而不是一股脑地抛给你一堆自行筛选&#xff0c;每一款都是笔者亲自体验感觉还不错的。 如果对你有帮助记得一键三连获取最新优质文章&#xff01; 1.介绍 Bito – GPT-4 Bito – GPT-4 & ChatGPT to writ…

WiFi 时钟

WiFi 时钟有很多开源项目的。但是&#xff0c;成品往往代码一大篇&#xff0c;看起来有些上头。加上有些库和环境的版本变迁&#xff0c;编译报错排查起来很是费劲。于是从头捋一遍&#xff0c;一步一步的过程&#xff0c;容易上手&#xff1a; 准备工作&#xff1a; a 零件&…

Netty源码解读

Netty源码解读 Netty线程模型 1、定义了两组线程池BossGroup和WorkerGroup&#xff0c;BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写 2、BossGroup和WorkerGroup类型都是NioEventLoopGroup&#xff0c;Group中维护了多个事件循环线程NioEventLoop&#…

AI新产品层出不穷,学不过来怎么办。

最近各个互联网巨头和创业新贵发布的AI工具&#xff0c;AI模型层出不穷&#xff0c;相关自媒体的热度也都很高&#xff0c;当然&#xff0c;各种大佬的隔空喊话也是非常吸引眼球&#xff0c;那么很多人就会觉得&#xff0c;要看的东西太多了&#xff0c;要学的东西太多了&#…

【数据结构】顺序表详解(附leetcode练习题)

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;数据结构 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&…

Java编译器插件Manifold(流形)

流形 文天祥正气歌中有云&#xff1a;“天地有正气&#xff0c;杂然赋流形”。 流形是一种抽象而又具体的事务&#xff0c;要研究一个事务就要格物&#xff0c;不格物就不能知道事物的具体描绘形式。流形大多数情况下是一种数学计算方式&#xff0c;可以将一个复杂的模型抽象…

Matplotlib Pyplot

Pyplot 是 Matplotlib 的子库&#xff0c;提供了和 MATLAB 类似的绘图 API。 Pyplot 是常用的绘图模块&#xff0c;能很方便让用户绘制 2D 图表。 Pyplot 包含一系列绘图函数的相关函数&#xff0c;每个函数会对当前的图像进行一些修改&#xff0c;例如&#xff1a;给图像加上…

ChatGPT | 申请与使用new bing的实用教程

1. 教程参考&#xff1a; https://juejin.cn/post/7199557716998078522 2.在参考上述教程遇到的问题与解决 2.1 下载dev浏览器的网址打不开 egde dev下载地址&#xff08;上面网站上的&#xff09;我电脑打不开 换用下面的网址即可 https://www.microsoftedgeinsider.com/z…

给定一个正整数字符串,使用Python正则表达式在其千分位上添加逗号

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 楼阁玲珑五云起&#xff0c;其中绰约多仙子。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python黄金青铜群【沐】问了一个Python正则表达式的问题…

MySQL开发工具评测,包含了Navicat、DBeaver、SQL Studio等12种

面对五花八门的MySQL客户端,开发者该如何选择,今天我整理了12种MySQL开发工具,从产品体验,功能完整度,云适配,计费模式,OS先容性等多个角度进行评估与分析,大家可根据自己的实际情况选择![在这里插入图片描述](https://img-blog.csdnimg.cn/56bdfc89afe743b9b87477d7c0521023.p…

SAP KANBAN 从入门到放弃系列之调拨模式

之前已经有三篇文章写了后台配置相关的介绍&#xff0c;这里不赘述。详见&#xff1a; PP-KANBAN-看板概述 SAP KANBAN 从入门到放弃系列之生产补货模式 SAP KANBAN 从入门到放弃系列之采购补货模式 第一步&#xff1a;补货策略-转库。不同的补充策略的控制类型有不同的作用…

【vue2 pc端】下拉滑动加载更多 vue-data-loading

官网地址 页面项目中使用 <template><!-- 空数据时显示 --><div class"nonono"><img src"/assets/img/404_cloud.png" alt"" v-if"goodslist.length < 0" class"nonnonoimg"></div>&…

燃气管道定位83KHZ地下电子标识器探测仪ED-8000操作指南

1、电子标识器探测工作 燃气管道定位83KHZ地下电子标识器探测仪ED-8000&#xff0c;探测时周边 3 米范围内不能有其他探测仪&#xff0c;保持探测仪垂直向 下&#xff0c;探测仪的末端距离地面 5~10cm 左右&#xff0c;延估计的埋地管线走向水平移动探测仪。当发现持续信号且信…

反射-Class类分析

反射相关的主要类 java.lang.Class&#xff1a;代表一个类&#xff0c;Class对象表示某个类加载后在堆中的对象java.lang.reflect.Method&#xff1a;代表类的方法&#xff0c;Method对象表示某个类的方法java.lang.reflect.Field&#xff1a;代表类的成员变量&#xff0c;Fie…

有手就行——基础XGBoost实战以 iris 数据集为例

基础 XGBoost 实战以 iris 数据集为例 1、导入数据2、数据预处理3、分训练集和测试集4、训练模型构建5、测试集预测准确度6、构建混淆矩阵7、特征重要性 对于很多只是小小使用机器学习&#xff0c;而不是深入了解的人来说&#xff0c;了解各种原理可能是十分痛苦的&#xff0c;…

Gnuplot绘图入门2 快捷方式

Gnuplot绘图入门2——根据多列文本数据绘制图形 Gnuplot绘图入门1以绘制sin(x)的函数图形为例&#xff0c;对Gnuplot进行了简要介绍。这个教程将介绍如何使用Gnuplot对保存在文本文件&#xff08;.txt、.dat文件&#xff09;中的数据进行可视化。 将下面的数据复制下了&#…

Linux安装Nginx,源码安装及创建软连接

前言 Nginx是一个功能强大、高性能、可扩展、易用和安全的Web服务器和反向代理服务器&#xff0c;被广泛应用于企业级和互联网领域 可扩展性&#xff1a;Nginx可以通过添加各种模块和插件来扩展其功能&#xff0c;包括HTTP流控制、SSL加密、压缩和解压缩、访问控制等。 高可靠…