antdv 树形表格(配合jeecg)

项目需求用到了树形表格,目前暂不支持父子数据递归查询所以就手动改造了一下。

官网table: Ant Design Vue

原理:通过监听@expand,手动改变children里的数据。

HTML

 <a-table
        ref="table"
        size="middle"
        :scroll="{x:true}"
        bordered
        rowKey="id"
        :columns="columns"
        :data-source="dataSource"
        :pagination="ipagination"
        :loading="loading"
        class="j-table-force-nowrap"
        @change="handleTableChange"
        :defaultExpandedRowKeys="expandedRowKeys"
        @expand="expandChange"
      />

js

 expandChange(expanded, record){
        console.log(`expandChange`,expanded, record);
        if(!expanded)  return 
        const id = record.id
        const data = this.dataSource
        getAction(this.url.getLowList, { id: record.id }).then((res) => {
          if (res.success) {
            //获取到的子节点
            const children = res.result || []
            children.forEach(opt=>{
              // 如果children为空 不显示展开icon
              if(opt.children.length === 0){
                delete opt.children
              }
            })
            const dataSourceMap = (items) => {
              items.find((item) => {
                if (item.id === id) {
                  //找到当前要展开的节点
                  item.children = children
                  return items
                }
                if (item.children && item.children.length > 0) {
                  dataSourceMap(item.children)
                }
              })
            }
            dataSourceMap(data || [])
            this.setDataSource(data)
          } else {
            this.$message.warning(res.message)
          }
        }).catch((err) => {
          this.$message.error(err.message)
        })
      },
      setDataSource(data){
        this.dataSource = data
      },
      loadData(arg){
        if(!this.url.list){
          this.$message.error("请设置url.list属性!")
          return
        }
        if (arg === 1) {
          this.ipagination.current = 1;
        }
        var params = this.getQueryParams();//查询条件
        params.projectId = this.projectId
        this.loading = true;
        getAction(this.url.list, params).then((res) => {
          if (res.success) {
            this.dataSource = res.result.records||res.result;
            this.dataSource.forEach(item=>{
              if(item.children.length === 0){ // children为空不显示expand icon
                delete item.children
              }
            })
            if(res.result.total)
            {
              this.ipagination.total = res.result.total;
            }else{
              this.ipagination.total = 0;
            }
          }
          if(res.code===510){
            this.$message.warning(res.message)
          }
          this.loading = false;
        })
      },

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ant Design Vue 的穿梭框(Transfer)组件提供了一个 `filter` 属性,可以用于搜索树形数据。 首先,需要将树形数据转换为穿梭框所需的数据格式,即包含 `key`、`label` 和 `disabled` 属性的数组格式。可以使用递归方式实现: ``` function flattenTreeData(data) { const result = [] for (let i = 0; i < data.length; i++) { const node = data[i] result.push({ key: node.id, label: node.name, disabled: node.disabled, }) if (node.children) { result.push(...flattenTreeData(node.children)) } } return result } ``` 然后,在穿梭框中添加 `filter` 属性,该属性的值为一个函数,用于根据关键字过滤数据: ``` <template> <a-transfer :data-source="leftData" :target-keys="rightData" :filter="filterData" /> </template> <script> export default { data() { return { leftData: [], // 左侧树形数据 rightData: [], // 右侧穿梭框数据 keyword: '', // 搜索关键字 } }, methods: { filterData(inputValue, item) { if (!inputValue) return true return item.label.toLowerCase().indexOf(inputValue.toLowerCase()) !== -1 }, }, created() { // 将树形数据转换为穿梭框所需的数据格式 this.leftData = flattenTreeData(treeData) }, } </script> ``` 在 `filterData` 函数中,会传入两个参数:`inputValue` 表示搜索框中输入的关键字,`item` 表示穿梭框中的每一项数据。该函数需要返回一个布尔值,表示该项是否需要显示。这里使用了 `indexOf` 方法对字符串进行模糊匹配。 使用以上代码,即可在树形数据中进行搜索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值