应无所住,而生其心
排名
1
文章
861
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue-element-admin左边树形,右边格子的布局。vue element ui模板。树形tree 动态自适应屏幕高度

8020人阅读 2021/12/23 17:19 总访问:5231987 评论:0 收藏:0 手机
分类: 前端

效果如下:

代码如下:

  1. <template>
  2. <div class="app-container student-archives">
  3. <div style="display: flex">
  4. <el-card class="box-card" style="width: 300px; margin-right: 10px">
  5. <!-- <div slot="header" class="clearfix"><span>&nbsp;</span></div> -->
  6. <el-scrollbar style="height: 640px">
  7. <el-tree
  8. ref="tree"
  9. :data="treeData"
  10. node-key="id"
  11. :expand-on-click-node="false"
  12. highlight-current
  13. @node-click="nodeClick"
  14. ></el-tree>
  15. </el-scrollbar>
  16. </el-card>
  17. <el-card class="box-card" style="flex: 1">
  18. <div class="clearfix">
  19. <div style="flex: 1" />
  20. <el-input placeholder="请输入档案" />
  21. <el-button type="primary">搜索</el-button>
  22. </div>
  23. <el-row :gutter="20" style="margin-top: 10px">
  24. <el-col
  25. v-for="(item, index) in iconList"
  26. :key="index"
  27. :lg="3"
  28. :md="3"
  29. :sm="6"
  30. :xl="3"
  31. :xs="12"
  32. >
  33. <vab-card class="icon-panel" shadow="hover">
  34. <vab-icon :icon="item.icon" :style="{ color: item.color }" />
  35. <p>我是档案</p>
  36. </vab-card>
  37. </el-col>
  38. <!-- <vab-draggable
  39. v-model="iconList"
  40. v-bind="dragOptions"
  41. item-key="icon"
  42. style="position: relative; display: flex; flex-wrap: wrap"
  43. >
  44. <template #item="{ element: item }">
  45. <el-col :lg="3" :md="3" :sm="6" :xl="3" :xs="12">
  46. <vab-card class="icon-panel" shadow="hover">
  47. <vab-icon :icon="item.icon" :style="{ color: item.color }" />
  48. <p>按住拖拽</p>
  49. </vab-card>
  50. </el-col>
  51. </template>
  52. </vab-draggable> -->
  53. </el-row>
  54. </el-card>
  55. </div>
  56. </div>
  57. </template>
  58. <script>
  59. import { getIconList } from '@/api/remixIcon'
  60. export default {
  61. // 组件名字
  62. name: 'ArchivesManager',
  63. data() {
  64. return {
  65. courseID: '',
  66. labId: '',
  67. iconList: [],
  68. treeData: [
  69. {
  70. label: '人事档案',
  71. children: [
  72. {
  73. label: '初始档案',
  74. children: [
  75. {
  76. label: '2019',
  77. },
  78. {
  79. label: '2020',
  80. },
  81. {
  82. label: '2021',
  83. },
  84. ],
  85. },
  86. {
  87. label: '简化档案',
  88. children: [
  89. {
  90. label: '简化一版',
  91. },
  92. {
  93. label: '简化二版',
  94. },
  95. {
  96. label: '简化三版',
  97. },
  98. ],
  99. },
  100. ],
  101. },
  102. {
  103. label: '合同档案',
  104. children: [
  105. {
  106. label: '二级 2-1',
  107. children: [
  108. {
  109. label: '三级 2-1-1',
  110. },
  111. ],
  112. },
  113. {
  114. label: '二级 2-2',
  115. children: [
  116. {
  117. label: '三级 2-2-1',
  118. },
  119. ],
  120. },
  121. ],
  122. },
  123. {
  124. label: '会计档案',
  125. children: [
  126. {
  127. label: '二级 3-1',
  128. children: [
  129. {
  130. label: '三级 3-1-1',
  131. },
  132. ],
  133. },
  134. {
  135. label: '二级 3-2',
  136. children: [
  137. {
  138. label: '三级 3-2-1',
  139. },
  140. ],
  141. },
  142. ],
  143. },
  144. ],
  145. }
  146. },
  147. mounted() {
  148. this.initPic()
  149. },
  150. // 组件方法
  151. methods: {
  152. // randomHexColor() {
  153. // return _.shuffle([
  154. // '#1890FF',
  155. // '#36CBCB',
  156. // '#4ECB73',
  157. // '#FBD437',
  158. // '#F2637B',
  159. // '#975FE5',
  160. // ])
  161. // },
  162. randomHexColor() {
  163. return '#1890FF'
  164. },
  165. dragOptions() {
  166. return {
  167. animation: 600,
  168. group: 'description',
  169. disabled: false,
  170. ghostClass: 'ghost',
  171. }
  172. },
  173. initPic() {
  174. //测试数据
  175. const list = [
  176. '24-hours-fill',
  177. '24-hours-line',
  178. '4k-fill',
  179. '4k-line',
  180. 'a-b',
  181. 'account-box-fill',
  182. 'account-box-line',
  183. 'account-circle-fill',
  184. 'account-circle-line',
  185. 'account-pin-box-fill',
  186. 'account-pin-box-line',
  187. 'account-pin-circle-fill',
  188. 'account-pin-circle-line',
  189. 'add-box-fill',
  190. 'add-box-line',
  191. ]
  192. let my = this
  193. this.iconList = list
  194. //.filter((icon) => icon.includes('-line'))
  195. .map((icon, index) => {
  196. return { icon, color: my.randomHexColor(), order: index + 1 }
  197. })
  198. console.log(this.iconList)
  199. },
  200. },
  201. }
  202. </script>
  203. <style scoped="scoped">
  204. .custom-tree-node {
  205. display: flex;
  206. flex: 1;
  207. align-items: center;
  208. justify-content: space-between;
  209. padding-right: 8px;
  210. font-size: 14px;
  211. }
  212. .el-input {
  213. width: 200px;
  214. margin-right: 10px;
  215. }
  216. .clearfix {
  217. display: flex;
  218. }
  219. </style>
  220. <style lang="scss">
  221. .student-archives {
  222. .el-scrollbar__wrap {
  223. overflow-x: hidden;
  224. }
  225. .el-tree-node__content {
  226. height: 40px;
  227. }
  228. }
  229. .vab-app-main {
  230. padding: 0px !important;
  231. }
  232. </style>

