vue封装原生table表格方法

适用场景:有若干个表格,前面几列格式不一致,但是后面几列格式皆为占一个单元格,所以需要封装表格,表格元素自动根据数据结构生成即可;并且用户可新增列数据。

分类
固定数据部分 就是根据数据结构传参设置table单元格内容及格式,数据结构由前端定义;
可新增删除部分 是由用户操作,格式统一为占一格,返回数据结构以列为单位,其中,删除列以判断对应列是否有表头为依据。
在这里插入图片描述

展示效果如下:

封装原生表格演示

目录

  • 固定表格部分
    • 数据格式
    • 元素设置
  • 可新增删除部分
    • 数据格式
    • 元素设置
    • 新增的方法
    • 删除的方法
    • 数据转换
      • 将格式转化为以列
      • 将格式转化为以表格
  • 全部代码

固定表格部分

需要确定的是固定表格中的需要给单元格元素传哪些值:

  1. 单元格的内容;
  2. 单元格格式会有很多种情况,可能会占几行,也可能会占几列,所以就需要控制着每个单元格的colspan和rowspan;
  3. 单元格的内容长短不一致所以也需要控制着单元格的宽度;

其它参数可有可无,需要依照自身需求添加逻辑。

数据格式

数据格式有四大字段,分别控制着出表头以外的行数(tdRows),为了便于控制除表头的tr循环次数;表格名称(title);表头内容(ths)和表身内容(tds)。

