關于element-ui中@selection-change執(zhí)行兩次的問題
element-ui中@selection-change執(zhí)行兩次
問題描述
行內(nèi)處理數(shù)據(jù)也就是:
data="roleData.filter((data) => !serarchText || data.name.includes(serarchText))"和type="selection"
共存的時候執(zhí)行出錯,@selection-change執(zhí)行了兩次
我最近再試這段代碼發(fā)現(xiàn)并沒有執(zhí)行兩次,element-plus好像修復了這個??
<template> ? <div> ? ? <div> ? ? ? <el-input clearable placeholder="搜索..." prefix-icon="el-icon-search" v-model="serarchText"></el-input> ? ? </div> ? ? <el-table border stripe ? ? ? ? ? ? ? :data="roleData.filter((data) => !serarchText || data.name.includes(serarchText))" ? ? ? ? ? ? ? :header-cell-style="{background:'#409EFF',color:'#FFF'}" ? ? ? ? ? ? ? @selection-change="handleRoleChange"> ? ? ? <el-table-column align="center" type="selection" width="50" /> ? ? ? <el-table-column align="center" label="ID" prop="id" width="50" /> ? ? ? <el-table-column align="center" label="角色名稱" prop="name" width="150" /> ? ? ? <el-table-column align="center" label="角色代碼" prop="code" width="120" /> ? ? </el-table> ? </div> </template>
<script lang="ts" setup> import { reactive, ref, watch } from "vue"; const roleData = ref(); roleData.value = [ ? { ? ? id: 1, ? ? code: "ROLE_TEST0_1", ? ? name: "測試角色3", ? ? enabled: true, ? }, ? { ? ? id: 3, ? ? code: "ROLE_TEST0_3", ? ? name: "系統(tǒng)開發(fā)員", ? ? enabled: true, ? }, ]; let roleSelectedData = ref([]); let serarchText = ref(); const handleRoleChange = (value: any) => { ? roleSelectedData.value = value; ? console.log(value);//選擇selection框 兩次執(zhí)行 }; </script>
我暫且認為應該是行內(nèi)處理數(shù)據(jù)的時候 (就是行內(nèi)處理data),每一次修改table相關數(shù)據(jù)或者變量,會重新加載數(shù)據(jù)(觸發(fā)行內(nèi)數(shù)據(jù)處理)從而觸發(fā)table的更新,導致兩次執(zhí)行,一次有你操作的數(shù)據(jù),一次是重置table。
所以有兩種方法解決,第一種是不觸發(fā)table的更新,還有一種是更新后,獲取第一次觸發(fā)的結(jié)果。
- 如果不是因為行內(nèi)處理數(shù)據(jù)引起,則直接看第二種方法
第一種方法就是,改變你data的數(shù)據(jù)處理方式,不在行內(nèi)進行數(shù)據(jù)處理。
<el-input clearable placeholder="搜索..." prefix-icon="el-icon-search" v-model="serarchText"></el-input> <el-table border stripe ? ? ?:data="transData" ? ? ?:header-cell-style="{background:'#409EFF',color:'#FFF'}" ? ? ?@selection-change="handleRoleChange" > </el-table>
<script lang="ts" setup> const roleData = ref(); roleData.value = [ ? { ? ? id: 1, ? ? code: "ROLE_TEST0_1", ? ? name: "測試角色3", ? ? enabled: true, ? }, ? { ? ? id: 3, ? ? code: "ROLE_TEST0_3", ? ? name: "系統(tǒng)開發(fā)員", ? ? enabled: true, ? }, ]; let serarchText = ref(); const transData = ref([...roleData.value]) watch(serarchText,(newValue)=>{ ? if(newValue){ ? ? let tempdata = roleData.value ? ? transData.value = tempdata.filter((data) => !newValue || data.name.includes(newValue)) ? }else{ ? ? transData.value =roleData.value ? } }) </script>
第二種就是繼續(xù)使用行內(nèi)數(shù)據(jù)處理,table添element-ui內(nèi)自帶的屬性 加row-key以及type="selection"添加reserve-selection,在數(shù)據(jù)更新之后保留第一次觸發(fā)的數(shù)據(jù)。
reserve-selection
:僅對 type=selection 的列有效,類型為 Boolean,為 true 則會在數(shù)據(jù)更新之后保留之前選中的數(shù)據(jù)(需指定 row-key)row-key
:行數(shù)據(jù)的 Key,用來優(yōu)化 Table 的渲染;在使用 reserve-selection 功能與顯示樹形數(shù)據(jù)時,該屬性是必填的。
<el-table border stripe ? ? ? ? ? :data="roleData.filter((data) => !serarchText || data.name.includes(serarchText))" ? ? ? ? ? :header-cell-style="{background:'#409EFF',color:'#FFF'}" ? ? ? ? ? @selection-change="handleRoleChange" ? ? ? ? ? :row-key="(row)=>{row.id}"> ? <el-table-column align="center" type="selection" :reserve-selection="true" width="50" /> ? <el-table-column align="center" label="ID" prop="id" width="50" /> ? <el-table-column align="center" label="角色名稱" prop="name" width="150" /> ? <el-table-column align="center" label="角色代碼" prop="code" width="120" /> </el-table>
最近試這個:reserve-selection=“true”,會導致在搜索值變化的時候,造成所選值的更改反轉(zhuǎn)之類的
element-ui的@selection-change學習總結(jié)
<template> <el-table ref="multipleTable" :data="tableData3" tooltip-effect="dark" style="width: 100%" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55"> </el-table-column> <el-table-column label="日期" width="120"> <template slot-scope="scope">{{ scope.row.date }}</template> </el-table-column> <el-table-column prop="name" label="姓名" width="120"> </el-table-column> <el-table-column prop="address" label="地址" show-overflow-tooltip> </el-table-column> </el-table> <div style="margin-top: 20px"> <el-button @click="toggleSelection([tableData3[1], tableData3[2]])">切換第二、第三行的選中狀態(tài)</el-button> <el-button @click="toggleSelection()">取消選擇</el-button> </div> </template>
<script> export default { data() { return { tableData3: [{ date: '2016-05-03', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-02', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-04', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-01', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-08', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-06', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }, { date: '2016-05-07', name: '王小虎', address: '上海市普陀區(qū)金沙江路 1518 弄' }], multipleSelection: [] } }, methods: { toggleSelection(rows) { if (rows) { rows.forEach(row => { this.$refs.multipleTable.toggleRowSelection(row); }); } else { this.$refs.multipleTable.clearSelection(); } }, handleSelectionChange(val) { this.multipleSelection = val; } } } </script>
handleSelectionChange(val) { this.multipleSelection = val; }
//val 為選中數(shù)據(jù)的集合
通過this.multipleSelection.prop字段 取得每一個選項的值,prop字段就是表格里面子項的prop值。
this.multipleSelection.length為選擇了多少項。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue項目input標簽checkbox,change和click綁定事件的區(qū)別說明
這篇文章主要介紹了vue項目input標簽checkbox,change和click綁定事件的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08Vue+Element ui 根據(jù)后臺返回數(shù)據(jù)設置動態(tài)表頭操作
這篇文章主要介紹了Vue+Element ui 根據(jù)后臺返回數(shù)據(jù)設置動態(tài)表頭操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09