【案例】根据商品的颜色进行分组,同一种颜色的商品可以对应多种尺寸、价格以及库存

效果展示

效果说明

 输入商品的颜色、尺寸后点击添加按钮,即可将对应的商品信息添加到下方的表格当中,表格中除了会显示商品的颜色和尺寸之外,还会显示商品的价格和库存,并且可以对商品的价格和库存进行修改,并且根据颜色进行分组将相同颜色值的数据都会添加在一个大行当中。

效果实现代码

第一步:创建项目

yarn create vite sku

第二步:安装项目所需要的依赖

yarn
yarn add sass sass-loader
yarn add vue-router
yarn add path
yarn add element-plus
yarn add -D unplugin-auto-import
yarn add unplugin-vue-components@0.26.0

注意:

安装 unplugin-vue-components 的时候要指导其版本为0.26.0,否则默认安装的为最新版本0.27.0,等到配置完element-plus组件的自动导入时会导致样式不生效的问题。

第三步: 配置别名@,以及配置element-plus的自动导入

vue.configchuan.js

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import path from 'path';
import AutoImport from 'unplugin-auto-import/vite';
import Components from 'unplugin-vue-components/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';

export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  },
});

第四步:创建Home页面并配置路由文件

src/router/index.js

import {createRouter,createWebHistory} from 'vue-router'

const routes = [
  {
    path: '/',
    component:()=>import('@/views/Home.vue')
  }
]
const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router

第五步:引入路由文件

main.js

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router'

createApp(App).use(router).mount('#app')

第六步:在创建的Home页面中编写代码

<template>
  <div>
    <div>
      <el-input v-model="color" placeholder="请输入颜色" />
      <el-input v-model="size" placeholder="行输入型号" />
      <el-button type="primary" @click="add">添加</el-button>
    </div>
    <div>
      <table width="1000" cellspacing="0">
        <!-- 表格的标题部分 -->
        <tr>
          <th
            v-for="(item, index) in showThData"
            :key="index"
            class="thStyle"
            :style="{ borderLeft: index === 0 ? '1px solid #eee' : '' }"
          >
            {{ item.title }}
          </th>
        </tr>
        <tr v-if="!tableData.length">
          <td :colspan="thData.length" class="noData">暂无数据</td>
        </tr>
        <!-- 表格的内容主题部分 -->
        <tr v-for="(obj, key) in groupData" :key="key" class="size tdbgColor">
          <!-- 颜色列 -->
          <td class="colorBorder" :style="tdStyle('color')">{{ key }}</td>
          <!-- 尺寸列 -->
          <td>
            <!-- 每种尺寸独占一行 -->
            <tr v-for="(item, index) in obj" :key="index">
              <td :style="tdStyle('size')">{{ item.size }}</td>
            </tr>
          </td>
          <!-- 价格列 -->
          <td>
            <!-- 每种尺寸的价格独占一行 -->
            <tr v-for="(item, index) in obj" :key="index">
              <td :style="tdStyle('size')">
                <!-- 
                  设置 precision 属性可以控制数值精度,接收一个 Number
                  当设置number为2的时候为保留两位小数
                 -->
                <el-input-number
                  v-model="item.price"
                  :precision="2"
                  :min="0"
                  @change="handleChange"
                />
              </td>
            </tr>
          </td>
          <!-- 库存列 -->
          <td>
            <!-- 每种尺寸的库存独占一行 -->
            <tr v-for="(item, index) in obj" :key="index">
              <td :style="tdStyle('size')">
                <!-- 
                  设置 precision 属性可以控制数值精度,接收一个 Number
                  当设置number为0的时候为保留整数【四舍五入】
                 -->
                <el-input-number
                  v-model="item.stock"
                  :precision="0"
                  :min="0"
                  @change="handleChange"
                />
              </td>
            </tr>
          </td>
        </tr>
      </table>
    </div>
    <!-- <el-button type="primary" @click="submit">提交</el-button>
    <div v-show="isShow">{{ showGroupData }}</div>  -->
  </div>
</template>

<script setup>
import { ref } from "vue";

const handleChange = (value) => {
  console.log(value);
};

