elementUi 中table表尾插入行的實(shí)例
elementUi table表尾插入行
<template>
<div>
<el-table stripe class="jx-table" :data="tableData" border ref="table" style="width: 100%">
<el-table-column prop="firstColumn" :label="firstColLabel" :resizable="false"></el-table-column>
<el-table-column prop="date" label="時(shí)間" :resizable="false"></el-table-column>
<el-table-column prop="name" label="姓名" :resizable="false"></el-table-column>
<el-table-column prop="province" label="地點(diǎn)" :resizable="false"></el-table-column>
</el-table>
</div>
</template>
<script>
import { map } from "lodash";
export default {
created() {
this.init();
},
data() {
return {
fullTableData: [],
firstColLabel: "",
tableFoot: [],
allDate: {
TabData: {
result: [
{
date: "2016-05-02",
name: "王小虎",
province: "上海",
firstColumn: 1
},
{
date: "2016-05-04",
name: "王小虎",
province: "上海",
title: 12
},
{
date: "2016-05-01",
name: "王小虎",
province: "上海",
title: 123
},
{
date: "2016-05-03",
name: "王小虎",
province: "上海",
title: 124
}
],
avg: { date: "---", name: "--", province: "-" },
count: { date: "_", name: "__", province: "___" }
},
csNick: "標(biāo)題"
}
};
},
methods: {
init() {
const { result, avg, count } = this.allDate.TabData;
this.fullTableData = map(result, (object, key) => {
return {
firstColumn: object.title,
...object
};
});
count.firstColumn = "匯總";
avg.firstColumn = "均值";
this.tableFoot = [count, avg];
this.firstColLabel = this.allDate.csNick;
}
},
computed: {
tableData() {
const tbody = this.fullTableData;
return tbody.length ? [...tbody, ...this.tableFoot] : [];
}
}
};
</script>
<style lang="scss" scoped> </style>
效果圖如下:

element table 自定義表尾
簡(jiǎn)單介紹下項(xiàng)目:后端管理系統(tǒng),頁(yè)面樣式用的是 element,數(shù)據(jù)綁定用的是 vue.js。
功能需求:需要添加繳藥記錄,這些記錄要顯示在一個(gè) table 中,但是 table 末尾一行不做數(shù)據(jù)展示,只負(fù)責(zé)觸發(fā)數(shù)據(jù)新增的動(dòng)作。
先看最終實(shí)現(xiàn)的效果

紅框處就是自定義的表尾,選擇藥品處的下拉框,每當(dāng)選中一個(gè)藥品的時(shí)候,當(dāng)前 table 就多出一行選中過(guò)的藥品信息。
實(shí)現(xiàn)過(guò)程
由于用到 element 的 table 標(biāo)簽,所以 table 的渲染,取決于 data 屬性的值(tablelist),代碼如下
<el-table style="width: 1040px" :data="tablelist" border>
<el-table-column prop="drugName" label="藥品名稱" min-width="20%"> </el-table-column>
<el-table-column prop="unit" label="用藥規(guī)格" min-width="20%"> </el-table-column>
<el-table-column prop="stock" label="庫(kù)存數(shù)量(本人)" min-width="20%"> </el-table-column>
<el-table-column prop="number" label="繳存數(shù)量" min-width="20%"> </el-table-column>
</el-table>
一開(kāi)始的思路是,tablelist 中預(yù)制一條數(shù)據(jù),然后做狀態(tài)標(biāo)識(shí)。當(dāng)渲染 table 行的時(shí)候,根據(jù)狀態(tài)標(biāo)識(shí),判斷該行到底是添加上的數(shù)據(jù),還是要觸發(fā)添加操作的表尾。然后按照這個(gè)思路執(zhí)行的結(jié)果是:

