關於element-ui table中自定義單選或者多選框的時候,無法選擇的解決


 

由於表格由后台返回的數據,根據不同的類型,顯示不同的方式,

 

 第一種方法:針對select,使用@change和$forceUpdate 來解決(無法解決input是動態生成的v-model的問題,可以使用下面的第二種方式)

 

 

<el-table-column v-for="(icolm,icolx) in icm.temColumn" :key="icolx" :prop="icolm.key" :label="icolm.name" :width="icolm.width" >
   <template  slot-scope="scope">
       <div v-if="icolm.key !='isflag'&&icolm.key !='role'">{{scope.row[icolm.key]}}</div>
       <div v-if="icolm.anthorkey &&icolm.anthorkey.indexOf('%select')>-1">{{renderColoumSelect(scope.row,icolm.anthorkey,'%select')}}</div>
       <!-- 是否的操作 -->
       <div v-if="icolm.key =='isflag'">
          <el-radio-group v-if="opetype=='approval'" v-model="scope.row.isflag" disabled @change=radioChange(arguments,icm.datalists,scope.$index)>
                <el-radio label="1">是</el-radio>
             <el-radio label="2">否</el-radio>
         </el-radio-group>  
         <div v-else>
              {{scope.row[icolm.key]=="1"?"是":"否"}}
         </div>
      </div>
      <!-- 對應的角色 -->
      <div v-if="icolm.key =='role'">{{roleObj[scope.row[icolm.key]]}}</div>
  </template>
</el-table-column>

由於表格的列是動態生成的,vue是監聽不到嵌套中的雙向綁定的值,所以,當我再頁面上切換單選或者是下拉的時候,頁面不會發生變化

這時需要進行強制刷新數據

/**
* arg - 表示radio變化時的默認參數
* item - 表示當前表格的data數據
* index - 當前修改的數據的索引
*/
radioChange(arg,item,index){
this.$set(item,index,item[index]); this.$forceUpdate() },

 第二種方法(簡單快捷,一步到位)

一般情況是,我們的這個select和input等表單是放在v-for中,循環lists列表,v-model綁定的是循環出來的值

在我們動態新增了或者修改了lists,我們可以

let copy_data =JSON.parse(JSON.stringify(this.lists));
this.lists = [];
this.lists= copy_data;

 

這里要注意,如果你的lists 是一個多維對象的話,使用數組的concat,slice或者Object.assign都不是深克隆
一定要使用對  對象進行深克隆的方式來進行對列表進行重新賦值
 
這種方式直接解決了所有動態生成的v-model的問題,也不需要對列表進行$set
 

第三種情況(上面兩種情況都不行 - 具體為啥我也不知道)

使用場景:依然是最上面的那個表格,新增一個編輯列頭的功能

 

 使用$set,forceUpdate,以及重新賦值都不能更新視圖,后台打印數據是更新過的

為了實現更新inpput中的值,只能每次@input事件中,進行更新循環的key值,
<el-table-column v-for="(icolm,icolx) in icm.temColumn" :key="icolm.sign" :prop="icolm.key" :label="icolm.name" :width="icolm.width" min-width="140"> <template slot="header"> <div v-if="icolm.key =='role'"> {{icolm.name}} </div> <div v-else> <el-input v-model="icolm.name" style="width:78%;" @input="changeColumnName(index,icx,icolx)" @change="changeColumnName(index,icx,icolx)"> </el-input> <i class="el-icon-remove c-error m-r-l-10 c-p" title="移除當前列" @click="operateTable('deleteCol',index,icx,icolm.key)"></i> </div> </template> <template slot-scope="scope"> 1111 </template> </el-table-column>
changeColumnName(index,icx,icolx){
     let this_ = this;
     this.$forceUpdate();
     this.editableTabs[index].tableLists[icx].temColumn.forEach(item=>{
         item.sign = generateMixed(6);  
     });
     this.$set(this.editableTabs[index].tableLists[icx].temColumn,icolx,this.editableTabs[index].tableLists[icx].temColumn[icolx])
},

這樣就可以實現 input輸入

缺點:一次只能輸入一個,因為列表進行了刷新,很不方便使用

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM