当前位置:   article > 正文

自定义《element-UI》el-tree 的样式 、亲测管用_el-tree样式

el-tree样式

目录

 第一种 切换箭头打开和折叠 :

 第二种 修改箭头打开和折叠 + 动画:

 第三种 修改箭头打开和折叠 + 一二级自定义图标:

 第四种在el-tree前加复选框和图标

 第五种 Vue3 + ts 封装


ab2e230e8501412b9b9e7bedd2d0dc69.gif

第一种 切换箭头打开和折叠 :

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMC7mtLvlnKjpo47mtarph4w=,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div class="tree">
  3. <el-tree
  4. :data="data5"
  5. :props="props"
  6. show-checkbox
  7. node-key="id"
  8. default-expand-all
  9. >
  10. </el-tree>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. data() {
  16. return {
  17. props: {
  18. label: "label",
  19. children: "children",
  20. },
  21. data5: [
  22. {
  23. id: 1,
  24. label: "一级 1",
  25. icon: "el-icon-success",
  26. children: [
  27. {
  28. id: 4,
  29. label: "二级 1-1",
  30. children: [
  31. {
  32. id: 9,
  33. label: "三级 1-1-1",
  34. icon: "el-icon-info",
  35. },
  36. {
  37. id: 10,
  38. label: "三级 1-1-2",
  39. },
  40. ],
  41. },
  42. ],
  43. },
  44. {
  45. id: 2,
  46. label: "一级 2",
  47. children: [
  48. {
  49. id: 5,
  50. label: "二级 2-1",
  51. },
  52. {
  53. id: 6,
  54. label: "二级 2-2",
  55. },
  56. ],
  57. },
  58. {
  59. id: 3,
  60. label: "一级 3",
  61. children: [
  62. {
  63. id: 7,
  64. label: "二级 3-1",
  65. },
  66. {
  67. id: 8,
  68. label: "二级 3-2",
  69. },
  70. ],
  71. },
  72. ],
  73. };
  74. },
  75. };
  76. </script>
  77. <style lang="scss" scoped>
  78. ::v-deep .el-icon-caret-right:before {
  79. content: "y";
  80. font-size: 16px;
  81. }
  82. ::v-deep .expanded:before {
  83. content: "x";
  84. font-size: 16px;
  85. }
  86. </style>

 第二种 修改箭头打开和折叠 + 动画:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMC7mtLvlnKjpo47mtarph4w=,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div class="tree">
  3. <el-tree
  4. icon-class="user"
  5. :data="data5"
  6. :props="props"
  7. show-checkbox
  8. node-key="id"
  9. default-expand-all
  10. >
  11. <span class="custom-tree-node" slot-scope="{ node, data }">
  12. <span> <i :class="node.icon"></i>{{ node.label }} </span>
  13. </span>
  14. </el-tree>
  15. </div>
  16. </template>
  17. <script>
  18. export default {
  19. data() {
  20. return {
  21. props: {
  22. label: "label",
  23. children: "children",
  24. },
  25. data5: [
  26. {
  27. id: 1,
  28. label: "一级 1",
  29. icon: "el-icon-success",
  30. children: [
  31. {
  32. id: 4,
  33. label: "二级 1-1",
  34. children: [
  35. {
  36. id: 9,
  37. label: "三级 1-1-1",
  38. icon: "el-icon-info",
  39. },
  40. {
  41. id: 10,
  42. label: "三级 1-1-2",
  43. },
  44. ],
  45. },
  46. ],
  47. },
  48. {
  49. id: 2,
  50. label: "一级 2",
  51. children: [
  52. {
  53. id: 5,
  54. label: "二级 2-1",
  55. },
  56. {
  57. id: 6,
  58. label: "二级 2-2",
  59. },
  60. ],
  61. },
  62. {
  63. id: 3,
  64. label: "一级 3",
  65. children: [
  66. {
  67. id: 7,
  68. label: "二级 3-1",
  69. },
  70. {
  71. id: 8,
  72. label: "二级 3-2",
  73. },
  74. ],
  75. },
  76. ],
  77. };
  78. },
  79. };
  80. </script>
  81. <style lang="scss" scoped>
  82. /deep/.user {
  83. // background: url("../../assets/logo.png");
  84. background: url("../../assets/logo.png");
  85. box-sizing: border-box;
  86. background-size: 100%;
  87. background-repeat: no-repeat;
  88. }
  89. /deep/.el-tree-node__expand-icon {
  90. transform: rotate(-90deg);
  91. }
  92. /deep/.el-tree-node__expand-icon.expanded {
  93. transform: rotate(0deg);
  94. }
  95. </style>

 第三种 修改箭头打开和折叠 + 一二级自定义图标:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMC7mtLvlnKjpo47mtarph4w=,size_20,color_FFFFFF,t_70,g_se,x_16

  1. <template>
  2. <div class="ov-container">
  3. <el-tree :data="data" :props="defaultProps">
  4. <span class="custom-tree-node" slot-scope="{ node, data }">
  5. <i v-if="node.level == 1" class="province" />
  6. <i v-else-if="node.level == 2" class="city" />
  7. <i v-else-if="node.level == 3" />
  8. {{ data.label }}
  9. </span>
  10. </el-tree>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. name: "index",
  16. data() {
  17. return {
  18. data: [
  19. {
  20. label: "一级 1",
  21. children: [
  22. {
  23. label: "二级 1-1",
  24. children: [
  25. {
  26. label: "三级 1-1-1",
  27. },
  28. ],
  29. },
  30. ],
  31. },
  32. {
  33. label: "一级 2",
  34. children: [
  35. {
  36. label: "二级 2-1",
  37. children: [
  38. {
  39. label: "三级 2-1-1",
  40. },
  41. ],
  42. },
  43. {
  44. label: "二级 2-2",
  45. children: [
  46. {
  47. label: "三级 2-2-1",
  48. },
  49. ],
  50. },
  51. ],
  52. },
  53. {
  54. label: "一级 3",
  55. children: [
  56. {
  57. label: "二级 3-1",
  58. children: [
  59. {
  60. label: "三级 3-1-1",
  61. },
  62. ],
  63. },
  64. {
  65. label: "二级 3-2",
  66. children: [
  67. {
  68. label: "三级 3-2-1",
  69. },
  70. ],
  71. },
  72. ],
  73. },
  74. {
  75. label: "一级 4",
  76. children: [
  77. {
  78. label: "三级 3-2-1",
  79. },
  80. ],
  81. },
  82. {
  83. label: "一级 4",
  84. },
  85. ],
  86. };
  87. },
  88. };
  89. </script>
  90. <style scoped lang="scss">
  91. .ov-container {
  92. height: calc(100vh - 80px);
  93. background: #ffffff;
  94. border-radius: 5px;
  95. margin: 10px;
  96. }
  97. .province {
  98. background: url("../../assets/logo.png");
  99. width: 17px;
  100. height: 14px;
  101. display: inline-block;
  102. background-size: 100% 100%;
  103. }
  104. .city {
  105. background: url("../../assets/图片2.png") no-repeat;
  106. width: 17px;
  107. height: 14px;
  108. display: inline-block;
  109. background-size: 100% 100%;
  110. }
  111. .line {
  112. background: url("../../assets/百花.png") no-repeat;
  113. background-size: 100%;
  114. width: 17px;
  115. height: 14px;
  116. display: inline-block;
  117. }
  118. .data {
  119. background: url("../../assets/花朵.png") no-repeat;
  120. background-size: 100%;
  121. width: 17px;
  122. height: 14px;
  123. display: inline-block;
  124. }
  125. .el-tree /deep/ .el-tree-node__expand-icon.expanded {
  126. -webkit-transform: rotate(0deg);
  127. transform: rotate(0deg);
  128. }
  129. //有子节点 且未展开
  130. .el-tree /deep/ .el-icon-caret-right:before {
  131. // background: url("../../assets/logo.png") no-repeat 0 0;
  132. content: "√";
  133. display: block;
  134. width: 12px;
  135. height: 12px;
  136. font-size: 16px;
  137. background-size: 100% 100%;
  138. }
  139. //有子节点 且已展开
  140. .el-tree /deep/ .el-tree-node__expand-icon.expanded.el-icon-caret-right:before {
  141. // background: url("../../assets/logo.png") no-repeat 0 0;
  142. content: "x";
  143. display: block;
  144. width: 12px;
  145. height: 12px;
  146. font-size: 12px;
  147. background-size: 100% 100%;
  148. }
  149. //没有子节点
  150. .el-tree /deep/.el-tree-node__expand-icon.is-leaf::before {
  151. // background: url("../../assets/logo.png") no-repeat 0 0;
  152. content: "";
  153. display: block;
  154. width: 12px;
  155. height: 12px;
  156. font-size: 16px;
  157. background-size: 100% 100%;
  158. }
  159. </style>

 第四种在el-tree前加复选框和图标

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMC7mtLvlnKjpo47mtarph4w=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMC7mtLvlnKjpo47mtarph4w=,size_20,color_FFFFFF,t_70,g_se,x_16

