今天接到一個需求,就是打印頁面需要自動分頁,並且添加分頁頁碼。
查找了很多插件或者文檔都沒有好的處理方法,所以准備自己寫一個函數來處理。
頁面樣式:


要求:第一個頁面添加總體的大表單,第二個頁面添加小表單。並且自動分頁,添加頁碼。table列表中如果有note字段的話,需要另起一行添加備注,如果沒有則隱藏,字數最多為200字。
先說思路:
1. 可以將頁面分為2種類型,第一種為首頁,第二種為子頁面:主要判斷不同頁面中列表最多能展示多少條數據
2.計算數據總共能分為多少數組:也就是分為多少頁面
計算的思路:每行的行高 = (存在note的話 ?(Math.ceil(note的字數 / 80) * 30 + 每行的固定高度) :每行的固定高度 );
計算每個頁面添加幾行數據: 循環所有的列表數據,然后將上面的行高相加,跟頁面的高度進行判斷,然后取數組的數據添加到新的數組中。
代碼:
/**
* @export
* @param {*} arr 數組長度
* @param {*} tableHeight 第一頁-列表的高度
* @param {*} otherHeight 第二頁-列表的高度
* @param {*} 每行數據的高度為30
* @param {*} 每行備注的高度為30
*/
export default function calculation (arr,tableHeight,otherHeight){
const data = [];
let dataIndex = 0;
let totalH = 0;
let start = 0;
let end = 0;
arr.map((item,index) =>{
totalH += item.note ? (noteHeight(item.note) + 30) : 30;
// 如果只有一頁的話,沒有超過全部高度的話,則將所有arr賦值給data,如果超過高度,則需要多個數組
if(dataIndex === 0){
if(totalH < tableHeight){
data[0] = arr;
}else{
data[dataIndex] = arr.slice(0, index);
// 重置高度
totalH = 0;
dataIndex++;
start = index;
}
}
// 如果超過一頁的話,並且是填充滿了整個頁面
if(dataIndex > 0 && totalH >= otherHeight){
totalH = 0;
end = index;
data[dataIndex] = arr.slice(start, end)
start = end;
dataIndex++;
}
// 如果超過一頁,沒有填充滿,說明是最后一頁
if(dataIndex > 0 && totalH < otherHeight){
data[dataIndex] = arr.slice(start, arr.length)
}
})
return data;
}
// 計算note的高度
function noteHeight(note){
let noteH = Math.ceil((note.length / 80)) * 30;
return Number(noteH);
}
調用函數:
pageArr:打印的所有table數組
1000:第一個頁面的高度(展示列表的高度)
1200:第二個頁面的高度(展示列表的高度)
const tableList = calculation(pageArr,1000,1200);
console.log('tableList', tableList);
得到數據格式:

之后就可以得到每個頁面展示的條數了。剩下的就是樣式的調整。