const tableData = ref([]);
const thData = ref([
  { title: "颜色", text: "color" },
  { title: "尺寸", text: "size" },
  { title: "价格", text: "price" },
  { title: "库存", text: "stock" },
]);
const showThData = ref(thData);
const color = ref(""); //颜色
const size = ref(""); //尺寸
const groupData = ref({}); //将添加的数据按照颜色进行分组
const showGroupData = ref({});
// 点击添加按钮将数据添加到下方表格中
const add = () => {
  tableData.value.push({
    color: color.value,
    size: size.value,
    price: 0,
    stock: 0,
  });
  sort();
};
// 对添加的数据进行分组处理,当多个颜色的值相同时按照第一个出现的位置进行排序
const sort = () => {
  // 创建一个映射表来记录每种颜色首次出现的索引
  const colorIndices = new Map();
  tableData.value.forEach((item, index) => {
    if (!colorIndices.has(item.color)) {
      colorIndices.set(item.color, index);
    }
  });

  // 根据颜色首次出现的索引进行排序
  tableData.value.sort((a, b) => {
    // 获取a和b的颜色首次出现的索引
    const indexA = colorIndices.get(a.color);
    const indexB = colorIndices.get(b.color);

    // 如果首次出现的索引相同,则保持原始顺序(可选,取决于具体需求)
    // 这里假设原始顺序应当保持,如果不需要保持则直接返回 indexA - indexB 即可
    return indexA === indexB
      ? tableData.value.indexOf(a) - tableData.value.indexOf(b)
      : indexA - indexB;
  });
  // 使用reduce方法对数据进行分组处理
  groupData.value = tableData.value.reduce((acc, curr) => {
    const color = curr.color;
    if (!acc[color]) {
      acc[color] = [];
    }
    acc[color].push(curr);
    return acc;
  }, {});
};
// 单元格的样式设置
const tdStyle = (type) => {
  let style = { borderBottom: "1px solid #eee" };
  if (type === "color") {
    style.borderLeft = "1px solid #eee";
  } else {
    style.borderRight = "1px solid #eee";
  }
  return style;
};
const isShow = ref(false); //数据是否显示
// 点击提交按钮将数据显示在下方
const submit = () => {
  showGroupData.value = { ...groupData.value, title: thData.value };
  isShow.value = true;
};
</script>
<style lang="scss" scoped>
.el-input {
  margin: 10px;
  width: 200px;
}
table {
  margin: 10px;
  text-align: center;
  th,
  td {
    width: 250px;
    height: 50px;
  }
  th {
    color: #888;
  }
  .thStyle {
    border: 1px solid #eee;
    border-left: none;
  }
  .size {
    border: none;
  }
  // 设置样式表格隔行显示背景色
  .tdbgColor:nth-child(2n + 1) {
    background: #d1edff59;
  }
}
.colorBorder {
  border-right: 1px solid #eee;
}
.price {
  border-right: 1px solid #eee;
  border-bottom: 1px solid #eee;
}
.noData {
  border: 1px solid #eee;
  border-top: none;
  color: #ccc;
}
</style>

通过以上步骤即可实现效果图中所展示的效果

由于对于element-plus组件库中的el-table的合并单元格的方法没有写明白所以就用了原生的table书写的,如果有哪位大佬可以使用el-table实现该效果,还请不吝赐教。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现mysql的主从复制、实现MySQL的读写分离与负载均衡

实验环境 &#xff08;注明&#xff09;以下的所有关于yum和rpm以及tar的软件需要自己准备&#xff0c;没有的话可以私信博主 实验目标&#xff1a; 1.实现mysql主从复制 2.实现mysql读写分离与负载均衡 实验一、搭建mysql主从复制 1.建立时间同步环境&#xff0c;在主节…

圆上点云随机生成(人工制作模拟数据)

1、背景介绍 实际上,很多地物外表形状满足一定的几何形状结构,如圆形是作为常见一类。那么获取该类目标的点云数据便是位于一个圆上的点云数据。如下图所示为两簇典型的点云,其中一种为理想型,点均位于一个圆上,另外一簇则是近似位于一个圆上,这种更加符合真实情况。有时…

Skywalking 介绍及应用(从0到1)完整版

微服务全链路追踪 一、APM 系统 APM 系统是可以帮助理解系统行为、用于分析性能问题的工具以便发生故障的时候&#xff0c;能够快速走位和解决问题。 告警规则 SkyWalking 的发行版都会默认提供config/alarm-settings.yml文件&#xff0c;里面预先定义了一些常用的告警规则。…

动手学深度学习20 卷积层里的填充和步幅

动手学深度学习20 卷积层里的填充和步幅 1. 填充和步幅2. 代码实现3. QA4. 练习 课本&#xff1a; https://zh-v2.d2l.ai/chapter_convolutional-neural-networks/padding-and-strides.html 1. 填充和步幅 卷积网络可调的超参数。 当输入shape一定&#xff0c;卷积核shape一定&…

springcloud+nocos从零开始

首先是去nacos官网下载最新的包&#xff1a;Nacos 快速开始 | Nacos win下启动命令&#xff1a;startup.cmd -m standalone 这样就可以访问你的nacos 了。 添加一个配置&#xff0c;记住你的 DataId,和Group名字。 创建一个pom项目&#xff0c;引入springCloud <?xml ve…

windows快速计算文件的SHA256数值的步骤

在文件路径打开cmd窗口 输入命令 用Windows自带的certutil命令来计算一个文件的校验值1&#xff1a; certutil支持的算法有&#xff1a;MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512。 certutil的使用方法非常简单&#xff0c;只需要执行“certutil -hashfile 文件名 校验值类型”…

SpringAI应用开发

一、人工智能简述 四次工业革命推动了人类社会发展和变革&#xff1a; 蒸汽时代&#xff0c;发生在18世纪60年代~19世纪中期&#xff08;大约是1760年到1860年&#xff09;&#xff0c;这一时期的特点是机械化生产和大规模生产。电气时代&#xff0c;发生在19世纪下半叶~20世纪…

齐护K210系列教程(二十七)_语音识别

