饿了吗 tree树形结构 显示文件图标 搜索 更改样式

功能点

  • 树形结构的搜索过滤功能,官网有,稍微配置一下即可

  • 树形结构的样式二次修改,

  • 树形结构的图标的展示,3中状态,未打开的文件状态,打开时的文件状态,最后一级的文件状态

tree树形

细节

  • tree绑定的data数据,最后一级要设置 children: [],不然会影响显示,实际开发也会设置

  • icon图标是在iconfont图标库下载cvg图片到本地库

  • 可能因为图标大小问题导致的基线对不起问题,设置基线对齐即可

  • 判断文件状态,通过自定义插槽的方式,在数据渲染时添加i标签,从而显示图标 通过el-tree通过的节点展开事件,在控制台输出data、node、element后可以观察发现,当点击展开节点时,node中存在一个expanded参数且值为 true:通过data.children.length === 0 是不是最后一个

代码如下

<template>
  <div class="holder">
    <el-row :gutter="20">
      <!-- 左边 -->
      <el-col :xs="24" :sm="8" :lg="4">
        <div class="left">
          <el-input
            placeholder="请输入分类名称"
            v-model="filterText"
            suffix-icon="el-input__icon el-icon-search"
            clearable
          >
          </el-input>
          <el-tree
            class="filter-tree"
            :data="data"
            :props="defaultProps"
            :filter-node-method="filterNode"
            @node-expand="handlerNodeExpand"
            ref="tree"
          >
            <span class="custom-tree-node" slot-scope="{ node, data }">
              <span>
                <img
                  style="vertical-align: text-top"
                  v-if="data.children.length !== 0"
                  :src="[node.expanded ? treeicon.one : treeicon.two]"
                  alt=""
                />
                <img
                  style="vertical-align: text-top"
                  v-if="data.children.length === 0"
                  :src="treeicon.there"
                  alt=""
                />
                {
   
   { node.label }}
              </span>
            </span>
          </el-tree>
        </div>
      </el-col>
      <!-- 右边 -->
      <el-col :xs="24" :sm="16" :lg="20">
        <div class="right"></div>
      </el-col>
    </el-row>
  </div>
</template>
​
<script>
export default {
  data() {
    return {
      // 搜索分类
      filterText: "",
      data: [
        {
          id: 1,
          label: "一级 1",
          children: [
            {
              id: 4,
              label: "二级 1-1",
              children: [
                {
                  id: 9,
                  label: "三级 1-1-1",
                  icon: "el-icon-info",
                  children: [],
                },
                {
                  id: 10,
                  label: "三级 1-1-2",
                  icon: "el-icon-info",
                  children: [],
                },
              ],
            },
          ],
        },
        {
          id: 2,
          label: "一级 2",
          children: [
            {
              id: 5,
              label: "二级 2-1",
              children: [],
            },
            {
              id: 6,
              label: "二级 2-2",
              children: [],
            },
          ],
        },
        {
          id: 3,
          label: "一级 3",
          children: [
            {
              id: 7,
              label: "二级 3-1",
              children: [],
            },
            {
              id: 8,
              label: "二级 3-2",
              children: [],
            },
          ],
        },
      ],
      defaultProps: {
        children: "children",
        label: "label",
      },
      // 图标数据
      treeicon: {
        one: require("@/assets/images/空文件.svg"),
        two: require("@/assets/images/文件夹.svg"),
        there: require("@/assets/images/文件.svg"),
      },
    };
  },
  watch: {
    // 调用 Tree 实例的filter方法,参数为关键字
    filterText(val) {
      this.$refs.tree.filter(val);
    },
  },
  mounted() {},
  methods: {
    // 对树节点进行筛选时执行的方法,返回 true 表示这个节点可以显示,返回 false 则表示这个节点会被隐藏
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    },
    // 节点被展开时触发的事件
    handlerNodeExpand(data, node, element) {
      window.console.log(data);
      window.console.log(node);
      window.console.log(element);
    },
  },
};
</script>
​
<style lang="scss" scoped>
.holder {
  padding: 20px 25px;
  height: 887px;
  .left {
    height: 848px;
    border: 1px solid #ccc;
    overflow: hidden;
    box-sizing: border-box;
    padding: 20px 20px 0;
    ::v-deep .el-input__inner {
      border: 1px solid #1997c9;
      border-radius: 0;
      // color: #fff;
      // background-color: #072a4f;
    }
    ::v-deep .el-tree-node.is-current > .el-tree-node__content {
      // 设置颜色 el-tree 选中节点的颜色
      background-color: rgba(135, 206, 235, 0.2);
      color: #409eff; // 节点的字体颜色
      font-weight: bold; // 字体加粗
    }
    ::v-deep .el-tree-node__content:hover {
      background-color: #66b1ff87;
    }
    ::v-deep .el-tree {
      // background-color: #f2f2f2;
      // color: red;
      margin-top: 30px;
    }
  }
  .right {
    width: 100%;
    height: 848px;
    border: 1px solid #ccc;
  }
}
</style>

注:不能直接复制,需要下载图标到本地


经过这一趟流程下来相信你也对 饿了吗 tree树形结构 显示文件图标 搜索 更改样式 有了初步的深刻印象,但在实际开发中我 们遇到的情况肯定是不一样的,所以我们要理解它的原理,万变不离其宗。加油,打工人!

什么不足的地方请大家指出谢谢 -- 風过无痕

扫描二维码关注公众号,回复: 14879515 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_53579656/article/details/129045767
今日推荐