element-ui中的el-table合并单元格

描述:

在写项目的时候有时候会经常遇到把行和列合并起来的情况,因为有些数据是重复渲染的,不合并行列会使表格看起来非常的混乱,如下:

 而我们想要的数据是下面这种情况,将重复的行进行合并,使表格看起来简单明了,如下:

 


解决方案:

一:合并行

1:html部分

所谓的合并行就是将多行相同的数据变成一行来显示,页面的布局比较简单

<template><div class="table"><el-table :data="tableData" :span-method="objectSpanMethod" border style="width: 100%"><el-table-column prop="time" label="时间"></el-table-column><el-table-column prop="grade" label="年级"></el-table-column><el-table-column prop="name" label="姓名"></el-table-column><el-table-column prop="subjects" label="科目"></el-table-column><el-table-column prop="score" label="成绩"></el-table-column></el-table></div>
</template>

2:模拟data数据

span-methodel-table上属性,其值是一个函数,objectSpanMethod方法是用来处理合并行的返回值,tableData数据如下

tableData: [{time:'2020-08-10',grade:'三年二班',name: '小明',subjects:'语文',score: 80 },{time:'2020-08-10',grade:'三年二班',name: '小明',subjects:'数学',score: 80 },{time:'2020-08-10',grade:'三年一班',name: '小雷',subjects:'语文',score: 70 },{time:'2020-08-10',grade:'三年一班',name: '小雷',subjects:'数学',score: 80 },{time:'2020-08-11',grade:'三年三班',name: '小花',subjects:'语文',score: 60 },{time:'2020-08-11',grade:'三年三班',name: '小花',subjects:'数学',score: 60 },],mergeObj: {}, // 用来记录需要合并行的下标tableProps: ['time', 'grade', 'name', 'subjects', 'score'] // 表格中的列名

3:梳理数据以及方法调用

首先需要对数据就行处理,就是比较当前行与上一行的值是否相等(如果是第一行数据,直接将值赋值为1)

watch中监听表格中的数据,当不为空的的时候,调用数据初始化数据的方法,如下:

