在一个项目中,有这样一个需求: 现在有一个table表格,一个el-tree树,下拉选择框, 表格中有一些默认数据, 当下拉选择类型后,可以勾选对应tree的子节点,勾选或取消勾选,动态展示在table表格中

遇到的问题:

使用@check-change时, 点击节点时,会多次触发, 勾选时,虽然会多次触发@check-change,但还是可以正常添加数据
然而, 在取消勾选时, 如果点击的是叶子节点, 因为多次触发@check-change, 执行数组删除操作时,就会把这个分类下所有的数据都删掉, 很明显不符合要求, 所以改用了@check事件。
但是@check事件只能获取当前操作的数据,和已经勾选的数据,不知道此时是勾选还是取消勾选操作。
此时的做法就是: 在check事件中,先获取到所有的已经勾选的节点,然后, 用此时操作的节点数据在所有已经勾选的节点数组中查找, 如果在其中,那么, 再在table数组中查找,如果table中没有,就表示此时是勾选操作, 把数据添加到table数组中; 如果此时操作的数据没有在已经勾选的节点数组中, 就表示此时是取消勾选操作, 那么, 就需要进一步查找是否在table中存在这个数据,如果有,就需要删除table数组中的这个数据

<el-table
   :data="tempArr"
   :height="gridTableHeight"
   border
   style="width: 100%" >
   <el-table-column
     align="center"
     prop="label"
     label="已选网格"
     min-width="60">
   </el-table-column>
   <el-table-column
     align="center"
     prop="id"
     label="网格类型"
     min-width="60">
   </el-table-column>
</el-table>
 <el-tree
   :data="gridTrees"
     show-checkbox
     :default-expand-all="false"
     node-key="id"
     ref="gridTree"
     highlight-current
     render-after-expand="false"
     :props="defaultProps"
     :default-expanded-keys="defCheckKey"
     :default-checked-keys="defCheckKey"
     :render-content="renderContent"
     @check="handleCheckChange"
   >
</el-tree>

data中的数据:

tempArr:[{
         id: 20,
         label: '哈哈',
       },{
         id: 12,
         label: '第三网络',
       },{
       id: 15,
       label: '第五网络',
     }],
gridTrees: [{
  id: 1,
  label: '烟台经济技术开发区',
  hasChildren: true,
  children: [{
    id: 4,
    label: '福莱山街道',
    hasChildren: true,
    children: [{
      id: 9,
      label: '福泉社区',
      hasChildren: true,
      children: [{
        id: 10,
        label: '第一网络',
      },{
        id: 11,
        label: '第二网络',
      },{
        id: 12,
        label: '第三网络',
      }],
    },{
      id: 15,
      label: '第五网络',
    } ]
  }]
}, {
  id: 2,
  label: '一级 2',
  hasChildren: true,
  children: [{
    id: 5,
    label: '二级 2-1',
  }, {
    id: 6,
    label: '二级 2-2',
  }]
}, {
  id: 3,
  label: '一级 3',
  hasChildren: true,
  children: [{
    id: 7,
    label: '二级 3-1',
  }, {
    id: 8,
    label: '二级 3-2',
  }]
}],
defaultProps: {
  children: 'children',
  label: 'label'
},

methods:

//  根据勾选和取消勾选,添加或删除table中的数据
updateCheckData(data,arrs){
  // console.log(data,arrs)
  if(data.hasChildren){
    for (let i = 0; i < data.children.length; i++) {
      this.updateCheckData(data.children[i],arrs);
    }
  }else{
    if(arrs.indexOf(arrs.filter(val=>val.label==data.label)[0])!=-1){  // 当前勾选或取消的项是否在已经勾选的数组中
      // 当前勾选的项是否在table所有数据的数组中
      console.log(1111111)
      if(this.tempArr.indexOf(this.tempArr.filter(val=>val.label==data.label)[0])==-1){
        this.tempArr.push(data);
      }
    }else{  //  当前操作的项不在已经勾选的数组中,就是取消勾选操作, 再判断当前操作的项是否在table所有数据的数组中
      if(this.tempArr.indexOf(this.tempArr.filter(val=>val.label==data.label)[0])!=-1){  // 在table所有数据的数组中
          this.tempArr.splice(this.tempArr.indexOf(this.tempArr.filter(val=>val.label==data.label)[0]),1);
      }
    }
  }
  // console.log(this.tempArr)
},
handleCheckChange(data,checkData) {
 console.log(data,checkData)
    this.updateCheckData(data,checkData.checkedNodes)
  },
GitHub 加速计划 / eleme / element
54.06 K
14.63 K
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:2 个月前 )
c345bb45 6 个月前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