语音识别 1.烧录固件和模型2.语音识别程序2.1训练并识别2.2使用本地文件语音识别 3.课程资源联系我们 1.烧录固件和模型 注&#xff1a;本应用只适用于有麦克风功能的型号&#xff1a;AIstart_pro、AIstart_掌机、AIstart_Mini, 其它型号不支持&#xff01; 机器码生成以及模…

人工智能到底是什么玩意儿?

说实话&#xff0c;每次听到“人工智能”这个词&#xff0c;我都感觉像是在听天书一样。它似乎总是被包裹在一堆高大上的术语和概念里&#xff0c;让人摸不着头脑。但今天&#xff0c;我决定挑战一下自己&#xff0c;把这个问题搞个明白&#xff01; 首先&#xff0c;我得承认&…

5 个免费使用 GPT-4o 的方法

5 个免费使用 GPT-4o 的方法 虽然距离 OpenAI 发布 GPT-4o 已过去一天&#xff0c;我仍然对 GPT-4o 感到震撼。Demo 中语音助手功能实在是太令人惊叹了——它咯咯的笑声、准确的语气感叹和歌唱方式让 Siri 和 Google Assistant 显得相形见绌。 虽然备受期待的语音助手功能还要…

论文阅读-《MHFormer: Multi-Hypothesis Transformer for 3D Human Pose Estimation》

目录 1 摘要 2 介绍 3 相关工作 3.1 3D HPE 3.2 ViT 3.3 多假设方法 4 MHFormer 4.1 概述 4.2 准备阶段 4.2.1 多头自注意力机制&#xff08;MSA&#xff09; 4.2.2 多层感知器&#xff08;MLP&#xff09; 4.3 MHG-多假设生成 4.3.1 概述 4.3.2 详细解释&#x…

数学建模——建立数学模型(1)

前言 这个也是对《数学模型》&#xff08;姜启源第四版&#xff09;书内容的摘抄 建立数学模型 数学模型这个词汇现在越来越多地出现在现代入的 生产、工作和社会活动中&#xff0e;广大的科学技 术人员和应用数学工作者来说&#xff0c;建立数学模型是沟通摆在面前的实际问…

Redis第17讲——Redis zset结构实现滑动窗口限流

一、什么是滑动窗口限流 滑动窗口限流是一种流量控制策略&#xff0c;用于控制在一定时间内允许执行的操作数量或请求频率。它的工作方式类似于一个滑动时间窗口&#xff0c;对每个时间窗口的请求数量进行计数&#xff0c;并根据预先设置的限流策略来限制或调节流量&#xff0…

「AIGC算法」近邻算法原理详解

本文主要介绍近邻算法原理及实践demo。 一、原理 K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;是一种基于距离的分类算法&#xff0c;其核心思想是距离越近的样本点&#xff0c;其类别越有可能相似。以下是KNN算法的原理详解&#xff1a; 1. 算…

STM32手写寄存器的方式实现点亮LED灯

这次是从头开始学习STM32&#xff0c;看野火的视频开始学习&#xff0c;感觉需要记录的时候就要记录一下学习的心得。野火视频学习的老师讲的还是很到位的&#xff0c;能够学习到很多的细节之处&#xff0c;有时会感觉很啰嗦&#xff0c;但是不得不说确实很详细&#xff0c;只有…

cpu卡片详解(FM1208)

​ 目录 ​1. 引言 1.1 FM1208 CPU卡芯片 2. FM1208 CPU卡芯片概述 2.1 FM1208及其在智能卡中的作用 2.2 FM1208功能框图 3.FM1208的技术规格 4.FM1208工作流程 5.&#xff26;&#xff2d;1208文件结构 6.FM1208与其他智能卡技术的比较 7.FM1208安全特性 7.1 DES/…

水泡传感器内部结构

水泡传感器内部结构&#xff1a; 水泡传感器放大电路 电路是基于1.6V做的TIA I2V&#xff0c; 也就是输出部分基于1.6V做电压的增加或减少。

OpenAI GPT-4o:开启人工智能交互新纪元

引言 在人工智能领域&#xff0c;OpenAI一直是创新的代名词。2024年5月14日&#xff0c;OpenAI再次以GPT-4o模型震撼了科技界&#xff0c;这款全新的旗舰生成模型不仅免费向公众开放&#xff0c;更以其革命性的多模态交互能力&#xff0c;引领我们进入了一个全新的科幻时代。 …

react 图片没有加载出来的问题

react 图片没有加载出来的问题 我原来是这样写的 <Layout><Sider><imgsrc"../images/login/topdivbg20221202.png"/></Sider><Content><Menu onClick{onClick} selectedKeys{[current]} mode"horizontal" it…

停车场车位引导系统是什么,停车场车位引导系统有哪些作用?

随着城市交通的快速发展&#xff0c;车辆的数量也在迅速增长&#xff0c;随之而来的就是停车难的问题&#xff0c;那么在城市中&#xff0c;如何合理的利用好现有资源&#xff0c;让停车资源得到合理利用呢&#xff1f;这就需要一套科学有效的智能停车场系统&#xff0c;可以帮…