watch:{"tableData":function (newVal,oldVal){console.log("nnnnnnnnnnnn",newVal)console.log("oooooooooooo",oldVal)if(newVal.length>0){this.getSpanArr(this.tableData);}}},
// getSpanArr方法
getSpanArr(data) {this.tableProps.forEach((key, index1) => {let count = 0; // 用来记录需要合并行的起始位置this.mergeObj[key] = []; // 记录每一列的合并信息data.forEach((item, index) => {// index == 0表示数据为第一行,直接 push 一个 1if(index === 0) {this.mergeObj[key].push(1); } else {/*判断当前行是否与上一行其值相等 如果相等 在 count 记录的位置其值 +1表示当前行需要合并 并push 一个 0 作为占位*/  if(item[key] === data[index - 1][key]) { this.mergeObj[key][count] += 1;this.mergeObj[key].push(0);} else {// 如果当前行和上一行其值不相等 count = index; // 记录当前位置 this.mergeObj[key].push(1); // 重新push 一个 1}}})})
}

数据处理好之后就可以调用objectSpanMethod方法了,如下:

// objectSpanMethod方法/*默认接受四个值----row==当前行的数据----column==当前列的数据----rowIndex==行的下标----columnIndex==列的下标*/
// 默认接受四个值 { 当前行的值, 当前列的值, 行的下标, 列的下标 }
objectSpanMethod({ row, column, rowIndex, columnIndex }) {// 判断列的属性if(this.tableProps.indexOf(column.property) !== -1) { // 判断其值是不是为0 if(this.mergeObj[column.property][rowIndex]) { return [this.mergeObj[column.property][rowIndex], 1]} else {// 如果为0则为需要合并的行return [0, 0]; }// 只有 第一列 第二列 第三列 合并行// if(columnIndex===1||columnIndex===2||columnIndex===3){//   // 判断列的属性//   if(this.tableProps.indexOf(column.property) !== -1) {//     // 判断其值是不是为0 //     if(this.mergeObj[column.property][rowIndex]) { //       return {//         rowspan: this.mergeObj[column.property][rowIndex],//         colspan: 1//       };//     } else {//       // 如果为0则为需要合并的行//       return {//         rowspan: 0,//         colspan: 0//       }; //     }//   }// }}
}

4:效果图

合并后的结果就是我们想要的形式:

 5:合并行的完整代码

<template><div class="table"><el-table :data="tableData" :span-method="objectSpanMethod" border style="width: 100%"><el-table-column prop="time" label="时间"></el-table-column><el-table-column prop="grade" label="年级"></el-table-column><el-table-column prop="name" label="姓名"></el-table-column><el-table-column prop="subjects" label="科目"></el-table-column><el-table-column prop="score" label="成绩"></el-table-column></el-table></div>
</template><script>
export default {name: 'Table',data() {return {tableData: [{ time: '2020-08-10', grade: '三年二班', name: '小明', subjects: '语文', score: 80 },{ time: '2020-08-10', grade: '三年二班',name: '小明', subjects: '数学', score: 80 },{ time: '2020-08-10', grade: '三年一班',name: '小雷', subjects: '语文', score: 70 },{ time: '2020-08-10', grade: '三年一班', name: '小雷', subjects: '数学', score: 80 },{ time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '语文', score: 60 }, { time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '数学', score: 60 }, ],mergeObj: {},mergeArr: ['time', 'grade', 'name', 'subjects', 'score'],};},watch:{"tableData":function (newVal,oldVal){console.log("nnnnnnnnnnnn",newVal)console.log("oooooooooooo",oldVal)if(newVal.length>0){this.getSpanArr(this.tableData);}}},methods: {getSpanArr(data) {this.mergeArr.forEach((key, index1) => {let count = 0; // 用来记录需要合并行的起始位置this.mergeObj[key] = []; // 记录每一列的合并信息data.forEach((item, index) => {// index == 0表示数据为第一行,直接 push 一个 1if(index === 0) {this.mergeObj[key].push(1); } else {/*判断当前行是否与上一行其值相等如果相等 在 count 记录的位置其值 +1表示当前行需要合并 并push 一个 0 作为占位 */   if(item[key] === data[index - 1][key]) { this.mergeObj[key][count] += 1;this.mergeObj[key].push(0);} else {// 如果当前行和上一行其值不相等 count = index; // 记录当前位置 this.mergeObj[key].push(1); // 重新push 一个 1}}})})},// 默认接受四个值 { 当前行的值, 当前列的值, 行的下标, 列的下标 }objectSpanMethod({ row, column, rowIndex, columnIndex }) {// 判断列的属性if(this.mergeArr.indexOf(column.property) !== -1) { // 判断其值是不是为0 if(this.mergeObj[column.property][rowIndex]) { return [this.mergeObj[column.property][rowIndex], 1]} else {// 如果为0则为需要合并的行return [0, 0]; }}}},};
</script><style lang="stylus" scoped>
.table height 100vhwidth 100%padding 40pxbox-sizing border-box/deep/ .el-table__body tr:hover > tdbackground-color: #fff;
</style>

二:合并行列

1:模拟data数据

span-method是el-table上属性,其值是一个函数,objectSpanMethod方法是用来处理合并行的返回值,tableData数据如下

tableData: [{ time: '2020-08-10', grade: '三年二班', name: '小明', subjects: '语文', score: 80 },{ time: '2020-08-10', grade: '三年二班', name: '小明', subjects: '数学', score: 80 }, { time: '2020-08-10', grade: '总成绩', name: '总成绩', subjects: '总成绩', score: 160 },{ time: '2020-08-10', grade: '三年一班', name: '小雷', subjects: '语文', score: 70 },{ time: '2020-08-10', grade: '三年一班', name: '小雷', subjects: '数学', score: 80 },{ time: '2020-08-10', grade: '总成绩', name: '总成绩', subjects: '总成绩', score: 150 }, { time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '语文', score: 60 }, { time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '数学', score: 60 }, { time: '2020-08-11', grade: '总成绩', name: '总成绩', subjects: '总成绩', score: 120 }
],

2:对比当一次的图片

可以看到上面的数据多了一行总成绩,现在的数据在页面显示效果如下:

3:html调整

可以看到总成绩的三个列并没有合并,并不是我们想要的效果,所以需要换一种思路来处理数据

页面的布局也有所调整,如下:

<template><div class="table"><el-table :data="tableData" :span-method="objectSpanMethods" border style="width: 100%"><template v-for="cols in colConfigs"><!-- 无需合并的列 --><el-table-columnv-if="cols.type === 'label' && !cols.children":key="cols.prop":prop="cols.prop":label="cols.label"></el-table-column><!-- 需要合并的列 --><template v-else-if="cols.type === 'label' && cols.children"><el-table-columnv-for="children in cols.children":key="children.prop":prop="children.prop":label="children.label"/></template></template></el-table></div>
</template>

4:在data中声明的变量

// 表格的信息 需要合并的需要放在 children 中
colConfigs: [{type: 'label',children: [{ prop: 'time', label: '时间' },{ prop: 'grade', label: '年级' },{ prop: 'name', label: '姓名' },{ prop: 'subjects', label: '科目' },{ prop: 'score', label: '成绩' }]}
],
// 需要合并的行列信息
mergeCols: [{ index: 0, name: 'time' },{ index: 1, name: 'grade' },{ index: 2, name: 'name' },{ index: 3, name: 'subjects' },{ index: 4, name: 'score' },
],
// 用来记录每一个单元格的下标
tableMergeIndex: [],

5:梳理数据以及方法调用

watch:{"tableData":function (newVal,oldVal){console.log("nnnnnnnnnnnn",newVal)console.log("oooooooooooo",oldVal)if(this.mergeCols.length > 0) {this.newTableMergeData();}}},
// newTableMergeData方法
newTableMergeData() {for (let i = 0; i < this.tableData.length; i++) {for (let j = 0; j < this.mergeCols.length; j++) {// 初始化行、列坐标信息let rowIndex = 1;let columnIndex = 1;// 比较横坐标左方的第一个元素if (j > 0 && this.tableData[i][this.mergeCols[j]['name']] === this.tableData[i][this.mergeCols[j - 1]['name']]) {columnIndex = 0;}// 比较纵坐标上方的第一个元素if (i > 0 && this.tableData[i][this.mergeCols[j]['name']] === this.tableData[i - 1][this.mergeCols[j]['name']]) {rowIndex = 0;}// 比较横坐标右方元素if (columnIndex > 0) {columnIndex = this.onColIndex(this.tableData[i], j, j + 1, 1, this.mergeCols.length);}// 比较纵坐标下方元素if (rowIndex > 0) {rowIndex = this.onRowIndex(this.tableData, i, i + 1, 1, this.mergeCols[j]['name']);}let key = this.mergeCols[j]['index'] + '_' + i;this.tableMergeIndex[key] = [rowIndex, columnIndex];}}
},
/*** 计算列坐标信息* data 单元格所在行数据* index 当前下标* nextIndex 下一个元素坐标* count 相同内容的数量* maxLength 当前行的列总数*/
onColIndex(data, index, nextIndex, count, maxLength) {// 比较当前单元格中的数据与同一行之后的单元格是否相同if (nextIndex < maxLength && data[this.mergeCols[index]['name']] === data[this.mergeCols[nextIndex]['name']]) {return this.onColIndex(data, index, ++nextIndex, ++count, maxLength);}return count;
},
/*** 计算行坐标信息* data 表格总数据* index 当前下标* nextIndex 下一个元素坐标* count 相同内容的数量* name 数据的key*/
onRowIndex(data, index, nextIndex, count, name) {// 比较当前单元格中的数据与同一列之后的单元格是否相同if (nextIndex < data.length && data[index][name] === data[nextIndex][name]) {return this.onRowIndex(data, index, ++nextIndex, ++count, name);}return count;
}

数据处理好之后就可以调用objectSpanMethods方法了,如下:

objectSpanMethods({ row, column, rowIndex, columnIndex }) {let key = columnIndex + '_' + rowIndex;if (this.tableMergeIndex[key]) {return this.tableMergeIndex[key];}
}

6:效果图

 7:合并行列的完整代

<template><div class="table"><el-table :data="tableData" :span-method="objectSpanMethods" border style="width: 100%"><template v-for="cols in colConfigs"><!-- 无需合并的列 --><el-table-columnv-if="cols.type === 'label' && !cols.children":key="cols.prop":prop="cols.prop":label="cols.label"></el-table-column><!-- 需要合并的列 --><template v-else-if="cols.type === 'label' && cols.children"><el-table-columnv-for="children in cols.children":key="children.prop":prop="children.prop":label="children.label"/></template></template></el-table></div>
</template><script>
export default {name: 'Table',data() {return {tableData: [{ time: '2020-08-10', grade: '三年二班', name: '小明', subjects: '语文', score: 80 },{ time: '2020-08-10', grade: '三年二班', name: '小明', subjects: '数学', score: 80 }, { time: '2020-08-10', grade: '总成绩', name: '总成绩', subjects: '总成绩', score: 160 },{ time: '2020-08-10', grade: '三年一班', name: '小雷', subjects: '语文', score: 70 },{ time: '2020-08-10', grade: '三年一班', name: '小雷', subjects: '数学', score: 80 },{ time: '2020-08-10', grade: '总成绩', name: '总成绩', subjects: '总成绩', score: 150 }, { time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '语文', score: 60 }, { time: '2020-08-11', grade: '三年三班', name: '小花', subjects: '数学', score: 60 }, { time: '2020-08-11', grade: '总成绩', name: '总成绩', subjects: '总成绩', score: 120 }],// 表格的信息 需要合并的需要放在 children 中colConfigs: [{type: 'label',children: [{ prop: 'time', label: '时间' },{ prop: 'grade', label: '年级' },{ prop: 'name', label: '姓名' },{ prop: 'subjects', label: '科目' },{ prop: 'score', label: '成绩' }]},// { type: 'label', prop: 'age', label: '年龄' }],// 需要合并的行列信息 index必须是table表格对应的下标 不能随意修改mergeCols: [{ index: 0, name: 'time' },{ index: 1, name: 'grade' },{ index: 2, name: 'name' },{ index: 3, name: 'subjects' },{ index: 4, name: 'score' },// { index: 5, name: 'age' }],// 用来记录每一个单元格的下标tableMergeIndex: [],};},methods: {objectSpanMethods({ row, column, rowIndex, columnIndex }) {let key = columnIndex + '_' + rowIndex;if (this.tableMergeIndex[key]) {return this.tableMergeIndex[key];}},newTableMergeData() {for (let i = 0; i < this.tableData.length; i++) {for (let j = 0; j < this.mergeCols.length; j++) {// 初始化行、列坐标信息let rowIndex = 1;let columnIndex = 1;// 比较横坐标左方的第一个元素if (j > 0 && this.tableData[i][this.mergeCols[j]['name']] === this.tableData[i][this.mergeCols[j - 1]['name']]) {columnIndex = 0;}// 比较纵坐标上方的第一个元素if (i > 0 && this.tableData[i][this.mergeCols[j]['name']] === this.tableData[i - 1][this.mergeCols[j]['name']]) {rowIndex = 0;}// 比较横坐标右方元素if (columnIndex > 0) {columnIndex = this.onColIndex(this.tableData[i],j,j+1,1,this.mergeCols.length);}// 比较纵坐标下方元素if (rowIndex > 0) {rowIndex = this.onRowIndex(this.tableData,i,i+1,1,this.mergeCols[j]['name']);}let key = this.mergeCols[j]['index'] + '_' + i;this.tableMergeIndex[key] = [rowIndex, columnIndex];}}},/*** 计算列坐标信息* data 单元格所在行数据* index 当前下标* nextIndex 下一个元素坐标* count 相同内容的数量* maxLength 当前行的列总数*/onColIndex(data, index, nextIndex, count, maxLength) {// 比较当前单元格中的数据与同一行之后的单元格是否相同if (nextIndex < maxLength && data[this.mergeCols[index]['name']] === data[this.mergeCols[nextIndex]['name']]) {return this.onColIndex(data, index, ++nextIndex, ++count, maxLength);}return count;},/*** 计算行坐标信息* data 表格总数据* index 当前下标* nextIndex 下一个元素坐标* count 相同内容的数量* name 数据的key*/onRowIndex(data, index, nextIndex, count, name) {// 比较当前单元格中的数据与同一列之后的单元格是否相同if (nextIndex < data.length && data[index][name] === data[nextIndex][name]) {return this.onRowIndex(data,index,++nextIndex,++count,name);}return count;}},mounted() {if(this.mergeCols.length > 0) {this.newTableMergeData();}}
};
</script><style lang="stylus" scoped>
.table height 100vhwidth 100%padding 40pxbox-sizing border-box/deep/ .el-table__body tr:hover > tdbackground-color: #fff;
</style>

三:兼容

如果不想合并的行需要在colConfigs中调整,如下:

前言:需要做的调整

// 增加一个年龄属性 但是不进行合并
colConfigs: [{type: 'label',children: [{ prop: 'time', label: '时间' },{ prop: 'grade', label: '年级' },{ prop: 'name', label: '姓名' },{ prop: 'subjects', label: '科目' },{ prop: 'score', label: '成绩' }]},{ type: 'label', prop: 'age', label: '年龄' }
]

1:效果图

 2: 如果想要合并,需要在mergeCols中添加数据:

mergeCols: [{ index: 0, name: 'time' },{ index: 1, name: 'grade' },{ index: 2, name: 'name' },{ index: 3, name: 'subjects' },{ index: 4, name: 'score' },{ index: 5, name: 'age' } // 添加需要合并的age列信息 注意index的值
],

3:新添加的属性合并后效果图

 

另:单纯的行合并

 data{return {spanArr: [],position: 0,}
}   rowspan(data) {this.spanArr=[];data.forEach((item,index) => {if( index === 0){this.spanArr.push(1);this.position = 0;}else{if(data[index].FId === data[index-1].FId ){this.spanArr[this.position] += 1;this.spanArr.push(0);}else{this.spanArr.push(1);this.position = index;}}})},objectSpanMethod({ row, column, rowIndex, columnIndex }) {if (columnIndex === 0||columnIndex === 1) {const _row = this.spanArr[rowIndex];const _col = _row>0 ? 1 : 0;return {rowspan: _row,colspan: _col}}},

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

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

相关文章

升级Go 版本到 1.19及以上,Goland: file.Close() 报错: Unresolved reference ‘Close‘

错误截图 解决方法 File -> Settings -> Go -> Build Tags & Vendoring -> Custom tags -> 添加值 “unix” 原因 Go 1.19 引入了unix构建标签。因此&#xff0c;需要添加unix到自定义标签。 参考 https://blog.csdn.net/weixin_43940592/article/det…

any、unknown、never 和 void区别

any 类型&#xff1a; any 类型是 TypeScript 中的顶级类型&#xff0c;它可以接受任何类型的值&#xff0c;相当于取消了类型检查。 当将变量声明为 any 类型时&#xff0c;可以赋予它任何值&#xff0c;无论是数字、字符串、布尔值还是其他类型的值。 使用 any 类型可能会降…

MySql增量恢复

一、 使用二进制日志的时间点恢复 注意 本节和下一节中的许多示例都使用mysql客户端来处理mysqlbinlog生成的二进制日志输出。如果您的二进制日志包含\0&#xff08;null&#xff09;字符&#xff0c;那么mysql将无法解析该输出&#xff0c;除非您使用--binary模式选项调用它。…

高速收费站的智慧之选,工控机助力顺畅通行!

2020年初取消高速公路省界收费站后&#xff0c;全国高速公路进入“一张网运行、一体化服务”的新阶段。随着ETC用户量快速增长、驾乘人员对收费站高效通行需求不断提升&#xff0c;收费数据在线化运营及精准化、智能化、人性化的收费服务将成为主流。如何提高收费系统集成度、降…

软考高级系统架构设计师系列论文八十五:论软件产品线技术

软考高级系统架构设计师系列论文八十五:论软件产品线技术 一、摘要二、正文三、总结一、摘要 根据“十五”国防科技重点实验室—“机载XXPD火控雷达性能开发与评估实验室”的建设需求。我所在的中国x集团公司x所电子对抗研究部组织了用于该实验室目布式联网试验,主要任务是试…

h5逻辑_调用手机拨号功能

有时点击页面某个按钮&#xff0c;希望能掉起手机拨号页&#xff0c;实现步骤如下&#xff1a; [1] 在index.html中添加如下代码<meta name"format-detection" content"telephoneyes" />[2] 点击按钮调用函数callPhone (phoneNumber) {window.locat…

Java与Modbus-TCP/IP网络通讯

1.需求样例 举例5&#xff1a;浮点数参数读取&#xff08;读取温度测量值&#xff09;查看参数列表&#xff0c;温度测量值地址为320&#xff0c;根据Modbus协议&#xff0c;读取参数地址转换为16进制为&#xff1a;00H A0H&#xff0c;读取长度为2个字&#xff1a;00H 02H。 …

腾讯云服务器价格表大全_轻量服务器_CVM云服务器报价明细

腾讯云服务器租用费用表&#xff1a;轻量应用服务器2核2G4M带宽112元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、云服务器CVM S5实例2核2G配置280.8元一年、GPU服务器GN10Xp实例145元7天&#xff0c;腾讯云服务器网长期更新腾讯云轻量…

在Ubuntu上启动一个简单的用户登录接口服务

一个简单的用户登录接口 我使用 Python 和 Flask 框架来创建这个接口 首先&#xff0c;确保你已经安装了 Python 和 Flask。如果没有安装&#xff0c;可以通过以下命令在 Ubuntu 上安装&#xff1a; sudo apt update sudo apt install python3 python3-pip pip3 install Fla…

KASLR 内核随机地址配置开启

CONFIG_RANDOMIZE_BASE kernel features ---> Randomize of module region independently from the core kernel 参考链接&#xff1a;KASLR 内核动态地址 - kk Blog —— 通用基础 (abcdxyzk.github.io)

5G网关如何提升智慧乡村农业生产效率

得益于我国持续推进5G建设&#xff0c;截至今年5月&#xff0c;我国5G基站总数已达284.4万个&#xff0c;覆盖全国所有地级市、县城城区和9成以上的乡镇镇区&#xff0c;实现“镇镇通5G”&#xff0c;全面覆盖了从城市到农村的延伸。 依托5G网络的技术优势&#xff0c;智慧乡村…

5.6.webrtc三大线程

那今天呢&#xff1f;我们来介绍一下web rtc的三大线程&#xff0c;那为什么要介绍这三大线程呢&#xff1f;最关键的原因在于web rtc的所有其他线程都是由这三大线程所创建的。那当我们将这三个线程理解清楚之后呢&#xff1f;我们就知道其他线程与它们之间是怎样关系&#xf…

机器学习之Adam(Adaptive Moment Estimation)自适应学习率

Adam&#xff08;Adaptive Moment Estimation&#xff09;是一种常用的优化算法&#xff0c;特别适用于训练神经网络和深度学习模型。它是一种自适应学习率的优化算法&#xff0c;可以根据不同参数的梯度信息来动态调整学习率&#xff0c;以提高训练的效率和稳定性。 Adam算法…

如何提取视频的音频到手机?这个音频提取方法很简单

提取视频中的音频可以帮助您获得视频的声音部分&#xff0c;而无需观看整个视频。这对于那些只想听视频的声音或想将视频的声音与其他音频内容混合使用的人来说非常方便。此外&#xff0c;提取音频也可以为需要创建音频剪辑或混音的音频制作者提供帮助。那么怎么提取呢&#xf…

Java接入支付宝支付

本文只接入了支付宝中的APP支付&#xff0c;如果要拓展更多支付方式的的话&#xff0c;请看文末补充 项目支付流程 前端发起创建订单请求后端接受请求创建订单&#xff0c;并将订单参数进行支付宝对应签名并返回前端拿到签名后调起支付宝支付 本文主要写的就是2的过程 前期准…

报名倒计时!| 基于RflySim平台飞控底层算法开发专题培训(第二期)

RflySim 暑期学校 飞思实验室“基于RflySim平台飞控底层算法开发”系列专题培训第二期开启报名了&#xff01;专题培训由戴训华副教授以及飞思实验室学生&工程师团队主讲&#xff0c;采用“线上线下”集中授课形式&#xff0c;培训时间为8月28日-9月3日&#xff1b;课程内…

基于XL32F003单片机的可控硅调光方案

可控硅调光是一种用于调节电源输出电压的技术&#xff0c;被广泛应用于各种场景。它主要通过改变波形的导通角度来调节输出电压的大小&#xff0c;从而实现对照明设备亮度的控制。在照明市场占据了很大的调光市场。 可控硅调光的兼容性强&#xff0c;应用范围广。例如&#xff…

2023科隆游戏展:虚幻5游戏百花齐放,云渲染助力虚幻5高速渲染

8月23日&#xff0c;欧洲权威级游戏展示会——科隆游戏展拉开帷幕。今年的参展游戏也相当给力&#xff0c;数十款游戏新预告片在展会上公布&#xff0c;其中有不少游戏使用虚幻5引擎制作&#xff0c;开创了游戏开发新纪元。 虚幻5游戏百花齐放&#xff0c;渲染堪比电影级效果 …

数学软件和编程环境Mathematica 13 「mac」

Mathematica 13是一种强大的计算机代数系统和编程环境&#xff0c;它提供了广泛的数学功能和符号计算能力&#xff0c;可以进行高级数值计算、数据分析、可视化和模拟等任务。 Mathematica使用自己的独特的程序语言&#xff0c;称为Wolfram语言&#xff0c;它结合了函数式编程、…

Kotlin 中的 设计模式

单例模式 饿汉模式 饿汉模式在类初始化的时候就创建了对象&#xff0c;所以不存在线程安全问题。 局限性&#xff1a; 1、如果构造方法中有耗时操作的话&#xff0c;会导致这个类的加载比较慢&#xff1b; 2、饿汉模式一开始就创建实例&#xff0c;但是并没有调用&#xf…