【自定义列表头】vue el-table表格自定义列显示隐藏,多级表头自定义列显示隐藏,自由搭配版本和固定列版本【注释详细】

前言 功能介绍

最近遇到一个功能,需要的是把表格的列可以配置,
用户可以根据自己想要看的数据来改变表头列显示哪些隐藏哪些。
于是我做了两个版本。第一个版本是自由搭配的。
就是提前顶号所有的列,然后自己可以拖拽到想要位置顺序。
也可以自己新增一个二级表头自定义一个名称把表头都拖进去组成多级表头表格。不过这种的毕竟复杂。
第二个版本就简单一些了,是固定的列,比如十列写好了,然后用户只能在这十列里面选择显示或隐藏哪些。
位置不能动,文字也不能动。就是单纯的显示隐藏列

效果图

外面的表格样子,点击右边的小齿轮开始设置
在这里插入图片描述
打开后是这样的。左边可以勾选需要的列,会添加到右边。然后右边可以拖拽到想要的顺序。也可以添加一个蓝色表头自定义名字,然后把黑色的拖进去组成一个多级表头的表格。
在这里插入图片描述
可以修改蓝色的表头名称
在这里插入图片描述

自由搭配版本视频演示

el-table自定义列显示隐藏自由搭配版本

代码

html部分

<el-table :data="tableDatas" border style="width: 100%" v-loading="loadings" :height="height"ref="configurationTable"><el-table-column v-for="(arrd,index) in headers" :key="Math.random()" :label="arrd.title"align="center" width='100' show-overflow-tooltip><!-- 有子级 --><el-table-column v-for="(arrd2,index2) in arrd.children" align="center" :label="arrd2.title"show-overflow-tooltip width='100' :key="Math.random()"><template slot-scope="{row, $index}"><span>{{row[arrd2.key]}}</span></template></el-table-column><!-- 无子级 --><template slot-scope="{row, $index}"><span>{{row[arrd.key]}}</span></template></el-table-column><el-table-column align="center" width="50"><template slot="header" slot-scope="scope"><i class="el-icon-setting" style="font-size:20px;cursor: pointer;color: #409EFF;"@click="createInfo"></i></template></el-table-column></el-table><!-- 组件:自定义表头(getherders是接受返回的表头,deflist是默认表头) --><dynamiccolumn ref="dynamic_column" @getherders="getherders" :deflist="defList"></dynamiccolumn>

data

defList:[{type: 'zdy',title: '基础数据',id:Math.random(),children: [{title: 'ID',key: 'id'}, {title: '姓名',key: 'name'}]},{title: '年龄',key: 'age'},{title: '性别',key: 'sex'},{title: '挂号量',key: 'ghl'},{title: '到诊量',key: 'dzl'},]

methods

// 初始化表头createInfo(){this.$refs.dynamic_column.createInfo(this.defList) //打开编辑列弹框},// 修改表头返回getherders(arr){this.headers=arr //表头列数据this.$nextTick(() => {this.$refs.configurationTable.doLayout(); // 解决表格错位});},

组件

简单说一下逻辑:
1,父页面通过createInfo初始化方法调用子组件弹框。并展示信息
2,子组件打开后调用方法getColumnConfig,获取到一个所有列的配置。然后展示在弹框内,并传一份给父组件表格
3,通过tree自带的拖拽事件实现表头列位置的移动,上面添加多级表头用来添加一个自定义的名称,比如你想要把几列放到某一个表头下面,这几列都属于基本信息,那我就可以新增一个蓝色的表头,点击他改名叫基础信息。然后把黑色表头都拖进去,就可以得到一个这种多级表头。

这里注意:
黑色只能拖到蓝色里面,黑色表头内不能嵌套表头
黑色表头的key对应后台的数据,所以要跟后台对好才行。这种自由搭配的写法需要互相配合,嫌麻烦的还是直接用下面的固定写法

