網站首頁 編程語言 正文
可拖拽表格的難點:
(1)拖拽表格行順序,自動進行保存順序
解析:要根據表格行順序進行下載,這就意味著保存與初始化傳參需要按照表格拖拽后順序
(2)下載表格傳參是[1,2,3]數字形式,我們保存與初始化是對象數組,
解析:這個時候我們可以直接采取給{[1,2,3]}數組包層對象
(3)表格行選擇是通過復選框,這個時候我們需要去重,避免傳參重復new Set
的使用
解析: let selectedNumbers = new Set(); // 使用 Set 來存儲唯一的 number 值
- 通過給el-table元素添加key屬性,可以確保在數據發生變化時,Vue會重新渲染el-table組件,從而正確地更新表格的顯示。
-
給el-table添加
row-key="id"
的作用是為表格的每一行指定一個唯一的key值。這個key值通常是數據源中每一條數據的唯一標識,比如id字段。
ref=“dataTable” 的用法 | |
---|---|
this.$refs.dataTable.toggleAllSelection() |
用于切換所有行的選中狀態,如果當前的選中狀態是全部選中,則會取消所有行的選中狀態;如果當前的選中狀態是部分選中或未選中,則會選中所有行。 |
this.$refs.dataTable.clearSelection() | 清空選中的行 |
this.$refs.dataTable.toggleRowSelection(rowData) | 切換某一行的選中狀態 |
this.$refs.dataTable.data | 獲取 el-table 的數據 |
this.$refs.dataTable.selection | 獲取 el-table 的選中行數據 |
<div>
<task-suggest v-model="taskName" @id-select="taskidSel" />
</div>
<div style="margin-top:20px">
<el-table :key="rendertable" ref="dataTable" row-key="id" :data="tableData" border class="draggable-table"
style="width: 30%" @selection-change="handleSelectionChange">
<el-table-column :reserve-selection="true" type="selection"> </el-table-column>
<el-table-column prop="name" label="表名"> </el-table-column>
</el-table>
</div>
------------------------------------
import Sortable from 'sortablejs'
rendertable: "",
allSelect: [],//選中的表格行形成的數組
numberArr: [],
tableData: [
{
name: "表名1",
id: 1,//添加id為了方便區分(row-key)
number: 17//下載的參數
},
{
name: "表名2",
id: 2,
number: 1
},
],
----------------------------------
mounted() {
this.setDraggableTable();
this.init();
},
methods: {
init() {
let obj_get = {
taskId: this.value1,
formName: this.formTableName,
}
GetFormData(obj_get).then((res) => {
this.result = res.data.data
//如果初次進頁面未保存,表格默認全選
if (this.result.length == 0) {
this.$refs.dataTable.toggleAllSelection()
return false
}
//如果有數據,直接賦值給表格
this.tableData = this.result[0].value.list
//如果表格number與返回數據中的number一致,就選擇當前行
this.tableData.forEach(item => {
if (item.ishow == 1) {
console.log("item", item);
this.$refs.dataTable.toggleRowSelection(item);
delete item.ishow
}
})
})
},
//表格拖拽行的方法
setDraggableTable() {
const tbody = document.querySelector('.el-table__body-wrapper tbody')
const _this = this
Sortable.create(tbody, {
onEnd({ newIndex, oldIndex }) {
const currRow = _this.tableData.splice(oldIndex, 1)[0]
_this.tableData.splice(newIndex, 0, currRow)
console.log(_this.tableData);
}
})
},
//表格選擇多行的方法
handleSelectionChange(val) {
this.allSelect = val
this.numberArr = []
let selectedNumbers = new Set(); // 使用 Set 來存儲唯一的 number 值
this.tableData.forEach(item => {
val.forEach((it) => {
if (item.number === it.number && !selectedNumbers.has(item.number)) {
selectedNumbers.add(item.number);
console.log('2', selectedNumbers);
}
});
});
this.numberArr = Array.from(selectedNumbers); // 將 Set 轉換為數組
},
//新增、保存
switcSave() {
this.tableData.forEach((item, index) => {
this.allSelect.forEach((it) => {
if (item.number === it.number) {
item['ishow'] = 1
} else {
item['ishow']
}
})
})
console.log(this.tableData);
this.obj_add = {
taskId: this.value1,
formName: this.formTableName,
formNameRemark: "一鍵生成報表",
Key: { taskId: this.value1, },
value: { list: this.tableData },
};
if (this.result.length > 0) {
this.obj_add.id = this.result[0].id
}
console.log('1', this.obj_add);
switchFormData(this.obj_add).then(res => {
console.log('0001', res);
if (res.status == 200) {
this.$message.success('保存成功');
this.init()
} else {
this.$message.error('保存失敗');
}
})
},
//生成報表pdf or word
handlePreview(fileType) {
//下載表
let tmpFileName = fileType == "pdf" ? '總報表.pdf' : "總報表.doc"
let isPDF = fileType == "pdf" ? true : false//pdf傳true,word傳false
DownloadAllFile(this.value1, isPDF, this.numberArr).then(res => {
const blobUrl = window.URL.createObjectURL(res.data)
this.downloadFileByBlob(blobUrl, tmpFileName)
//如果下載成功就添加
if (res.status == 200) {
this.$message.success('下載成功');
this.switcSave()
} else {
this.$message.error('下載失敗');
}
})
},
// 保存表
downloadFileByBlob(blobUrl, filename) {
const eleLink = document.createElement('a')
eleLink.download = filename
eleLink.style.display = 'none'
eleLink.href = blobUrl
// 觸發點擊
document.body.appendChild(eleLink)
eleLink.click()
// 然后移除
document.body.removeChild(eleLink)
setTimeout(() => {
this.loadingPdf = false
this.loadingWord = false
}, 8000)
},
//組件方法可以拿到每個任務的id
taskidSel(taskid) {
this.value1 = taskid
console.log('hi', taskid);
},
},
updated() {
this.setDraggableTable();
},
原文鏈接:https://blog.csdn.net/Ybittersweet/article/details/131397112
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-07-19 springboot繼承swagger3
- 2022-08-10 讀取Go項目中的配置文件的方法_Golang
- 2022-07-12 修改docker官方鏡像內部內容并重新build鏡像
- 2022-07-16 結構體通過成員變量獲取主結構體地址(struct)
- 2022-07-03 el-cascader回顯失敗;el-cascader回顯不出來
- 2023-03-04 C語言模擬實現字符串庫函數的示例講解_C 語言
- 2022-03-24 使用Redis如何設置永久有效_Redis
- 2022-05-11 continue,return,break的區別
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支