右边的宽度比例可以自己调,上面的效果是写的自适应的,看官网的element ui文档就知道了,element ui布局是分的24份,响应式布局有五个响应尺寸:xs、sm、md、lg 和 xl,我这里是适配的lg的3分,也就是3/24,也就是1/8,也就是一行占8份

  1. <el-col
  2. v-for="(item, index) in iconList"
  3. :key="index"
  4. :lg="3"
  5. :md="3"
  6. :sm="6"
  7. :xl="3"
  8. :xs="12"
  9. >

如果我们不要自适应布局,就想保持一行放2块的话,一块就是占用24份的一半就是12份就行了,设置:span=”12”。el-row的gutter属性是用来设置间隔的,比如这里的:gutter=”20”就是两个块之间间隔20个像素

  1. <el-row :gutter="20" style="margin-top: 10px">
  2. <el-col v-for="(item, index) in iconList" :key="index" :span="12">
  3. <vab-card class="icon-panel" shadow="hover">
  4. <vab-icon :icon="item.icon" :style="{ color: item.color }" />
  5. <p>我是档案</p>
  6. </vab-card>
  7. </el-col>
  8. </el-row>

官方的布局文档:https://element.eleme.io/#/zh-CN/component/layout

vue3中得写法

  1. <template>
  2. <div class="app-container student-archives">
  3. <div style="display: flex">
  4. <el-card class="box-card" style="width: 300px; margin-right: 10px">
  5. <!-- <div slot="header" class="clearfix"><span>&nbsp;</span></div> -->
  6. <el-scrollbar style="height: 640px">
  7. <el-tree
  8. ref="tree"
  9. :data="treeData"
  10. node-key="id"
  11. default-expand-all
  12. :expand-on-click-node="false"
  13. highlight-current
  14. @node-click="nodeClick"
  15. ></el-tree>
  16. </el-scrollbar>
  17. </el-card>
  18. <el-card class="box-card" style="flex: 1">
  19. <div class="clearfix">
  20. <div style="flex: 1" />
  21. <el-input placeholder="请输入档案" />
  22. <el-button type="primary">搜索</el-button>
  23. </div>
  24. <el-row :gutter="20" style="margin-top: 10px">
  25. <el-col
  26. v-for="(item, index) in iconList"
  27. :key="index"
  28. :lg="12"
  29. :md="12"
  30. :xl="8"
  31. >
  32. <vab-card class="icon-panel" shadow="hover">
  33. <vab-icon :icon="item.icon" :style="{ color: item.color }" />
  34. <p>我是档案</p>
  35. </vab-card>
  36. </el-col>
  37. <!-- <vab-draggable
  38. v-model="iconList"
  39. v-bind="dragOptions"
  40. item-key="icon"
  41. style="position: relative; display: flex; flex-wrap: wrap"
  42. >
  43. <template #item="{ element: item }">
  44. <el-col :lg="3" :md="3" :sm="6" :xl="3" :xs="12">
  45. <vab-card class="icon-panel" shadow="hover">
  46. <vab-icon :icon="item.icon" :style="{ color: item.color }" />
  47. <p>按住拖拽</p>
  48. </vab-card>
  49. </el-col>
  50. </template>
  51. </vab-draggable> -->
  52. </el-row>
  53. </el-card>
  54. </div>
  55. </div>
  56. </template>
  57. <script>
  58. import { doEdit, getArchivesTypeGroup } from '@/api/archivesType'
  59. export default defineComponent({
  60. name: 'ArchivesManager',
  61. setup(props, { emit }) {
  62. const $baseMessage = inject('$baseMessage')
  63. const state = reactive({
  64. iconList: [],
  65. treeData: [
  66. {
  67. label: '人事档案',
  68. children: [
  69. {
  70. label: '初始档案',
  71. children: [
  72. {
  73. label: '2019',
  74. },
  75. {
  76. label: '2020',
  77. },
  78. {
  79. label: '2021',
  80. },
  81. ],
  82. },
  83. {
  84. label: '简化档案',
  85. children: [
  86. {
  87. label: '简化一版',
  88. },
  89. {
  90. label: '简化二版',
  91. },
  92. {
  93. label: '简化三版',
  94. },
  95. ],
  96. },
  97. ],
  98. },
  99. {
  100. label: '合同档案',
  101. children: [
  102. {
  103. label: '二级 2-1',
  104. children: [
  105. {
  106. label: '三级 2-1-1',
  107. },
  108. ],
  109. },
  110. {
  111. label: '二级 2-2',
  112. children: [
  113. {
  114. label: '三级 2-2-1',
  115. },
  116. ],
  117. },
  118. ],
  119. },
  120. {
  121. label: '会计档案',
  122. children: [
  123. {
  124. label: '二级 3-1',
  125. children: [
  126. {
  127. label: '三级 3-1-1',
  128. },
  129. ],
  130. },
  131. {
  132. label: '二级 3-2',
  133. children: [
  134. {
  135. label: '三级 3-2-1',
  136. },
  137. ],
  138. },
  139. ],
  140. },
  141. ],
  142. })
  143. const randomHexColor = async () => {
  144. return '#1890FF'
  145. }
  146. const fetchData = async () => {
  147. // const {
  148. // data: { list },
  149. // } = await getArchivesTypeGroup()
  150. // state.treeData = list
  151. }
  152. const getArchives = async () => {
  153. //测试数据
  154. const list = [
  155. '24-hours-fill',
  156. '24-hours-line',
  157. '4k-fill',
  158. '4k-line',
  159. 'a-b',
  160. 'account-box-fill',
  161. 'account-box-line',
  162. 'account-circle-fill',
  163. 'account-circle-line',
  164. 'account-pin-box-fill',
  165. 'account-pin-box-line',
  166. 'account-pin-circle-fill',
  167. 'account-pin-circle-line',
  168. 'add-box-fill',
  169. 'add-box-line',
  170. ]
  171. state.iconList = list
  172. //.filter((icon) => icon.includes('-line'))
  173. .map((icon, index) => {
  174. return { icon, color: randomHexColor(), order: index + 1 }
  175. })
  176. }
  177. onMounted(() => {
  178. fetchData()
  179. getArchives()
  180. })
  181. return {
  182. ...toRefs(state),
  183. }
  184. },
  185. })
  186. </script>
  187. <style scoped="scoped">
  188. .custom-tree-node {
  189. display: flex;
  190. flex: 1;
  191. align-items: center;
  192. justify-content: space-between;
  193. padding-right: 8px;
  194. font-size: 14px;
  195. }
  196. .el-input {
  197. width: 200px;
  198. margin-right: 10px;
  199. }
  200. .clearfix {
  201. display: flex;
  202. }
  203. </style>
  204. <style lang="scss">
  205. .student-archives {
  206. .el-scrollbar__wrap {
  207. overflow-x: hidden;
  208. }
  209. .el-tree-node__content {
  210. height: 40px;
  211. }
  212. }
  213. .vab-app-main {
  214. padding: 0px !important;
  215. }
  216. </style>