第五种 Vue3 + ts 封装

  1. <template>
  2. <!--
  3. ref="treeRef" 用于获取树型组件的实例
  4. :check-strictly="checkStrictly" 在显示复选框的情况下,是否严格的遵循父子不互相关联的做法
  5. :indent="0" 树节点的缩进距离,设为0即取消缩进。
  6. :show-checkbox="props.isShowCheckbox" 是否显示复选框,通过 props.isShowCheckbox 来控制。
  7. :default-expand-all="props.expandAll" 是否默认展开所有节点,通过 props.expandAll 来控制
  8. :default-checked-keys="props.checkedKeys" 默认选中的节点的 key 的数组
  9. :data="props.treeData" 展示数据 树的数据源,通过 props.treeData 来控制
  10. :props="defaultProps" 配置选项,设置树节点的属性,通过 defaultProps 来控制。
  11. :accordion="props.accordion" 是否每次只展开一个子树节点(手风琴),通过 props.accordion 来控制。
  12. node-key="id" 每个树节点用来作为唯一标识的属性,整棵树应该是唯一的
  13. @node-click="onCurAllNodes" 点击树节点触发的事件 onCurAllNodes 是该函数的名称。
  14. @node-expand="onHandleExpand" 节点被展开的事件 onHandleExpand 是该函数的名称。
  15. @check-change="getCheckedAllNodes" 勾选状态发生变化时的事件回调函数,getCheckedNodes 是该函数的名称。
  16. check-on-click-node 点击节点时选中节点,默认值为 false
  17. <i :class="checkIconByNodeLevel(node)" />:根据节点的层级来动态设置节点前面的图标样式。
  18. {{ node.label }}:显示节点的标签文本。需要根据实际的数据结构来获取。props="defaultProps" 、数据源、node.label 三者需要保持一致。
  19. 示例:
  20. <template>
  21. <zw-tree
  22. :treeData="treeData"
  23. @onCurAllNodes="onCurAllNodes"
  24. @getCheckedAllNodes="getCheckedAllNodes"
  25. @onHandleExpand="onHandleExpand"
  26. />
  27. </template>
  28. <script setup lang="ts" name="Tree">
  29. import { ref } from 'vue';
  30. const treeData = ref([{}]);
  31. const onCurAllNodes = (data: object) => {
  32. console.log('当前节点下所有节点:', data);
  33. };
  34. const onHandleExpand = (data: object) => {
  35. console.log('展开节点时触发:', data);
  36. };
  37. const getCheckedAllNodes = (data: object) => {
  38. console.log('复选框改变:', data);
  39. };
  40. </script>
  41. -->
  42. <el-tree
  43. ref="treeRef"
  44. class="tree-line"
  45. :check-strictly="checkStrictly"
  46. :indent="0"
  47. :show-checkbox="props.isShowCheckbox"
  48. :default-expand-all="props.expandAll"
  49. :default-checked-keys="props.checkedKeys"
  50. :data="props.treeData"
  51. :props="defaultProps"
  52. :accordion="props.accordion"
  53. node-key="id"
  54. @node-click="onCurAllNodes"
  55. @node-expand="onHandleExpand"
  56. @check-change="getCheckedAllNodes"
  57. check-on-click-node
  58. >
  59. <template #default="{ node }">
  60. <i :class="checkIconByNodeLevel(node)" /> {{ node.label }}
  61. </template>
  62. </el-tree>
  63. </template>
  64. <script lang="ts" setup>
  65. import { defineExpose, ref } from 'vue';
  66. // 默认配置
  67. const defaultProps = {
  68. children: 'children',
  69. label: 'label',
  70. };
  71. interface Tree {
  72. label: string;
  73. children?: Tree[];
  74. }
  75. const treeRef = ref();
  76. const props = defineProps({
  77. // 树型数据
  78. treeData: {
  79. type: Array,
  80. default: () => {
  81. return [];
  82. },
  83. },
  84. // 是否全部展开
  85. expandAll: {
  86. type: Boolean,
  87. default: () => {
  88. return true;
  89. },
  90. },
  91. // 在显示复选框的情况下,是否严格的遵循父子不互相关联的做法
  92. checkStrictly: {
  93. type: Boolean,
  94. default: () => {
  95. return false;
  96. },
  97. },
  98. checkedKeys: {
  99. type: Array,
  100. default: () => {
  101. return [];
  102. },
  103. },
  104. isShowCheckbox: {
  105. type: Boolean,
  106. default: () => {
  107. return true;
  108. },
  109. },
  110. accordion: {
  111. type: Boolean,
  112. default: () => {
  113. false;
  114. },
  115. },
  116. });
  117. // 根据节点层级显示不同的图标
  118. const checkIconByNodeLevel = (node: {
  119. childNodes: [];
  120. expanded: boolean;
  121. data: { id: number };
  122. }) => {
  123. if (node.childNodes.length == 0) {
  124. return 'iconfont icon-24gl-fileEmpty';
  125. } else {
  126. if (node.expanded) {
  127. return 'iconfont icon-wenjianzhankai';
  128. }
  129. return 'iconfont icon-jian';
  130. }
  131. };
  132. // 定义事件
  133. const emits = defineEmits([
  134. 'onCurAllNodes',
  135. 'getCheckedAllNodes',
  136. 'onHandleExpand',
  137. ]);
  138. // 点击事件
  139. const onCurAllNodes = (data: Tree) => {
  140. emits('onCurAllNodes', data);
  141. };
  142. // 复选框改变事件
  143. const getCheckedAllNodes = (data: Tree) => {
  144. emits('getCheckedAllNodes', data);
  145. };
  146. // 展开事件
  147. const onHandleExpand = (data: Tree) => {
  148. emits('onHandleExpand', data);
  149. };
  150. defineExpose({
  151. treeRef,
  152. });
  153. </script>
  154. <style lang="scss" scoped>
  155. @import url('/@/myIcon/iconfont.css');
  156. </style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/322486
推荐阅读
相关标签
  

闽ICP备14008679号