然后反思,發(fā)現(xiàn)原因。每次添加,都往 tablelist 數(shù)組后面添加一個(gè)元素,導(dǎo)致本來(lái)應(yīng)該是表尾的那一行,跑到了上面。那繼續(xù)解決問(wèn)題,我想到了對(duì) tablelist 排序,然后讓表尾那一行每次排在數(shù)組最后一個(gè)位置。雖然實(shí)現(xiàn)了,但是弊端也很大。
- 每次排序都要涉及到數(shù)組遍歷頁(yè)面渲染,這些都是性能開(kāi)銷。
- 當(dāng)我保存頁(yè)面的數(shù)據(jù)的時(shí)候,我還需要對(duì) tablelist 的數(shù)據(jù)做篩選,剔除掉表尾那行數(shù)據(jù)??偠灾壿嫼軓?fù)雜,然后我就想出了另外一種方法。
先看代碼
<el-table style="width: 1040px" :data="tablelist.concat([{drugId:0}])" border>
<el-table-column prop="drugName" label="藥品名稱" min-width="20%"> </el-table-column>
<el-table-column prop="unit" label="用藥規(guī)格" min-width="20%"> </el-table-column>
<el-table-column prop="stock" label="庫(kù)存數(shù)量(本人)" min-width="20%"> </el-table-column>
<el-table-column prop="number" label="繳存數(shù)量" min-width="20%"> </el-table-column>
</el-table>
首先,為了保證保存頁(yè)面數(shù)據(jù)的時(shí)候,處理邏輯簡(jiǎn)單,只讓 tablelist 存儲(chǔ)需要提交到后臺(tái)的數(shù)據(jù)。那么 table 表格末尾那一行的數(shù)據(jù),怎么渲染上呢。在給 table 的 data 屬性賦值的時(shí)候,調(diào)用 tablelist 的 concat(),方法。給 tablelist 再添加一個(gè)數(shù)組,該數(shù)組只有一個(gè)元素,就是用來(lái)渲染表尾的元素。這樣就保證了提交到后臺(tái)數(shù)據(jù)準(zhǔn)確性,table 行數(shù)據(jù)排列的準(zhǔn)確性以及表尾行始終固定。
小結(jié)一下:其實(shí)解決的方法很簡(jiǎn)單。第一,由于是表尾和其他行有區(qū)別,而且我們的業(yè)務(wù)邏輯是表尾數(shù)據(jù)不提交,所以想到兩部分?jǐn)?shù)據(jù)要做數(shù)據(jù)隔離。第二,table 渲染的時(shí)候,又需要兩部分?jǐn)?shù)據(jù)是一個(gè)整體,所以想到集合的相加。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue實(shí)現(xiàn)圓環(huán)進(jìn)度條的示例
這篇文章主要介紹了Vue實(shí)現(xiàn)圓環(huán)進(jìn)度條的示例,幫助大家更好的理解和使用前端框架進(jìn)行開(kāi)發(fā),感興趣的朋友可以了解下2021-02-02
vue3 onMounted異步函數(shù)同步請(qǐng)求async/await實(shí)現(xiàn)
這篇文章主要為大家介紹了vue3 onMounted初始化數(shù)據(jù)異步函數(shù)/同步請(qǐng)求async/await實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Vue.js實(shí)現(xiàn)價(jià)格計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Vue.js實(shí)現(xiàn)價(jià)格計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Vue3新?tīng)顟B(tài)管理工具實(shí)例詳解
Vue3公布曾經(jīng)有一段時(shí)間了,它采納了新的響應(yīng)式零碎,而且構(gòu)建了一套全新的 Composition API,下面這篇文章主要給大家介紹了關(guān)于Vue3新?tīng)顟B(tài)管理工具的相關(guān)資料,需要的朋友可以參考下2022-03-03
vue實(shí)現(xiàn)倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)倒計(jì)時(shí)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
Vue3項(xiàng)目搭建的詳細(xì)過(guò)程記錄
使用VUE3開(kāi)發(fā)很久了,但一直沒(méi)進(jìn)行總結(jié)和記錄,忙里偷閑整理搭建一套VUE3項(xiàng)目腳手架,下面這篇文章主要給大家介紹了關(guān)于Vue3項(xiàng)目搭建的詳細(xì)過(guò)程,需要的朋友可以參考下2022-10-10
vue-extend和vue-component注冊(cè)一個(gè)全局組件方式
這篇文章主要介紹了vue-extend和vue-component注冊(cè)一個(gè)全局組件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
vue中如何使用lodash的debounce防抖函數(shù)
防抖函數(shù) debounce 指的是某個(gè)函數(shù)在某段時(shí)間內(nèi),無(wú)論觸發(fā)了多少次回調(diào),都只執(zhí)行最后一次,在Vue中使用防抖函數(shù)可以避免在頻繁觸發(fā)的事件中重復(fù)執(zhí)行操作,這篇文章主要介紹了vue中使用lodash的debounce防抖函數(shù),需要的朋友可以參考下2024-01-01