vue3版本看这个,上面那个好像直接复制进去有点问题了

  1. <template>
  2. <div class="course-module-settings-container student-archives">
  3. <div style="display: flex">
  4. <el-card class="box-card" style="width: 300px; margin-right: 10px">
  5. <el-scrollbar style="height: 640px">
  6. <el-tree ref="tree" :data="state.treeData" node-key="id" :expand-on-click-node="false" highlight-current></el-tree>
  7. </el-scrollbar>
  8. </el-card>
  9. <el-card class="box-card" style="flex: 1">
  10. <div class="clearfix">
  11. <div style="flex: 1" />
  12. <el-input placeholder="请输入档案" />
  13. <el-button type="primary">搜索</el-button>
  14. </div>
  15. <el-row :gutter="20" style="margin-top: 10px">
  16. <el-col v-for="(item, index) in state.iconList" :key="index" :lg="3" :md="3" :sm="6" :xl="3" :xs="12">
  17. <vab-card class="icon-panel" shadow="hover">
  18. <vab-icon :icon="item.icon" :style="{ color: item.color }" />
  19. <p>我是档案</p>
  20. </vab-card>
  21. </el-col>
  22. </el-row>
  23. </el-card>
  24. </div>
  25. </div>
  26. </template>
  27. <script setup lang="ts" name="courseModuleSettings">
  28. import { defineAsyncComponent, reactive, onMounted, toRefs, ref } from 'vue';
  29. const state = reactive({
  30. title: '更新',
  31. iconList: [],
  32. treeData: [
  33. {
  34. label: '人事档案',
  35. children: [
  36. {
  37. label: '初始档案',
  38. children: [
  39. {
  40. label: '2019',
  41. },
  42. {
  43. label: '2020',
  44. },
  45. {
  46. label: '2021',
  47. },
  48. ],
  49. },
  50. {
  51. label: '简化档案',
  52. children: [
  53. {
  54. label: '简化一版',
  55. },
  56. {
  57. label: '简化二版',
  58. },
  59. {
  60. label: '简化三版',
  61. },
  62. ],
  63. },
  64. ],
  65. },
  66. {
  67. label: '合同档案',
  68. children: [
  69. {
  70. label: '二级 2-1',
  71. children: [
  72. {
  73. label: '三级 2-1-1',
  74. },
  75. ],
  76. },
  77. {
  78. label: '二级 2-2',
  79. children: [
  80. {
  81. label: '三级 2-2-1',
  82. },
  83. ],
  84. },
  85. ],
  86. },
  87. {
  88. label: '会计档案',
  89. children: [
  90. {
  91. label: '二级 3-1',
  92. children: [
  93. {
  94. label: '三级 3-1-1',
  95. },
  96. ],
  97. },
  98. {
  99. label: '二级 3-2',
  100. children: [
  101. {
  102. label: '三级 3-2-1',
  103. },
  104. ],
  105. },
  106. ],
  107. },
  108. ],
  109. });
  110. onMounted(() => {});
  111. </script>
  112. <style scoped="scoped" lang="scss">
  113. .course-module-settings-container {
  114. padding: 15px;
  115. .el-input {
  116. width: 200px;
  117. margin-right: 10px;
  118. }
  119. .clearfix {
  120. display: flex;
  121. }
  122. }
  123. </style>
  124. <style lang="scss">
  125. .student-archives {
  126. .el-scrollbar__wrap {
  127. overflow-x: hidden;
  128. }
  129. .el-tree-node__content {
  130. height: 40px;
  131. }
  132. }
  133. </style>

