el-table显示树形数据报错

问题描述

el-table显示树形数据报错

Error: for nested data item, row-key is required
TypeError: this.$el.querySelectorAll is not a function

问题分析

后端返回的树形结构中没有返回id字段,所以需要手动遍历数据给数据添加id,el-table中默认设置row-key="id"

,没有id,又没有设置row-key的值这时就会报错。

问题解决

递归数据

recursive(data) {
      const setId = list => {
        list.forEach(item => {
          item.id = item.proid
          if (item.children) {
            setId(item.children)
          }
        })
      }
      setId(data)
},

el-table 树形结构复选框子项勾选问题

在使用element做表格开发使用复选框和树形结构时发现点击父元素复选框时,子元素无法选中,于是在table上监听点击和全选,根据数据有子节点来手动切换选中与否。

 // el-table 树形复选框需要的属性和方法
 @select="select"
 @select-all="selectAll"
 @selection-change="selectionChange"
 :tree-props="{children: 'children'}"
 
 // 为选中行添加特定有样式
 :row-class-name="rowClassName"
// el-table 封住方法

// 单选 this.childNm 就是 tree-props中的children
select(selection, row) {
      const checked = selection.some(el => {
        return row.id === el.id
      })
      if (this.childNm && row[this.childNm]) {
        this.recursive(row[this.childNm], checked)
      } else {
        row.isActive = checked
      }
    },

    /**
     * @Description: 递归渲染
     */
    recursive(data, checked) {
      const vm = this
      const toggleSel = list => {
        list.forEach(item => {
          item.isActive = checked
          vm.toggleSelection(item, checked)
          if (item[this.childNm]) {
            toggleSel(item[this.childNm])
          }
        })
      }
      toggleSel(data)
    },

    /**
     * @Description: 全选
     */
    selectAll(selection) {
      // tabledata第一层只要有在selection里面就是全选
      const isSelect = selection.some(el => {
        const tableDataIds = this.tableData.map(j => j.id)
        return tableDataIds.includes(el.id)
      })
      
      // tableDate第一层只要有不在selection里面就是全不选
      const isCancel = !this.tableData.every(el => {
        const selectIds = selection.map(j => j.id)
        return selectIds.includes(el.id)
      })
      
      if (isSelect) {
        this.recursive(selection, true)
      }
      
      if (isCancel) {
        this.recursive(this.tableData, false)
      }
    },

    /**
     * @Description: 切换选中状态
     */
    toggleSelection(row, select) {
      if (row) {
        this.$nextTick(() => {
          this.$refs.DeTable && this.$refs.DeTable.toggleRowSelection(row, select)
        })
      }
    },
    
	// 选中行后添加样式
	rowClassName({ row }) {
      if (row.isActive) {
        return 'mark-color'
      }
    },
// 调用封装的table组件返显数据
/**
     * @Description: 递归回显
     * @param {*} data
     * @param {*} selIds 返显需要的id集合
     * @return {*}
     */
    recursiveBack(data, selIds) {
      const tableRef = this.$refs.tableRef
      this.expandKeys = []
      const toggleSel = list => {
        list.forEach(item => {
          item.isActive = selIds.includes(item.id) // 返显标志
          tableRef && tableRef.toggleSelection(item, item.isActive) // 更新table数据
          this.expandKeys.push(item.id) // 展开
          if (item.children) {
            toggleSel(item.children)
          }
        })
      }
      toggleSel(data)
    },

备注

  • row-key: 渲染树形数据时,必须要指定 row-key, row-key的值必须是唯一的,可以是String类型,也可以是function(row)

  • indent: 展示树形数据时,树节点的缩进, Number类型

  • tree-props: 渲染嵌套数据的配置选项。:tree-props="{children: 'children'}"定义子项的List名字,在data内写入,即可将子项写入在表格中

  • select-on-indeterminate:在多选表格中,当仅有部分行被选中时,点击表头的多选框时的行为。若为 true,则选中所有行;若为 false,则取消选择所有行

  • toggleRowSelection:用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中)

  • clearSelection:用于多选表格,清空用户的选择

posted @ 2021-06-08 20:35  小方块的世界  阅读(1800)  评论(0编辑  收藏  举报