1. 程式人生 > 實用技巧 >VUE使用el-table展開行載入子節點table聯動勾選《VUE專欄四》

VUE使用el-table展開行載入子節點table聯動勾選《VUE專欄四》

Vue專案中使用el-table聯動勾選,要求選中父節點,子節點table全選,選中所有子節點,對應的父節點勾選框選中,勾選全部父節點,子節點全部選中,效果如下圖

el-table的展開行下的table是一個list,因此對應的ref選擇用與子table同級的prodId唯一鍵作為ref繫結的唯一值,因此可以判斷是父節點的哪一行,再判斷父節點下的子節點選中效果,el-table展開行,在子節點隱藏時會勾選不上,從而無法獲取子節點資料,在這裡,我們會對子節點的資料加上狀態標識,來標識子節點是否被選中的效果,子節點在展開時會通過標識的狀態,重新勾選上,最後選中的子節點資料就是帶有勾選標識的資料。

程式碼實現:

table表格程式碼:

 <el-table border :data="formData.itemVOList" style="width: 100%;"
                  :header-cell-style="{background:'rgba(239,242,253,0.4)'}"
                  ref="multipleTable" @select="itemVOSelect" @select-all ="itemVOAllSelect">
            <el-table-column type="expand"
> <template slot-scope="scope"> <el-table border label-position="left" :data="scope.row.afterSoList" :ref="scope.row.itemDetailRefKey" :header-cell-style="{background:'rgba(239,242,253,0.4)'}" style
="width: 100%;" @selection-change="handleItemSelectionChange(scope.row.prodId)"> <el-table-column type="selection" width="50"> </el-table-column> <el-table-column label="退貨單號" prop="fahuoAfterSoNumber"></el-table-column> <el-table-column label="銷售單號" prop="soNumber"></el-table-column> <el-table-column label="退貨數量" prop="shouldPickQuantity"></el-table-column> <el-table-column label="售後申請時間" prop="createAt"></el-table-column> <el-table-column label="提前賠付" prop="advanceStatus"> <template slot-scope="scope"> {{scope.row.advanceStatus == 0 ? '否': scope.row.advanceStatus == 1 ? '是' : ''}} </template> </el-table-column> <el-table-column label="退貨使用者" prop="userName"></el-table-column> </el-table> </template> </el-table-column> <el-table-column type="selection" width="50"> </el-table-column> <el-table-column label="序號" type="index"> </el-table-column> <el-table-column label="SKU編碼" prop="prodNumber"></el-table-column> <el-table-column label="商品名稱" prop="prodName"></el-table-column> <el-table-column label="規格" prop="specification"></el-table-column> <el-table-column label="供應商" prop="supplyName"></el-table-column> <el-table-column label="銷售模式" prop="merchantModel"> <template slot-scope="scope"> {{ scope.row.merchantModel == 1 ? "代銷" : scope.row.merchantModel == 2 ? "經銷" : ""}} </template> </el-table-column> <el-table-column label="產品ID" prop="prodId"></el-table-column> <el-table-column label="商品屬性" prop="storageType"> <template scope="scope"> {{scope.row.storageType == 10 ? "常溫" : scope.row.storageType == 20 ? "冷凍" : scope.row.storageType == 30 ? "冷藏" : "" }} </template> </el-table-column> <el-table-column label="一級類目" prop="oneCategoryName"></el-table-column> <el-table-column label="退貨數量" prop="shouldPickQuantity"></el-table-column> <el-table-column label="取貨數量" prop="realPickQuantity"></el-table-column> <el-table-column label="入庫數量" prop="quantity"> </el-table-column> </el-table>

方法:

    資料結構:

     public formData = {
                batchInfo: {},
                itemVOList: [{
                prodId,
                ......,
                afterSoList:[]
                },{}.....]
            };

                //商品全選
        public itemVOAllSelect(val) {
            let itemVOList = this.formData.itemVOList;
            if(val && val.length>0){
                for(let prodItem of itemVOList){
                    let tempRef = this.$refs[prodItem.itemDetailRefKey];
                    for(let item of prodItem.afterSoList){
                        item["selectStatus"] = 1
                        if(tempRef){
                            //@ts-ignore
                            this.$refs[prodItem.itemDetailRefKey].toggleRowSelection(item,true);
                        }
                    }
                }
            }else{
                for(let prodItem of itemVOList){
                    let tempRef = this.$refs[prodItem.itemDetailRefKey];
                    for(let item of prodItem.afterSoList){
                        item["selectStatus"] = 0
                        if(tempRef){
                            //@ts-ignore
                            this.$refs[prodItem.itemDetailRefKey].toggleRowSelection(item,false);
                        }
                    }
                }
            }
        }

          //商品勾選
        public itemVOSelect(val,selectRow) {

            let selProdIdMap = {}
            if(val){
                for(let item of val){
                    let prodId = item.prodId;
                    selProdIdMap[prodId] = 1;
                }
            }

            let tempRef = this.$refs[selectRow.itemDetailRefKey];
            if(selProdIdMap[selectRow.prodId] && selProdIdMap[selectRow.prodId] == 1){
                for (let row of selectRow.afterSoList) {
                    row["selectStatus"] = 1
                    if(tempRef){
                        //@ts-ignore
                        this.$refs[selectRow.itemDetailRefKey].toggleRowSelection(row,true);
                    }
                }
            }else{
                for (let row of selectRow.afterSoList) {
                    row["selectStatus"] = 0
                    if(tempRef){
                        //@ts-ignore
                        this.$refs[selectRow.itemDetailRefKey].toggleRowSelection(row,false);
                    }
                }
            }
        }



        public handleItemSelectionChange(val) {
            let refKey = "itemDetail" + val;
            //@ts-ignore
            let prodInfoList = this.$refs[refKey].selection;
            let afterSoIdMap = {}
            if (prodInfoList.length > 0) {
                for (let item of prodInfoList) {
                    afterSoIdMap[item.id] = 1;
                }
            }
            for (let prodItem of this.formData.itemVOList) {
                if (prodItem.prodId == val) {
                    for (let soItem of prodItem.afterSoList) {
                        if (afterSoIdMap[soItem.id] && afterSoIdMap[soItem.id] == 1) {
                            soItem["selectStatus"] = 1;
                        } else {
                            soItem["selectStatus"] = 0
                        }
                    }
                    let selectStatus = false;
                    let unSelectStatus = false;
                    for(let item of prodItem.afterSoList){
                        if(item["selectStatus"] == 1){
                            selectStatus = true
                        }else{
                            unSelectStatus = true;
                        }
                    }
            //明細全未勾選 if(!selectStatus && unSelectStatus){ //@ts-ignore this.$refs.multipleTable.toggleRowSelection(prodItem, false); }             //明細全選 if(!unSelectStatus && selectStatus){ //@ts-ignore this.$refs.multipleTable.toggleRowSelection(prodItem, true); } break; } } }

最後選中明細獲取:

  let itemVOList = this.formData.itemVOList;
        
            let selAfterSoList = [];
            for (let prodItem of itemVOList) {
                for (let soItem of prodItem.afterSoList) {
                    if (soItem["selectStatus"] == 1) {
                        selAfterSoList.push(soItem);
                    }
                   
                }