<template><div><!-- 表格列配置 --><el-dialog title="配置表格列" :visible.sync="columnShow" width="60%"><el-row><el-col :span="16"><pstyle="text-align: center;color: #333;font-weight: bold;margin-bottom: 10px;">勾选需要展示的列</p><el-checkbox-group v-model="columnCheckList" @change="getCheckList"><el-checkbox:label="item.key"v-for="(item, index) in columnAll":key="'cols' + index"style="margin-bottom: 5px">{{ item.title }}</el-checkbox></el-checkbox-group><p style="margin-top: 20px; color: #999">使用方法:</p><p style="color: #999">1:左侧勾选需要的列</p><p style="color: #999">2:右侧可拖动到想要的位置和顺序</p><p style="color: #999">3:增加多级表头后会出现蓝色的自定义表头文字,可以点击修改名称,将黑色表头拖拽到蓝色内就是多级表头了</p><p style="color: #999">注:<span style="color: red;font-weight:bold">不要在黑色表头内嵌套表头</span>,表格数据根据黑色表头展示,二级表头不会显示数据</p></el-col><el-col :span="8" style="max-height: 500px; overflow: auto"><pstyle="text-align: center;color: #333;font-weight: bold;margin-bottom: 10px;">拖拽排列表头顺序</p><el-button@click="append2"size="mini"style="margin-left: 20px; margin-bottom: 10px"type="primary">增加多级表头</el-button><el-tree:data="data"node-key="id"default-expand-all:expand-on-click-node="false"draggable:props="defaultProps"><span class="custom-tree-node" slot-scope="{ node, data }"><span:style="{ color: data.type == 'zdy' ? '#409EFF' : '' }"@click="editNodeInfo(data)">{{ node.label }}</span><span><!-- <el-button type="text" size="mini" @click="() => append(data)">add</el-button> --><el-buttontype="text"size="mini"@click="() => remove(node, data)">删除</el-button></span></span></el-tree></el-col></el-row><span slot="footer" class="dialog-footer"><el-button @click="columnShow = false">取 消</el-button><el-button type="primary" @click="setUpColumn">确 定</el-button></span></el-dialog><!-- 编辑tree表头内容 --><el-dialog title="编辑内容" :visible.sync="columnShow2" width="400px"><div><el-input placeholder="请输入内容" v-model="input" clearable></el-input></div><span slot="footer" class="dialog-footer"><el-button @click="columnShow2 = false" size="mini">取 消</el-button><el-button type="primary" @click="setUpTitle" size="mini">确 定</el-button></span></el-dialog></div>
</template><script>
module.exports = {name: "test",props: ["deflist"],//默认数据data() {return {eid: "",input: "", //编辑多级菜单名称data: [], //tree//tree配置defaultProps: {children: "children",label: "title",},columnShow: false, //设置也弹框显示columnShow2: false, //编辑tree表头内容columnAll: [], //表头总列columnCheckList: [], //列勾选项columnCheckList2: [], //列勾选项2pxHeader: [], //排序表头copyTreeList: [], //备份tree};},mounted() {this.pxHeader = this.deflist;this.getColumnConfig();},methods: {// 初始化createInfo(e) {this.pxHeader = e;this.getColumnConfig(); //获取所有列数据this.columnShow = true;},// 添加节点append(data) {const newChild = {id: id++,title: "自定义表头",children: [],};console.log(data, "data");if (!data.children) {this.$set(data, "children", []);}data.children.push(newChild);},// 添加一个节点append2() {const newChild = {id: id++,title: "自定义表头" + id,type: "zdy",children: [],};this.data.unshift(newChild);},// 编辑节点信息editNodeInfo(e) {if (e.type == "zdy") {this.eid = e.id;this.input = e.title;this.columnShow2 = true;}},// 保存节点信息setUpTitle() {this.data.forEach((item) => {if (item.id && item.id == this.eid) {item.title = this.input;return;}if (item.children) {item.children.forEach((i) => {if (i.id && i.id == this.eid) {i.title = this.input;return;}});}});this.columnShow2 = false;},// 删除节点信息remove(node, data) {const parent = node.parent;const children = parent.data.children || parent.data;const index = children.findIndex((d) => d.id === data.id);children.splice(index, 1);//删除节点时把勾选项取消let ckIndex = this.columnCheckList.indexOf(data.key);if (ckIndex !== -1) {this.columnCheckList.splice(ckIndex, 1);this.columnCheckList2 = JSON.parse(JSON.stringify(this.columnCheckList));}if (data.type == "zdy") {this.columnCheckList = this.getAllId([], this.data);this.columnCheckList2 = JSON.parse(JSON.stringify(this.columnCheckList));}},// 创建节点domrenderContent(h, { node, data, store }) {return `<span class="custom-tree-node"><span>{node.label}</span><span><el-button size="mini" type="text" on-click={ () => this.append(data) }>Append</el-button><el-button size="mini" type="text" on-click={ () => this.remove(node, data) }>Delete</el-button></span></span>`;},// 筛选勾选列表头getCheckList(e) {// 筛选勾选中的列数据let result = this.columnAll.filter((item) => {if (e.length == 0) {return this.columnAll;} else {return e.some((curVal) => curVal === item.key);}});let arr = [];// 按顺序把列头排列e.forEach((item) => {result.forEach((i) => {if (item == i.key) {arr.push(i);}});});this.pxHeader = arr; //排序展示出来let chazhi = [...this.columnCheckList2].filter((x) =>[...e].every((y) => y != x)); //差值删除let chazhiDelete = [...e].filter((x) =>[...this.columnCheckList2].every((y) => y != x)); //差值新增// 有差值变动if (chazhi.length && this.columnCheckList2.indexOf(chazhi[0]) !== -1) {this.removeObjects(this.data, chazhi[0]);this.columnCheckList2 = e;} else {this.columnAll.forEach((item) => {if (item.key == chazhiDelete[0]) {this.data.push(item);}});this.columnCheckList2 = e;}},// 获取所有表头配置getColumnConfig() {http.get("group_data",{page: 1,limit: 1000,gid: 136,hospital_id: userinfo.hosId,},{headers: {hosId: userinfo.hospital_id,},}).then((res) => {this.columnAll = res.data.data.list;this.columnCheckList = [];this.columnCheckList2 = [];// 默认排序列配置//   this.pxHeader = [];let headers = JSON.parse(JSON.stringify(this.pxHeader)); //默认表头展示this.$emit("getherders", headers); //列配置传给父组件this.columnCheckList = this.getAllId([], this.pxHeader); //默认列勾选项this.columnCheckList2 = this.getAllId([], this.pxHeader); //默认列勾选项保存副本(用于后面比对)this.data = this.pxHeader; //默认tree展示结构});},// 设置表格列展示setUpColumn() {let headers = JSON.parse(JSON.stringify(this.data)); //表头展示if (this.filterObjects(headers, "zdy")) {this.$emit("getherders", headers); //列配置传给父组件this.columnShow = false; //关闭弹框} else {this.$message({type: "info",message: "黑色表头内不能嵌套其他表头!",});}},// 递归:获取所有key值getAllId(keys, dataList) {if (dataList && dataList.length) {for (let i = 0; i < dataList.length; i++) {keys.push(dataList[i].key);if (dataList[i].children) {keys = this.getAllId(keys, dataList[i].children);}}}return keys;},// 递归:找到对应数据删除removeObjects(arr, key) {// 数组不存在不执行if (!arr) {return;}// 遍历数组for (let i = 0; i < arr.length; i++) {// 检查当前对象是否符合条件if (arr[i].key == key) {// 删除当前对象arr.splice(i, 1);// 由于已经删除了一个对象,所以需要调整索引以避免跳过下一个对象i--;} else {// 如果当前对象不符合条件,则递归检查其子对象this.removeObjects(arr[i].children, key);}}},// 递归:判断黑色表头是否有子级filterObjects(arr, key) {// 数组不存在不执行if (!arr) {return;}// 遍历数组for (let i = 0; i < arr.length; i++) {let item=arr[i]// 条件:数据如果没有type字段并且还有子级的,代表是黑色表头但是嵌套了表头,不允许通过if (!item.type && item.children && item.children.length > 0) {return false;}if (item.children) {this.filterObjects(item.children, key);}}return true;},},
};
</script><style>
</style>

固定列,显示隐藏版本

效果图

外面表格的样子
在这里插入图片描述
打开组件弹框,左侧展示表头,右侧勾选表头,取消勾选就会隐藏列,然后保存就会返回表头到父组件上
在这里插入图片描述

固定搭配版本视频演示

el-table自定义列显示隐藏固定搭配版本

html页面代码

引入组件然后页面上显示 getherders是返回给你勾选过后的表头的。
后面children和label是配置组件内tree和表格显示的

<!-- 组件:表格自定义列 --><dynamiccolumnrole ref="dynamic_column_role" @getherders="getherders" :children="'children'" :label="'title'"></dynamiccolumnrole>

methods
这个方法就是调用组件内的方法并传入默认的表头数据

// 初始化表头createInfo() {this.$refs.dynamic_column_role.createInfo(this.headers) //打开编辑列弹框},

我的data默认数组结构,这里表头中id和isshow必须有,没有字段的,自行添加

headers: [{title: '基础数据',id: 7,isshow: true,children: [{id: 5,isshow: true,title: 'ID',key: 'id'}, {id: 6,isshow: true,title: '姓名',key: 'name'}]},{id: 1,isshow: true,title: '年龄',key: 'age'},{id: 2,isshow: true,title: '性别',key: 'sex'},{id: 3,isshow: true,title: '挂号量',key: 'ghl'},{id: 4,isshow: true,title: '到诊量',key: 'dzl'},],