SafetyTableData:{tdRows: 3,//除表头的tbody所占行数title: '表格名称表格名称表格名称表格名称表格名称',ths: [{thName: 'Safety/安全',colspan: 1,rowspan: 4,isEdit: false,width: 100,},{thName: '关键指标KPI',colspan: 2,rowspan: 1,isEdit: false,width: 100,},{thName: '输出部门',colspan: 1,rowspan: 1,isEdit: false,width: 100,},{thName: '公式',colspan: 1,rowspan: 1,isEdit: false,width: 180,},{thName: '单位',colspan: 1,rowspan: 1,isEdit: false,width: 100,},],tds: [[{ tdName: '伤害', colspan: 1, rowspan: 3, isEdit: false, width: 30, },{ tdName: '占比%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: '(损失工时/ 投入工时)*100%', colspan: 1, rowspan: 1, isEdit: false, width: 180, },{ tdName: '%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },],[{ tdName: '一些值', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: 'ABCDEFG', colspan: 1, rowspan: 1, isEdit: false, width: 180, },{ tdName: 'absolute', colspan: 1, rowspan: 1, isEdit: false, width: 100, },],[{ tdName: '实际占比%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: '(实际损失工时/实际投入工时)*100%', colspan: 1, rowspan: 1, isEdit: false, width: 180, },{ tdName: '%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },],// Repeat similar structure for other rows as needed],},

元素设置

detailTableData为表格固定格式需要显示的数据,前面已设置了SafetyTableData的数据格式,可以直接将SafetyTableData赋值给detailTableData。若还有其他固定表格格式同理视情况赋值即可。

<table border="1"><tr ref="tableHeader"><th v-for="(thItem, index) in detailTableData.ths" :key="'th-' + index" :rowspan="thItem.rowspan" :colspan="thItem.colspan" :style="'width:'+thItem.width+'px'">{{thItem.thName}}</th></tr><tr v-for="rowIndex in detailTableData.tdRows" :key="rowIndex"><td v-for="(tdItem, colIndex) in detailTableData.tds[rowIndex-1]" :key="'td-' + rowIndex + '-' + colIndex" :rowspan="tdItem.rowspan" :colspan="tdItem.colspan" :style="'width:'+tdItem.width+'px'">{{tdItem.tdName}}</td></tr>
</table>

可新增删除部分

既然可新增删除部分都是占一个单元格,那么可以确定的是colspan和rowspan都为1。

数据格式

全局参数(newTableData)用于存放所有用户新增的数据;newThObj为新增表头时的数据;newTdObj为新增表身时的数据。

newTableData: {ths: [],tds: [], // 初始包含一个空数组
},
newThObj: {thName: '',colspan: 1,rowspan: 1,isEdit: true,
},
newTdObj: {tdName: '',colspan: 1,rowspan: 1,isEdit: true,
},

元素设置

<table border="1"><tr ref="tableHeader"><th v-for="(newThItem,newindex) in newTableData.ths" :key="newindex" class="item" :id="'test'+newindex"><el-input v-if="newThItem.isEdit && editTableSate" v-model="newThItem.thName" placeholder="请输入时间"></el-input><span v-else>{{newThItem.thName}}</span></th></tr><tr v-for="rowIndex in detailTableData.tdRows" :key="rowIndex"><td v-for="(newTdItem, newColIndex) in newTableData.tds[rowIndex-1]" :key="newColIndex"><el-input v-if="newTdItem.isEdit && editTableSate" v-model="newTdItem.tdName" placeholder="请输入"></el-input><span v-else>{{newTdItem.tdName}}</span></td></tr>
</table>

新增的方法

// 新增列的点击事件addTableColBtn() {// 向 newTableData.ths 添加一个新的表头对象this.newTableData.ths.push({ ...this.newThObj });// 如果 tds 为空,需要初始化它if (this.newTableData.tds.length === 0) {for (let i = 0; i < this.detailTableData.tdRows; i++) {this.newTableData.tds.push([]);}}// 遍历每一行,添加空单元格以匹配表头列数this.newTableData.tds.forEach(row => {row.push({ ...this.newTdObj });});},

删除的方法

// 反向遍历以避免删除元素时影响索引 -- 以表头为准,若表头为空,则提交后对应列为空for (let i = this.newTableData.ths.length - 1; i >= 0; i--) {if (!this.newTableData.ths[i].thName) {let shouldDeleteColumn = true;for (let row = 0; row < this.newTableData.tdRows; row++) {if (this.newTableData.tds[row][i].tdName) {shouldDeleteColumn = false;break;}}// 如果该列满足删除条件,则删除if (shouldDeleteColumn) {this.newTableData.ths.splice(i, 1);this.newTableData.tds.forEach(row => {row.splice(i, 1);});}}}

数据转换

在这里插入图片描述

将格式转化为以列

将newTableData{ths: [], tds: [],}转化为data[{SORT:‘’,TIME:‘’,TLLRGOAL:‘’,AF:‘’,ACTUALTLLR:‘’,}]格式

/*** 用于表格封装方法* @param {*object} newTableData:{ths:[],tds:[],} * @param {*string} type* @returns {*array} array:[{SORT:'',TIME:'',Cells1:'',Cells2:'',Cells3:'',}]*/transformTableData(newTableData, type) {const transformedData = [];newTableData.ths.forEach((th, index) => {const thName = th.thName;const colIndex = index;var transformedObj = {};switch (type) {case 'Safety'://安全transformedObj = {SORT: (colIndex + 1).toString(),//列数TIME: thName,//表头内容Cells1: newTableData.tds[0][colIndex].tdName,//单元格内容1Cells2: newTableData.tds[1][colIndex].tdName,//单元格内容2Cells3: newTableData.tds[2][colIndex].tdName//单元格内容3};break;default:break;}transformedData.push(transformedObj);});return transformedData;}

将格式转化为以表格

将data[{SORT:‘’,TIME:‘’,TLLRGOAL:‘’,AF:‘’,ACTUALTLLR:‘’,}]格式转化为newTableData{ths: [], tds: [],}

/*** 用于将获取数据返回至符合表格的封装方法* @param {*array} data:[{SORT:'',TIME:'',Cells1:'',Cells2:'',Cells3:'',}]* @returns {*object} newTableData:{ths:[],tds:[],} */transformData(data) {// 初始化 newTableData 结构let newTableData = {ths: [],tds: []};// 提取所有的列名,除了 "SORT" 和 "TIME"、"ID",因为这三个是固定的const columns = Object.keys(data[0]).filter(key => key !== "SORT" && key !== "TIME" && key !== "ID");// 填充 ths 数组newTableData.ths = data.map(item => ({thName: item.TIME,colspan: 1,rowspan: 1,isEdit: true}));// 填充 tds 数组for (let column of columns) {let columnData = data.map(item =>({tdName: item[column],colspan: 1,rowspan: 1,isEdit: true}));// 将每个字段的值按顺序插入 tds 数组newTableData.tds.push([...columnData]);}return newTableData;}

全部代码

<template><div class="testbox"><div class="bartype-class"><div class="verticalbar-class"></div><h4>Details</h4><el-button v-if="!editTableSate" @click="editTableBtn" size="mini" icon="el-icon-edit" style="margin-left:2%;">编 辑</el-button><div v-else style="margin-left: auto;display:flex;"><el-button @click="addTableColBtn" size="mini" icon="el-icon-plus">新增列</el-button><el-button @click="saveTableBtn" size="mini" icon="el-icon-upload">提 交</el-button></div></div><div class="tabletitle-class" v-if="detailTableData.title">{{detailTableData.title}}</div><div class="bar-class mytable" style="overflow: auto;"><table border="1"><tr ref="tableHeader"><th v-for="(thItem, index) in detailTableData.ths" :key="'th-' + index" :rowspan="thItem.rowspan" :colspan="thItem.colspan" :style="'width:'+thItem.width+'px'">{{thItem.thName}}</th><th v-for="(newThItem,newindex) in newTableData.ths" :key="newindex" class="item" :id="'test'+newindex"><el-input v-if="newThItem.isEdit && editTableSate" v-model="newThItem.thName" placeholder="请输入时间"></el-input><span v-else>{{newThItem.thName}}</span></th></tr><tr v-for="rowIndex in detailTableData.tdRows" :key="rowIndex"><td v-for="(tdItem, colIndex) in detailTableData.tds[rowIndex-1]" :key="'td-' + rowIndex + '-' + colIndex" :rowspan="tdItem.rowspan" :colspan="tdItem.colspan" :style="'width:'+tdItem.width+'px'">{{tdItem.tdName}}</td><td v-for="(newTdItem, newColIndex) in newTableData.tds[rowIndex-1]" :key="newColIndex"><el-input v-if="newTdItem.isEdit && editTableSate" v-model="newTdItem.tdName" placeholder="请输入"></el-input><span v-else>{{newTdItem.tdName}}</span></td></tr></table></div></div>
</template><script>export default {components: {},data() {return {detailTableData: {},//表格显示的数据// 安全表格固定数据;ID: 6SafetyTableData:{tdRows: 3,//除表头的tbody所占行数title: '表格名称表格名称表格名称表格名称表格名称',ths: [{thName: 'Safety/安全',colspan: 1,rowspan: 4,isEdit: false,width: 100,},{thName: '关键指标KPI',colspan: 2,rowspan: 1,isEdit: false,width: 100,},{thName: '输出部门',colspan: 1,rowspan: 1,isEdit: false,width: 100,},{thName: '公式',colspan: 1,rowspan: 1,isEdit: false,width: 180,},{thName: '单位',colspan: 1,rowspan: 1,isEdit: false,width: 100,},],tds: [[{ tdName: '伤害', colspan: 1, rowspan: 3, isEdit: false, width: 30, },{ tdName: '占比%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: '(损失工时/ 投入工时)*100%', colspan: 1, rowspan: 1, isEdit: false, width: 180, },{ tdName: '%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },],[{ tdName: '一些值', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: 'ABCDEFG', colspan: 1, rowspan: 1, isEdit: false, width: 180, },{ tdName: 'absolute', colspan: 1, rowspan: 1, isEdit: false, width: 100, },],[{ tdName: '实际占比%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: '游戏', colspan: 1, rowspan: 1, isEdit: false, width: 100, },{ tdName: '(实际损失工时/实际投入工时)*100%', colspan: 1, rowspan: 1, isEdit: false, width: 180, },{ tdName: '%', colspan: 1, rowspan: 1, isEdit: false, width: 100, },],// Repeat similar structure for other rows as needed],},newTableData: {ths: [],tds: [], // 初始包含一个空数组},newThObj: {thName: '',colspan: 1,rowspan: 1,isEdit: true,},newTdObj: {tdName: '',colspan: 1,rowspan: 1,isEdit: true,},editTableSate: false,//表格编辑状态};},created() {},computed: {},mounted() {this.detailTableData = this.SafetyTableData;},methods: {// 编辑表格按钮editTableBtn() {this.editTableSate = true;},// 新增列的点击事件addTableColBtn() {// 向 newTableData.ths 添加一个新的表头对象this.newTableData.ths.push({ ...this.newThObj });// 如果 tds 为空,需要初始化它if (this.newTableData.tds.length === 0) {for (let i = 0; i < this.detailTableData.tdRows; i++) {this.newTableData.tds.push([]);}}// 遍历每一行,添加空单元格以匹配表头列数this.newTableData.tds.forEach(row => {row.push({ ...this.newTdObj });});},// 保存表格的点击事件saveTableBtn() {// 反向遍历以避免删除元素时影响索引 -- 以表头为准,若表头为空,则提交后对应列为空for (let i = this.newTableData.ths.length - 1; i >= 0; i--) {if (!this.newTableData.ths[i].thName) {let shouldDeleteColumn = true;for (let row = 0; row < this.newTableData.tdRows; row++) {if (this.newTableData.tds[row][i].tdName) {shouldDeleteColumn = false;break;}}// 如果该列满足删除条件,则删除if (shouldDeleteColumn) {this.newTableData.ths.splice(i, 1);this.newTableData.tds.forEach(row => {row.splice(i, 1);});}}}this.saveTableDataFun();},// 保存表格数据函数async saveTableDataFun() {var data = [];if (this.newTableData.ths.length) {data = this.transformTableData(this.newTableData, 'Safety');}console.log('data:', data);this.editTableSate = false;},/*** 用于表格封装方法* @param {*object} newTableData:{ths:[],tds:[],} * @param {*string} type* @returns {*array} array:[{SORT:'',TIME:'',Cells1:'',Cells2:'',Cells3:'',}]*/transformTableData(newTableData, type) {const transformedData = [];newTableData.ths.forEach((th, index) => {const thName = th.thName;const colIndex = index;var transformedObj = {};switch (type) {case 'Safety'://安全transformedObj = {SORT: (colIndex + 1).toString(),//列数TIME: thName,//表头内容Cells1: newTableData.tds[0][colIndex].tdName,//单元格内容1Cells2: newTableData.tds[1][colIndex].tdName,//单元格内容2Cells3: newTableData.tds[2][colIndex].tdName//单元格内容3};break;default:break;}transformedData.push(transformedObj);});return transformedData;},/*** 用于将获取数据返回至符合表格的封装方法* @param {*array} data:[{SORT:'',TIME:'',Cells1:'',Cells2:'',Cells3:'',}]* @returns {*object} newTableData:{ths:[],tds:[],} */transformData(data) {// 初始化 newTableData 结构let newTableData = {ths: [],tds: []};// 提取所有的列名,除了 "SORT" 和 "TIME"、"ID",因为这三个是固定的const columns = Object.keys(data[0]).filter(key => key !== "SORT" && key !== "TIME" && key !== "ID");// 填充 ths 数组newTableData.ths = data.map(item => ({thName: item.TIME,colspan: 1,rowspan: 1,isEdit: true}));// 填充 tds 数组for (let column of columns) {let columnData = data.map(item =>({tdName: item[column],colspan: 1,rowspan: 1,isEdit: true}));// 将每个字段的值按顺序插入 tds 数组newTableData.tds.push([...columnData]);}return newTableData;}},watch: {}
};
</script><style scoped>
.testbox {width: 100%;height: 100%;
}
.bartype-class {display: flex;align-items: center;height: 25px;margin: 10px 0;
}
.verticalbar-class {width: 4px;height: 100%;background: #555555;margin-right: 9px;
}.mytable table {border-collapse: collapse;width: 100%;font-size: 12px;
}
.mytable table td:first-child,
th:first-child {/* font-weight: bold; *//* background-color: pink; */width: 15%;
}
.mytable table th,
td {border: 1px solid #ddd;text-align: center;padding: 8px;
}.mytable table th {background-color: #f2f2f2;
}
.text-left {text-align: left;
}
.mytable .el-input {width: 80px;
}
.mytable .el-input__inner {padding: 0 5px;
}
.item {cursor: pointer;
}
.tabletitle-class {background: #0070c0;color: #fff;margin: 0.5% 0;display: flex;justify-content: center;align-items: center;height: 30px;font-weight: bold;letter-spacing: 2px;
}
</style> 

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

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

相关文章

RHCE四---web服务器的高级优化方案

一、Web服务器&#xff08;2&#xff09; 基于https协议的静态网站 概念解释 HTTPS&#xff08;全称&#xff1a;Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext TransferProtocol Secure&#xff0c;超文本传输安全协议&#xff09;&#xff0c;是以…

内网渗透:端口转发(SSH隧道)

SSH&#xff1a;两台设备之间进行远程登录的协议&#xff08;SSH本身就是一个隧道协议&#xff09; 远程文件传输scp命令&#xff08;scp是基于SSH的&#xff09; 拓扑&#xff1a; SSH隧道搭建的条件 1.获取到跳板机权限 2.跳板机中SSH服务启动 SSH端口转发分类&#xff1…

【效率提升】新一代效率工具平台utools

下载地址&#xff1a;utools uTools这款软件&#xff0c;是一款功能强大且高度可定制的效率神器&#xff0c;使用快捷键alt space(空格) 随时调用&#xff0c;支持调用系统应用、用户安装应用和市场插件等。 utools可以调用系统设置和内置应用&#xff0c;这样可以方便快捷的…

职业技能大赛引领下大数据专业实训教学的改革研究

随着信息化时代的加速发展&#xff0c;大数据专业作为新兴的热门领域&#xff0c;正日益成为高等职业教育体系中不可或缺的一部分&#xff0c;其承担着为社会培养大批具有高素质应用技能的大数据技术人才的重任。职业技能大赛作为检验和提升学生技能水平的有效平台&#xff0c;…

Pytest集成Allure生成测试报告

# 运行并输出报告在Report文件夹下 查看生成的allure报告 1. 生成allure报告&#xff1a;pycharm terminal中输入命令&#xff1a;产生报告文件夹 pytest -s --alluredir../report 2. pycharm terminal中输入命令&#xff1a;查看生成的allure报告 allure serve ../report …

运维锅总详解Nginx

本文尝试从Nginx特性及优缺点、为什么具有文中所述的优缺点、Nginx工作流程、Nginx最佳实践及历史演进等角度对其进行详细分析。希望对您有所帮助。 Nginx特性及优缺点 Nginx简介 Nginx&#xff08;发音为 “engine-x”&#xff09;是一款高性能的开源Web服务器及反向代理服…

前端工程化08-新的包管理工具pnpm

1、历史原因解读 pnpm这个东西发布的时间是比较早的&#xff0c;但是在最近一两年的时候才开始流行&#xff0c;甚至是可以说非常的盛行&#xff0c;那么这个包到底是个什么东西的&#xff0c;那么我们先说下&#xff0c;原来的包管理工具到底有那些问题&#xff1f;比如说我们…

了解WPF控件:OpenFileDialog常用属性与用法(十六)

掌握WPF控件&#xff1a;熟练OpenFileDialog常用属性&#xff08;十六&#xff09; OpenFileDialog控件在WPF中用于需要用户指定文件路径&#xff0c;为用户提供了一个直观且易用的界面来浏览和选择本地文件系统中的文件。例如&#xff0c;当用户需要打开一个已存在的文本文件…

【小沐学AI】Python实现语音识别(Whisper-Web)

文章目录 1、简介2、下载2.1 openai-whisper2.2 whisper-web 结语 1、简介 https://openai.com/index/whisper/ Whisper 是一种自动语音识别 &#xff08;ASR&#xff09; 系统&#xff0c;经过 680,000 小时的多语言和多任务监督数据的训练&#xff0c;从网络上收集。我们表…

计算机网络 动态路由OSPF

一、理论知识 1.OSPF基本概念 ①OSPF是一种链路状态路由协议&#xff0c;使用Dijkstra算法计算最短路径。 ②OSPF使用区域&#xff08;Area&#xff09;来组织网络&#xff0c;区域0&#xff08;Area 0&#xff09;是主干区域。 ③路由器通过通告直连网络加入OSPF域。 ④反…

动态规划基础练习

我们需要先从数组较大的开始进行处理&#xff0c;每次考察上下左右的&#xff0c;比较当前存储的最大值和转移来的值&#xff0c;哪一个大一点 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std;int n, m; int a[105][105]; int addx[] { 0,…

C++输出彩色方块

1.使用方法 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0xab); ———————————————————————————————————————— 0 黑色 1 蓝色 2 绿色 3 湖蓝色 4 红色 5 紫色 6 黄色 7 白色 8 灰色 9 …

架构师必知的绝活-JVM调优

前言 为什么要学JVM&#xff1f; 首先&#xff1a;面试需要 了解JVM能帮助回答面试中的复杂问题。面试中涉及到的JVM相关问题层出不穷&#xff0c;难道每次面试都靠背几百上千条面试八股&#xff1f; 其次&#xff1a;基础知识决定上层建筑 自己写的代码都不知道是怎么回事&a…

图形处理单元(GPU)在现代计算中的应用与挑战(研究论文框架)

摘要:随着高性能计算需求的日益增长,图形处理单元(GPU)已从专业的图形渲染处理器转变为具有高性能并行处理能力的多功能计算平台。本文将探讨GPU的核心优势、编程模型、在不同领域的应用以及面临的挑战和限制。此外,还将讨论GPU技术的未来发展趋势和潜在的研究机会。 关键…

[计算机网络] 虚拟局域网

虚拟局域网 VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是将一个物理的局域网在逻辑上划分成多个广播域的技术。 通过在交换机上配置VLAN&#xff0c;可以实现在同一个VLAN 内的用户可以进行二层互访&#xff0c;而不同VLAN 间的用户被二…

hive零基础入门

1、hive简介 hive&#xff1a;由facebook开源用于解决海量结构化数据的统计工具。 hive是基于Hadoop的数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供sql查询功能。 2、hive本质 hive的本质是HQL&#xff08;HiveSQL&#xff09;转化成MapR…

快速应用开发(RAD):加速软件开发的关键方法

目录 前言1. 快速应用开发的概念1.1 什么是快速应用开发&#xff1f;1.2 RAD与传统开发方法的对比 2. 快速应用开发的实施步骤2.1 需求分析与规划2.2 快速原型开发2.3 用户评估与反馈2.4 迭代开发与改进2.5 最终交付与维护 3. 快速应用开发的优点与应用场景3.1 优点3.2 应用场景…

UNIAPP编译到微信小程序时,会多一层以组件命名的标签

UNIAPP编译到微信小程序时&#xff0c;会多一层以组件命名的标签 解决方案 可以配置virtualHost来配置 export default {options: {virtualHost: true} }

Navicat安装与连接教程

navicat 的安装 官网&#xff1a;https://www.navicat.com.cn/ 进入官网之后点击左上角的产品&#xff0c;然后往下滑动就可以看见许多类型&#xff0c;我们使用的是MongoDB数据库&#xff0c;所以就下载Navicat 17 for MongoDB 进入到这里之后&#xff0c;选择自己的系统版本…

面试-J.U.C包的梳理

1.J.U.C包的梳理 Java.Util.Concurrent包简称JUC (1)JUC整体架构图 (2)分析 Executor&#xff1a;线程执行器&#xff0c;任务执行和调度的框架。Tools下存在executor相关的executors类&#xff0c;用于创建executorservice&#xff0c;scheduleexecutorservice&#xff0c;…