vue3版本加上了一点动态自适应屏幕高度的

  1. <template>
  2. <div class="course-module-settings-container student-archives">
  3. <div style="display: flex">
  4. <el-card class="box-card" style="width: 300px; margin-right: 10px">
  5. <el-scrollbar :style="{height:state.contentHeight}">
  6. <el-tree ref="tree" :data="state.treeData" node-key="id" :expand-on-click-node="false" highlight-current></el-tree>
  7. </el-scrollbar>
  8. </el-card>
  9. <el-card class="box-card" style="flex: 1">
  10. <div class="clearfix">
  11. <div style="flex: 1" />
  12. <el-input placeholder="请输入档案" size="default" />
  13. <el-button type="primary" size="default">搜索</el-button>
  14. </div>
  15. <div>
  16. 其他内容...
  17. </div>
  18. </el-card>
  19. </div>
  20. </div>
  21. </template>
  22. <script setup lang="ts" name="courseModuleSettings">
  23. import { defineAsyncComponent, reactive, onMounted, toRefs, ref } from 'vue';
  24. const state = reactive({
  25. title: '更新',
  26. iconList: [],
  27. contentHeight:"150px",
  28. treeData: [
  29. {
  30. label: '人事档案',
  31. children: [
  32. {
  33. label: '初始档案',
  34. children: [
  35. {
  36. label: '2019',
  37. },
  38. {
  39. label: '2020',
  40. },
  41. {
  42. label: '2021',
  43. },
  44. ],
  45. },
  46. {
  47. label: '简化档案',
  48. children: [
  49. {
  50. label: '简化一版',
  51. },
  52. {
  53. label: '简化二版',
  54. },
  55. {
  56. label: '简化三版',
  57. },
  58. ],
  59. },
  60. ],
  61. },
  62. {
  63. label: '合同档案',
  64. children: [
  65. {
  66. label: '二级 2-1',
  67. children: [
  68. {
  69. label: '三级 2-1-1',
  70. },
  71. ],
  72. },
  73. {
  74. label: '二级 2-2',
  75. children: [
  76. {
  77. label: '三级 2-2-1',
  78. },
  79. ],
  80. },
  81. ],
  82. },
  83. {
  84. label: '会计档案',
  85. children: [
  86. {
  87. label: '二级 3-1',
  88. children: [
  89. {
  90. label: '三级 3-1-1',
  91. },
  92. ],
  93. },
  94. {
  95. label: '二级 3-2',
  96. children: [
  97. {
  98. label: '三级 3-2-1',
  99. },
  100. ],
  101. },
  102. ],
  103. },
  104. ],
  105. });
  106. onMounted(() => {
  107. autoHeight()
  108. // 让f12全屏的时候或者退出全屏的时候可以让高度跟着自适应变化
  109. window.addEventListener('resize', autoHeight);
  110. });
  111. const autoHeight = ()=>{
  112. // 动态调整高度
  113. state.contentHeight = window.innerHeight-(53+15+85)+"px"
  114. }
  115. </script>
  116. <style scoped="scoped" lang="scss">
  117. .course-module-settings-container {
  118. padding: 15px;
  119. .el-input {
  120. width: 200px;
  121. margin-right: 10px;
  122. }
  123. .clearfix {
  124. display: flex;
  125. }
  126. }
  127. </style>

