el-tabel 树状表格前端实现模糊搜索功能

<template>
  <div class="m-page">
    <el-form class="m-card"
             :model="queryParams"
             ref="queryForm"
             :inline="true"
             label-width="68px"
             style="height:62px">
      <el-form-item label="材料名称"
                    prop="name">
        <el-input v-model="name"
                  placeholder="请输入材料名称"/>
      </el-form-item>
      <el-form-item>
        <el-button type="primary"
                   icon="el-icon-search"
                   size="mini" @click="searchData">搜索</el-button>
        <el-button icon="el-icon-refresh"
                   size="mini" @click="resetData">重置</el-button>
      </el-form-item>
    </el-form>
    <el-table :data="tableData"
              style="width: 100%;margin-top:10px;"
              row-key="id"
              default-expand-all
              class="tableTree"
              height="calc(100vh - 152px)"
              header-cell-class-name="m-table-header"
              :tree-props="{children: 'children'}">
      <el-table-column prop="code"
                       label="编码" />
      <el-table-column prop="name"
                       label="材料名称" />
      <el-table-column prop="spec"
                       label="规格" />
      <el-table-column prop="unit"
                       label="单位" />
    </el-table>
  </div>
</template>
<script >
import Vue from 'vue'
import { materialAll } from '@/services/engineeringManage/standardMaterialLibrary'
export default Vue.extend({
  data () {
    return {
      tableData: [],
      queryParams: {},
      name: ''
    }
  },
  mounted () {
    this.getMaterialAll()
  },
  methods: {
    async getMaterialAll () {
     // 根据后端接口获取到的树状数据
      const res = await materialAll()
      console.log(res, '列表数据6+++')
      if (res.code === 200) {
        this.tableData = res.data
      }
    },
    resetData(){
      this.name = ''
      this.searchData()
    },
    searchData(){
      if(this.name){
      return  this.tableData = this.rebuildData(this.name.trim(),this.tableData)
      }
      this.getMaterialAll()
    },
    // 重点代码 根据name字段模糊匹配树状结构数据,最后将处理好的数据返回出来
    rebuildData (value, arr){
      if (!arr) {
        return []
      }
      const newarr = [];
      arr.forEach(element => {
      // indexOf用来判读当前节点name字段是否包含所搜索的字符串value
      // 返回值:包含则返回索引值,反之返回-1
        if (element.name.indexOf(value) > -1) {
          const ab = this.rebuildData(value, element.children);
          const obj = {
            ...element,
            children: ab
          }
          newarr.push(obj);
        } else {
        // 判断当前节点知否有子节点,并且子节点中有数据,有数据继续递归查找
          if (element.children && element.children.length > 0) {
            const ab = this.rebuildData(value, element.children);
            const obj = {
              ...element,
              children: ab
            };
            if (ab && ab.length > 0) {
              newarr.push(obj);
            }
          }
        }
      });
      return newarr
    }
  }
})
</script>
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你使用的是 ElementUI 中的 el-table 树形表格,那么你可以通过设置 `treeProps` 属性来指定树形结构的相关属性。其中包括 `children` 表示子节点的属性名,`hasChildren` 表示是否有子节点的属性名。 在排序时,你可以使用 `sort` 属性来指定排序规则,例如: ```html <el-table :data="tableData" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" :sort-method="sortTable"> <el-table-column prop="name" label="名称" sortable></el-table-column> <el-table-column prop="age" label="年龄" sortable></el-table-column> </el-table> ``` 其中,`sort-method` 属性指定了排序方法,可以在 `methods` 中定义: ```js methods: { sortTable(a, b) { // 判断是否为根节点 const aParent = this.getParentNode(a) const bParent = this.getParentNode(b) const aIsRoot = !aParent const bIsRoot = !bParent // 根节点优先 if (aIsRoot && !bIsRoot) { return -1 } else if (!aIsRoot && bIsRoot) { return 1 } // 比较节点值 if (a[this.sortField] > b[this.sortField]) { return this.sortOrder === 'ascending' ? 1 : -1 } else if (a[this.sortField] < b[this.sortField]) { return this.sortOrder === 'ascending' ? -1 : 1 } else { return 0 } }, getParentNode(node) { // 获取当前节点的父节点 const parentKey = this.$refs.table.treeProps.children const parentNode = this.$refs.table.getNodeById(node[parentKey]) return parentNode } } ``` 在 `sortTable` 方法中,首先判断当前节点是否为根节点,如果是根节点则优先排在前面。然后再比较节点值进行排序。在获取父节点时,可以使用 `$refs` 获取到 el-table 的实例,然后调用 `getNodeById` 方法获取节点对应的行数据。 以上是一个示例代码,你可以根据自己的实际需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值