组件代码

组件注释了,比较通俗易懂。
说一下注意点:使用这个组件,只需要引入他,然后当成组件使用就行
然后注意第一次默认传入一个表头,也就是你后端请求的表头。
然后这个表头结构里面需要有id和isshow这个字段(true是显示,false是隐藏),如果没有自行添加。

逻辑简单描述一下:通过tree展示表头的树形结构,然后通过勾选后的回调函数handleCheckChange监听到是取消还是勾选,然后通过递归找到对应id的数据给他isshow字段更改显示隐藏,表格中对应用v-if显示隐藏这个字段。通过itemKey变量更新表格数据显示。最后把表头数据返回给父组件,父组件表格也通过v-if控制显示隐藏

<template><div><!-- 表格列配置 --><el-dialog title="配置表格列" :visible.sync="columnShow" width="60%"><el-row><el-col :span="18"><pstyle="text-align: center;color: #333;font-weight: bold;margin-bottom: 10px;">表头展示(右侧取消勾选可隐藏表头)</p><div style="max-width: 100%; overflow: auto"><el-table:data="tableData"borderstyle="width: 100%"ref="configurationTable":key="itemKey"><template v-for="(arrd, index) in headers"><el-table-column:key="'yi' + index":label="arrd[label]"align="center"show-overflow-tooltipv-if="arrd.isshow"><template v-for="(arrd2, index2) in arrd[children]"><!-- 有子级 --><el-table-columnalign="center":label="arrd2[label]"show-overflow-tooltip:key="'er' + index2"v-if="arrd2.isshow"></el-table-column></template></el-table-column></template></el-table></div></el-col><el-col :span="6" style="max-height: 500px; overflow: auto"><pstyle="text-align: center;color: #333;font-weight: bold;margin-bottom: 10px;">自定义表头显示(勾选显示)</p><el-treeref="tree":data="data"node-key="id"default-expand-all:expand-on-click-node="false"show-checkbox:props="defaultProps"@check-change="handleCheckChange":default-checked-keys="defaultKeys"><span class="custom-tree-node" slot-scope="{ node, data }"><span>{{ node.label }}</span></span></el-tree></el-col></el-row><span slot="footer" class="dialog-footer"><el-button @click="columnShow = false">取 消</el-button><el-button type="primary" @click="setUpColumn">保存配置</el-button></span></el-dialog></div>
</template><script>
module.exports = {name: "column",props: {// tree节点和表格表头的子级的字段名children: {type: String,default() {return "children";},},// tree节点和表格表头的字段名label: {type: String,default() {return "title";},},},data() {return {itemKey: 0, //更新表格的keydefaultKeys: [], //默认选中tree勾选框tableData: [], //表格数据headers: [], //表头data: [], //tree//tree配置defaultProps: {children: this.children,label: this.label,},columnShow: false, //设置弹框};},methods: {// tree勾选handleCheckChange(data, checked, indeterminate) {// 取消勾选if (checked == false&&indeterminate==false) {this.getTreeItem(this.headers, data.id, false);}// 勾选if (checked == true) {this.getTreeItem(this.headers, data.id, true);}// 多级表头判断:子级全部为隐藏状态,父级也隐藏,自己存在显示状态,父级就显示this.headers.forEach(item => {if(item[this.children]){let num=1item[this.children].forEach(i=>{if(i.isshow==true){num=2}})if(num==1){this.getTreeItem(this.headers, item.id, false);}if (num==2) {this.getTreeItem(this.headers, item.id, true);}}});this.itemKey++; //更新表格,防止数据不更新},// 初始化createInfo(e) {this.headers = JSON.parse(JSON.stringify(e)); //传入默认表头this.data = JSON.parse(JSON.stringify(this.headers)); //默认tree展示结构this.defaultKeys = this.getAllIds([], e); //默认tree选中勾选this.columnShow = true; //打开弹框},// 设置表格列展示setUpColumn() {this.$emit("getherders", this.headers); //处理好的表头传给父级this.columnShow = false; //关闭弹框this.$message({message: "保存配置成功!",type: "success",});},// 递归:获取所有id值getAllIds(keys, dataList) {if (dataList && dataList.length) {for (let i = 0; i < dataList.length; i++) {if (dataList[i].isshow == true) {keys.push(dataList[i].id);}if (dataList[i].children) {keys = this.getAllIds(keys, dataList[i].children);}}}return keys;},// 递归:找到对应id数据修改字段为true或者falsegetTreeItem(data, id, bool) {data.map((item) => {if (item.id == id) {item.isshow = bool; // 结果赋值} else {if (item.children) {this.getTreeItem(item.children, id, bool);}}});},},
};
</script><style>
</style>

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

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

相关文章

html5 初步了解

1、html5 含义 简而言之&#xff0c;html5 其实就是新的一代html标准&#xff01; 2、html5的优缺点 优点 语义化html 增加了很多语义化的标签&#xff0c;让html结构更加清晰&#xff0c;更具可读性由于增加了很多语义化的标签&#xff0c;对SEO更加友好 缺点 其他主流浏…

SQL注入学习--GTFHub(布尔盲注+时间盲注+MySQL结构)

目录 布尔盲注 手工注入 笔记 Boolean注入 # 使用脚本注入 sqlmap注入 使用Burpsuite进行半自动注入 时间盲注 手工注入 使用脚本注入 sqlmap注入 使用Burpsuite进行半自动注入 MySQL结构 手工注入 sqlmap注入 笔记 union 联合注入&#xff0c;手工注入的一般步骤 …

【Mysql系列】Mysql基础篇

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

低代码编辑平台后台实现

背景 之前做过一个前端低代码编辑平台&#xff0c;可以实现简单的移动端页面组件拖拽编辑&#xff1a; https://github.com/li-car-fei/react-visual-design 最近基于C的oatpp框架实现了一下后台。使用oatpp框架做web后台开发时&#xff0c;发现按照官方的示例使用的话&#…

Babyk勒索病毒数据集恢复,计算机服务器中了babyk勒索病毒怎么办?

计算机网络技术的不断应用&#xff0c;为企业的生产运营提供了极大便利&#xff0c;网络技术的不断发展也带来了许多网络安全隐患&#xff0c;近期&#xff0c;云天数据恢复中心陆续接到许多企业的求助&#xff0c;企业的计算机服务器遭到了babyk勒索病毒的攻击&#xff0c;导致…

text/xml和application/xml

困惑 在http消息中&#xff0c;同样是传送xml信息&#xff0c;有的时候看到Content-Type的值是text/xml&#xff0c;有的时候值是application/xml&#xff0c;感到困惑。 例如&#xff0c;用Postman发送http消息给Tomcat中的基于JAX-WS的 web服务&#xff1a; 请求中传送了xm…

vue3基础学习(上)

##以前怎么玩的? ###MVC Model:Bean View:视图 Controller ##vue的ref reactive ref:必须是简单类型 reactive:必须不能是简单类型 ###创建一个Vue项目 npm init vuelatest ###生命周期 ###setup相关 ####Vue2的一些写法 -- options API ####Vue3的写法 组合式API Vu…

洗地机选购攻略,洗地机哪个品牌好?一篇教会你挑到好用的洗地机

随着国内生活水平的提高&#xff0c;智能清洁产品的呼声也越来越高&#xff0c;尤其是洗地机&#xff0c;可以说是国内各个品牌的洗地机铺天盖地而来&#xff0c;那么如何挑选洗地机成了很多新手的困惑&#xff0c;别着急&#xff0c;笔者今天就给大家讲讲洗地机! 一、购买洗地…

【Axure教程】滑动内容选择器

滑动内容选择器通常是一种用户界面组件&#xff0c;允许用户通过滑动手势在一组内容之间进行选择。这种组件可以在移动应用程序或网页中使用&#xff0c;以提供直观的图片选择体验。 那今天就教大家如何用中继器制作一个滑动内容选择器&#xff0c;我们会以滑动选择电影为案例…

HTML5学习系列之标题和正文、描述性信息

HTML5学习系列之标题和正文、描述性信息 标题和正文标题段落 描述性信息强调注解备选上下标术语代码预定义格式缩写词编辑提示引用引述换行显示修饰非文本注解 总结 标题和正文 标题 按语义轻重排列&#xff1a;h1\h2\h3\h4\h5\h6 <h1>诗词介绍</h1> <h2>…

外汇天眼:什么是非农?非农数据对外汇市场的重要性!

非农数据在外汇市场中扮演着何等关键的角色&#xff1f; 美国非农数据&#xff0c;简称“非农”&#xff0c;具体指排除农业部门、个体户和非盈利机构雇员后的就业相关数据&#xff0c;是反映美国经济实际就业和整体经济状况的关键指标。该数据由美国劳工部劳动统计局每月发布…

ExoPlayer架构详解与源码分析(8)——Loader

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

map和set的简易封装(纯代码)

RBTree.h #pragma once#include<iostream> #include<vector> using namespace std;enum colar { red,black };template<class T>//有效参数就一个 struct RBTreeNode {RBTreeNode(const T& data):_left(nullptr), _right(nullptr), _parent(nullptr)…

黑马点评回顾 redis实现共享session

文章目录 传统session缺点整体访问流程代码实现生成验证码登录 问题具体思路 传统session缺点 传统单体项目一般是把session存入tomcat&#xff0c;但是每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat&#xff0c;并且把自己的信息存放到第一台服务器…

免费的快速手机文件解压APP,快冲

各位小伙伴们大家好&#xff0c;今天我要介绍一款手机上必备的神奇工具&#xff01;你有没有经常遇到需要解压文件情况呢&#xff1f;还在为不知道用哪个软件而烦恼吗&#xff1f;别担心&#xff0c;我给你带来了解决方案 &#xff0c;就是这一款免费的解压精灵。 解压精灵是一…

【Nginx】使用nginx进行反向代理与负载均衡

使用场景 反向代理&#xff1a;一个网站由许多服务器承载的&#xff0c;网站只暴露一个域名&#xff0c;那么这个域名指向一个代理服务器ip&#xff0c;然后由这台代理服务器转发请求到网站负载的多台服务器中的一台处理。这就需要用到Nginx的反向代理实现了 负载均衡&#xf…

怎么去掉邮件内容中的回车符

上图是Outlook 截图&#xff0c;可见1指向的总有回车符&#xff1b; 故障原因&#xff1a; 不小心误按了箭头4这个选项&#xff1b; 解决方法&#xff1a; 点击2箭头确保tab展开&#xff1b; 点击3以找到箭头4. 取消勾选或者多次点击&#xff0c;即可解决。

单区域OSPF配置

配置命令步骤&#xff1a; 1.使用router ospf 进程ID编号 启用OSPF路由 2.使用network 直连网络地址 反掩码 area 0 将其归于区域0 注意&#xff1a;1.进程ID编号可任意&#xff08;1-65535&#xff09;2.反掩码用4个255相减得到 如下图&#xff0c;根据给出要求配置OSPF单区…

HT8313 D/AB切换 音频功率放大器

HT8313具有AB类和D类的自Y切换功能&#xff0c;在受到D类功放EMI干扰困扰时&#xff0c;可随时切换至AB类音频功放模式&#xff08;此时电荷泵升压功能关闭&#xff09;。 HT8313内部固定28dB增益&#xff0c;内置的关断功能使待机电流Z小化&#xff0c;还集成了输出端过流保护…

JavaEE进阶学习:Spring核心和设计思想

Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&#xff0c;有着活跃而庞大的社区&#xff0c;这就是它之所以能长久不衰的原因。Spring 支持广泛的应用场景&#xff0c;它可以让 Java 企业级…