vue3實現(xiàn)多個表格同時滾動并固定表頭
說明:這里需分為兩種情況來做。第一種親情況就是沒有修改過el-table這個組件的樣式;第二種情況就是修改過el-table組件的樣式。第一種較為簡單就簡單略過,這里主要提及第二種做法。
1.需求效果
2.第一種沒有修改過el-table這個組件的樣式的做法
(1)直接看大佬vue2的做法
element ui 實現(xiàn)多個table同時滾動,橫向縱向滾動
代碼如下:
<script src="http://unpkg.com/vue/dist/vue.js"></script> <script src="http://unpkg.com/element-ui@2.15.6/lib/index.js"></script> <div id="app"> <template> <el-table ref="table1" border="10" height="150" :data="tableData" style="width: 800px"> <el-table-column prop="date" label="日期" width="300"> </el-table-column> <el-table-column prop="name" label="姓名" width="300"> </el-table-column> <el-table-column width="300px" prop="address" label="地址"> </el-table-column> <el-table-column width="300px" prop="address" label="地址"> </el-table-column> </el-table> <el-table ref="table2" border="10" height="150" :data="tableData" style="width: 800px"> <el-table-column prop="date" label="日期" width="300"> </el-table-column> <el-table-column prop="name" label="姓名" width="300"> </el-table-column> <el-table-column width="300px" prop="address" label="地址"> </el-table-column> <el-table-column width="300px" prop="address" label="地址"> </el-table-column> </el-table> </template> </div>
var Main = { data() { return { tableData: [{ date: '2016-05-02', name: '王小虎', address: '上海市' }, { date: '2016-05-04', name: '王小虎', address: '上海市' }, { date: '2016-05-04', name: '王小虎', address: '上海市' }, { date: '2016-05-04', name: '王小虎', address: '上海市' }], dom1: null, dom2: null } }, mounted() { this.dom1 = this.$refs.table1.bodyWrapper this.dom2 = this.$refs.table2.bodyWrapper this.listenerScroll() }, methods: { listenerScroll() { this.dom2.addEventListener('scroll', () => { // 橫滾 this.dom1.scrollLeft = this.dom2.scrollLeft // 豎滾 this.dom1.scrollTop = this.dom2.scrollTop }) } } } var Ctor = Vue.extend(Main) new Ctor().$mount('#app')
(2)以下是vue3寫法(可以直接使用看看效果,沒效果的就看第二種方法)
<template> <div> <el-table ref="table1" :data="tableData" style="width: 100%; margin-bottom: 20px" height="200px"> <el-table-column prop="date" label="Date" width="180"></el-table-column> <el-table-column prop="name" label="Name" width="180"></el-table-column> </el-table> <el-table ref="table2" :data="tableData" style="width: 100%" height="200px"> <el-table-column prop="address" label="Address" width="180"></el-table-column> <el-table-column prop="tag" label="Tag" width="180"></el-table-column> </el-table> </div> </template> <script setup> import { ref, onMounted } from 'vue' import { ElTable } from 'element-plus' const table1 = ref(null) const table2 = ref(null) let overElement = "" onMounted(() => { const table1Wrapper = table1.value.$refs.bodyWrapper const table2Wrapper = table2.value.$refs.bodyWrapper console.log("table1Wrapper",table1Wrapper); table1Wrapper.addEventListener('mouseover', () => { overElement = "a" console.log("overElement1",overElement); }) table2Wrapper.addEventListener('mouseover', () => { overElement = "b" console.log("overElement2",overElement); }) table1Wrapper.addEventListener('scroll', () => { console.log("overElement3",overElement); if (overElement === "a") { console.log("overElement4",overElement); table2Wrapper.scrollTop = table1Wrapper.scrollTop } }) table2Wrapper.addEventListener('scroll', () => { console.log("overElement5",overElement); if (overElement === "b") { console.log("overElement6",overElement); table1Wrapper.scrollTop = table2Wrapper.scrollTop } }) }) const tableData = [ { date: '2016-05-03', name: 'Tom', address: 'No. 189, Grove St, Los Angeles', tag: 'Home', }, { date: '2016-05-02', name: 'Tom', address: 'No. 189, Grove St, Los Angeles', tag: 'Office', }, { date: '2016-05-04', name: 'Tom', address: 'No. 189, Grove St, Los Angeles', tag: 'Home', }, { date: '2016-05-01', name: 'Tom', address: 'No. 189, Grove St, Los Angeles', tag: 'Office' } ] </script>
3.第二種修改過el-table組件的樣式
(1)我這里是修改過el-table的滾動條樣式
(2)以下沒修改過的
(3)原因分析
從上面兩張圖片可以看出,它們區(qū)別在于輸出的(table1Wrapper )第二級一個事table標簽,一個不是table標簽。所以像第二種修改過el-table組件樣式的就不再適用第一種的寫法,因為沒有拿對節(jié)點,要拿的節(jié)點不再是.el-table__body-wrapper而是.el-scrollbar__wrap,其他寫法就與第一種寫法無異。
(4)實現(xiàn)代碼
<div> <el-table :data="tableData" id="table1" @selection-change="handleSelect" border height="40vh" scrollbar-always-on> <el-table-column width="60" fixed type="selection" />> <el-table-column width="120" prop="omsCostItemDto.costName" label="計費項名稱" /> <el-table-column prop="omsCostItemDto.profit" label="利潤" /> <el-table-column width="100" prop="omsCostItemDto.merchandiser" label="跟單員" /> </el-table> <el-table :data="tableData" id="table2" border height="40vh" scrollbar-always-on> <el-table-column width="120" prop="omsReceiveDto.writeOffAmount" label="核銷金額" /> <el-table-column width="120" prop="omsReceiveDto.notReceivedAmount" label="未收金額" /> <el-table-column width="180" prop="omsReceiveDto.receiveCreateDate" label="賬單生成時間" /> </el-table> <el-table :data="tableData" id="table3" border height="40vh" scrollbar-always-on> <el-table-column width="180" prop="omsPayDto.serviceProvidersName" label="服務商名稱" class-name="unconfirmed" /> <el-table-column width="180" prop="omsPayDto.meetName" label="應付企業(yè)名稱" /> </el-table> </div>
onMounted(() => { getList(); // 獲取列表數(shù)據(jù) setTimeout(() => { // 實現(xiàn)同步豎向滾動 nextTick(() => { let table1Wrapper = document.getElementById('table1').getElementsByClassName('el-scrollbar__wrap')[0] let table2Wrapper = document.getElementById('table2').getElementsByClassName('el-scrollbar__wrap')[0] let table3Wrapper = document.getElementById('table3').getElementsByClassName('el-scrollbar__wrap')[0] console.log("table1Wrapper",table1Wrapper); table1Wrapper.addEventListener('scroll', () => { table2Wrapper.scrollTop = table1Wrapper.scrollTop; table3Wrapper.scrollTop = table1Wrapper.scrollTop; }) table2Wrapper.addEventListener('scroll', () => { table1Wrapper.scrollTop = table2Wrapper.scrollTop; table3Wrapper.scrollTop = table2Wrapper.scrollTop; }) table3Wrapper.addEventListener('scroll', () => { table1Wrapper.scrollTop = table3Wrapper.scrollTop; table2Wrapper.scrollTop = table3Wrapper.scrollTop; }) }) }, 1000); })
(5)代碼說明
1.為什么要放到onMounted里
可以放在一個方法里,但是也需要放在onMounted,這樣就可以監(jiān)聽到滾動事件而不需要用watch來監(jiān)聽
2.為什么要使用setTimeout和nextTick
照理來說使用onMounted聲明周期就可以了,因為它的作用是掛在后,數(shù)據(jù)和節(jié)點都已經(jīng)生成;我這里不知道什么原因不使用setTimeout和nextTick就拿不到節(jié)點,數(shù)據(jù)倒是已生成(可能是我把getList(); // 獲取列表數(shù)據(jù)放在了前面)
3.重點
重點在于document.getElementById('table1').getElementsByClassName('el-scrollbar__wrap')[0]獲取正確的節(jié)點,第一種情況和第二種情況區(qū)別在于怎么拿到對的節(jié)點
4.總結(jié)
說白會出現(xiàn)第一種情況和第二種情況在于節(jié)點沒有拿對
最后
以上就是vue3實現(xiàn)多個表格同時滾動并固定表頭的詳細內(nèi)容,更多關(guān)于vue3表格同時滾動的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解vue項目中如何引入全局sass/less變量、function、mixin
這篇文章主要介紹了詳解vue項目中如何引入全局sass/less變量、function、mixin,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06vue3中reactive的對象清空所引發(fā)的問題解決方案(清空不了和清空之后再去賦值就賦值不了)
在使用reactive定義的變量時,直接賦值會失去響應式,為了清空?filters并確保響應式,可以使用Object.assign({},?filters)或者遍歷對象逐個清除屬性,本文介紹vue3中reactive的對象清空所引發(fā)的問題解決方案(清空不了和清空之后再去賦值就賦值不了),感興趣的朋友一起看看吧2025-02-02Vue路由跳轉(zhuǎn)方式區(qū)別匯總(push,replace,go)
vue項目中點擊router-link標簽鏈接都屬于聲明式導航。vue項目中編程式導航有this.$router.push(),this.$router.replace(),this.$router.go()???????。這篇文章主要介紹了Vue路由跳轉(zhuǎn)方式區(qū)別匯總(push,replace,go)2022-12-12vue-cli中的babel配置文件.babelrc實例詳解
Babel是一個廣泛使用的轉(zhuǎn)碼器,可以將ES6代碼轉(zhuǎn)為ES5代碼,從而在現(xiàn)有環(huán)境執(zhí)行。本文介紹vue-cli腳手架工具根目錄的babelrc配置文件,感興趣的朋友一起看看吧2018-02-02Vue中的數(shù)據(jù)監(jiān)聽和數(shù)據(jù)交互案例解析
這篇文章主要介紹了Vue中的數(shù)據(jù)監(jiān)聽和數(shù)據(jù)交互案例解析,在文章開頭部分先給大家介紹了vue中的數(shù)據(jù)監(jiān)聽事件$watch,具體代碼講解,大家可以參考下本文2017-07-07