自适应高度的原理看这个:https://www.tnblog.net/aojiancc2/article/details/8490


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

解决vue-element-admin 安装依赖失败问题

安装依赖失败百度找了一下是因为git权限的问题执行下面命令就可以了git config --global url.&quot;https://&quot;.instead...

vue-element-admin表头样式element table 设置表头颜色

在表格上增加:header-cell-style就行了&lt;el-table ref=&quot;multipleTable&quot; :data=&quot;tableData&quot; toolt...

vue-element-admin 常用表格与搜索栏界面搭配 element ui样式搭配模板

界面大概的样子:代码(下方有vue3中的写法):&lt;template&gt; &lt;divclass=&quot;app-container&quot;&gt; &lt;el-fo...

vue-element-admin左边树形右边表格的布局vue模板

大概的界面如下:代码:&lt;template&gt; &lt;divclass=&quot;app-container&quot;&gt; &lt;el-row:gutter=&quot;20&quot...

vue-element-admin api相关api配置vue-element-admin 统一配置api前缀

api请求的前缀是配置在env.xx文件里边env.development是本地环境,env.production这个文件配置的是正式环境这里可以看到默...

vue-element-admin 配置相关 关闭页面上的设置等

设置在:src目录下的settings.js配置文件,showSettings设置成false即可关闭页面上的设置其他设置module.exports={ title:...

vue-element-admin 全局样式

全局样式是在src下面的styles文件夹里边有些是在src下面的assets里边要看情况

vue-element-admin 获取环境变量的值

环境变量的定义定义在.env.development里边表示开发环境定义在.env.production里边表示线上环境 比如定义两个 VUE_APP_BA...

vue-element-admin vscode 配置 ESLint自动修复代码自动格式化代码

先找到eslint插件的扩展设置 然后找到settings.json中编辑,点击进去 然后把配置内容加进去:配置内容如下: // es...

element ui admin 如何点击按钮关闭当前菜单vue-element-admin关闭当前标签页编辑文章或者编写文章后返回上一页

核心代码如下: // 调用全局挂载的方法(vuex中封装的方法),关闭当前页 this.$store.dispatch(&quot;tagsView/del...

css弹性盒子flex布局

css弹性盒子由于版本不同浏览器问题造成了一些不同的写法display:flexbox;在google浏览器中如果使用下面的写法就不行displa...

可输入下拉文本框据输入动态加载数据 jquery-editable-select

用到一个jquery-editable-select的控件github地址:https://github.com/indrimuska/jquery-editable-select这个插件的原理是...

.net mvc分部页.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

css中单位pxemrem和vh/vw的理解

&gt;px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。em是相对长度单位。相对于当前对象内文本的字...

让IIS支持webp格式图片让IIS支持vtt格式iis设置mime类型iis配置支持的类型

webp格式图片可以让图片体积变小。也让下载图片变得更加困难一点 在线制作webp工具 https://www.upyun.com/webp?utm_mediu...