返回

庖丁解牛话ElementUI Tree组件搜索功能

前端

序:庖丁解牛话Tree组件搜索功能

Tree组件的搜索功能,宛如庖丁解牛一般,在搜索的逻辑中游刃有余,在高亮的处理上恰到好处。本文将以庖丁解牛之势,层层解析Tree组件的搜索功能,带你领略它的精妙之处。

一、庖丁解牛filter-node-method

filter-node-method是Tree组件搜索功能的核心,它决定了搜索结果的准确性。Tree组件提供了默认的filter-node-method,但我们也可以自定义filter-node-method来满足不同的需求。

自定义filter-node-method的步骤如下:

  1. 首先,我们需要定义一个名为filter-node-method的函数,该函数接收两个参数:node和keyword。node是当前正在被搜索的节点,keyword是用户输入的搜索。

  2. 在filter-node-method函数中,我们可以使用正则表达式来判断node是否包含keyword。如果包含,则返回true,否则返回false。

  3. 最后,我们将自定义的filter-node-method函数赋值给Tree组件的filter-node-method属性。

<el-tree
  :data="data"
  :filter-node-method="filterNodeMethod"
  :default-expand-all="true"
>
</el-tree>

<script>
  export default {
    data() {
      return {
        data: [
          {
            id: 1,
            label: '节点1',
            children: [
              {
                id: 2,
                label: '节点2',
              },
              {
                id: 3,
                label: '节点3',
              },
            ],
          },
          {
            id: 4,
            label: '节点4',
            children: [
              {
                id: 5,
                label: '节点5',
              },
              {
                id: 6,
                label: '节点6',
              },
            ],
          },
        ],
      };
    },
    methods: {
      filterNodeMethod(node, keyword) {
        return node.label.indexOf(keyword) !== -1;
      },
    },
  };
</script>

二、漫谈renderContent

当搜索结果出来后,Tree组件会调用renderContent方法来渲染搜索结果。renderContent方法接收两个参数:node和data。node是当前正在被渲染的节点,data是节点的数据。

在renderContent方法中,我们可以对节点进行自定义渲染。例如,我们可以将匹配到关键字的节点高亮显示。

<el-tree
  :data="data"
  :filter-node-method="filterNodeMethod"
  :default-expand-all="true"
  :render-content="renderContent"
>
</el-tree>

<script>
  export default {
    data() {
      return {
        data: [
          {
            id: 1,
            label: '节点1',
            children: [
              {
                id: 2,
                label: '节点2',
              },
              {
                id: 3,
                label: '节点3',
              },
            ],
          },
          {
            id: 4,
            label: '节点4',
            children: [
              {
                id: 5,
                label: '节点5',
              },
              {
                id: 6,
                label: '节点6',
              },
            ],
          },
        ],
      };
    },
    methods: {
      filterNodeMethod(node, keyword) {
        return node.label.indexOf(keyword) !== -1;
      },
      renderContent(h, node) {
        const keyword = this.keyword;
        const label = node.label;
        const index = label.indexOf(keyword);

        if (index !== -1) {
          const start = label.substring(0, index);
          const middle = label.substring(index, index + keyword.length);
          const end = label.substring(index + keyword.length);

          return h('span', [
            h('span', start),
            h('span', { style: 'color: #f00' }, middle),
            h('span', end),
          ]);
        }

        return h('span', label);
      },
    },
  };
</script>

三、点睛之笔——节点高亮

在上面的代码中,我们通过在renderContent方法中对节点进行自定义渲染,实现了节点高亮。当搜索结果出来后,Tree组件会调用renderContent方法来渲染搜索结果。在renderContent方法中,我们可以判断当前节点是否匹配到关键字。如果匹配到,则将该节点的高亮显示。

节点高亮可以使用css来实现。

.el-tree-node.is-matched {
  background-color: #f00;
}

在上面的代码中,我们将匹配到关键字的节点的背景色设置为红色。

结语

Tree组件的搜索功能,可谓是庖丁解牛之作。从filter-node-method的实现到renderContent的调用,再到节点高亮的处理,每一处细节都经过精心雕琢。希望本文能帮助你更好地理解Tree组件的搜索功能,并在实际项目中灵活运用。