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

效果展示

效果说明

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

效果实现代码

第一步:创建项目

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><thv-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-numberv-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-numberv-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实现该效果,还请不吝赐教。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不干人事的表达式:(void)0

assert是C语言的一个宏。在<assert.h>中可以找到它的定义&#xff1a; #ifdef NDEBUG#define assert(_Expression) ((void)0) #else /* !defined (NDEBUG) */// 省略... #endif /* !defined (NDEBUG) */ 其用法在“捕捉错误的assert”一文中已有说明。 决定assert是否…

JavaSE——集合框架一(3/7)-List系列集合:特点、方法、遍历方式、ArrayList集合的底层原理

目录 List集合 特点、特有方法 实例演示 List集合支持的遍历方式 ArrayList集合的底层原理 List集合 我们要了解List集合三点&#xff1a; 有什么特点&#xff1f;是否有特有功能&#xff1f;适合什么业务场景&#xff1f; 特点、特有方法 List系列集合特点&#xff1a…

银行风险系统的全面解析:功能作用与系统间的互联互通

银行风险管理系统是银行为控制风险而建立的一套重要系统&#xff0c;主要用于评估、监测和控制银行面临的各种风险&#xff0c;包括信用风险、市场风险、操作风险等。 一、主要功能 风险识别&#xff1a;系统首先识别在业务开展中可能会面临的各种风险。这通常涉及对客户信息、…

4.线性代数

深度学习作为一门前沿的、应用广泛的学科&#xff0c;对于数学基础的要求非常高。 线性代数 线性代数在深度学习中扮演着至关重要的角色。它不仅是描述和理解数据的基础工具&#xff0c;也是构建和训练神经网络的核心组件。例如&#xff0c;在深度学习中&#xff0c;我们经常…

uniapp小程序使用scroll-view组件实现上下左右滚动触发事件

在做uniapp开发小程序的时候&#xff0c;有一个需求是在一个表格区域里面可以上下左右滑动元素&#xff0c;并实现表头和左侧的标签联动效果&#xff0c;就想趣运动里面选择场地的效果一样&#xff0c;这里就用到了scroll-view组件&#xff0c;scroll-view官网文档地址&#xf…

积温空间分布数据、气温分布数据、日照数据、降雨量分布、太阳辐射数据、地表径流数据、土地利用数据、npp数据、ndvi数据

引言 积温是某一时段内逐日平均气温之和,它是研究植物生长、发育对热量的要求和评价热量资源的一种指标,是影响植物生长的重要因素之一&#xff0c;对指导农业生产和生态建设具有非常重要的意义。作为重要的气候资源&#xff0c;积温与其它资源的区别在于存在很大的地域差异和时…

Mamba:7 VENI VIDI VICI

若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果构建生成级别的AI架构则可以关注AI架构设计。技术宅麻烦死磕LLM背后的基础模型。 序列模型的效率与有效性之间的权衡取决于状态编…

解决GitHub提交后不显示自己的头像 显示另一个没见过的账号?

问题说明 最近换了几台电脑开发项目&#xff0c;提交到github&#xff0c;看了下提交记录&#xff0c;怎么冒出来不是我的账号头像&#xff1f; 什么鬼i 原因分析 github是按照你注册时候填的邮箱来查找账号&#xff0c;并显示在提交记录上面的。如果账号找不到头像就出不来…

停车场车位引导管理系统工作原理是什么,由哪些软硬件设备组成?

在现代城市中&#xff0c;随着汽车保有量的持续增长&#xff0c;停车难成为了许多城市面临的共同问题。有效管理停车场资源&#xff0c;提高车位利用率&#xff0c;减少寻找停车位的时间&#xff0c;对于缓解交通拥堵、提高城市运行效率具有重要意义。车位引导管理系统正是为了…

1755jsp学生信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 学生信息管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;…

【Oracle篇】rman物理备份工具的基础理论概述(第一篇,总共八篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

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

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