电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

vue實(shí)現(xiàn)滾動(dòng)加載的表格

瀏覽:3日期:2022-09-29 09:42:35
目錄實(shí)現(xiàn)效果滾動(dòng)加載知識(shí)儲(chǔ)備組件封裝1. 組件命名2. 提供的props3.使用舉例組件封裝總結(jié)1.盡可能地使用computed計(jì)算屬性2.給表格提供插槽另一種滾動(dòng)加載數(shù)據(jù)的實(shí)現(xiàn)實(shí)現(xiàn)效果

vue實(shí)現(xiàn)滾動(dòng)加載的表格

碼云地址

滾動(dòng)加載知識(shí)儲(chǔ)備

參考ant-design-vue中l(wèi)ist滾動(dòng)加載的思路,使用vue-infinite-scroll加上vue-virtual-scroller作為解決方案。

組件封裝

因?yàn)檎麄€(gè)系統(tǒng)使用的框架是ant-dsign-vue,所以組件封裝的變量命名風(fēng)格盡可能的與a-table保持一致。

1. 組件命名

XScrollTable.vue

2. 提供的props

必填字段:

dataSource -- 數(shù)據(jù)源

columns -- 表格展示的列信息,插槽用法和a-table不完全一樣,下面會(huì)提到。

itemSize -- 每行數(shù)據(jù)的高度

選填字段:

rowKey -- 數(shù)據(jù)主鍵標(biāo)識(shí),默認(rèn)為’key’

height -- 表格展示區(qū)域的高度,默認(rèn)為500

pageSize -- 表格滾動(dòng)每次滾動(dòng)加載的數(shù)據(jù)量,默認(rèn)為30

infiniteScrollDistance -- 表格觸發(fā)加載的距離條件,默認(rèn)為10

rowSelection -- 表格多選配置,已處理的屬性有selectedRowKeys、onChange、width。默認(rèn)為null,不展示多選。

3.使用舉例

首先初始化10000條數(shù)據(jù),放在表格中進(jìn)行顯示。

let data = new Array(10000).fill(1);data = data.map((item1, index) => { let item = {}; item.id = index; item.age = '姓名'; item.address = '地址'; return item;});export default data;

注意:這里之所以加了fill(1),是因?yàn)橥ㄟ^Array構(gòu)造函數(shù)產(chǎn)生的數(shù)據(jù)全是empty,沒有數(shù)組索引,無法進(jìn)行map循環(huán)。

加載表格

<x-scroll-table row-key='id':itemSize='22':rowSelection='{selectedRowKeys: selectedRowKeys, onChange: onSelectChange,width:50}':columns='columns':dataSource='data'> <template slot='action' slot-scope='{record,text}'><a @click='handleDetail(record)'>詳情</a> </template></x-scroll-table>組件封裝總結(jié)1.盡可能地使用computed計(jì)算屬性

雖然只是簡單地封裝了表格,但還是需要定義了很多的屬性,使用計(jì)算屬性代替在data里定義變量,可以減少變量的維護(hù)工作量。

整個(gè)組件只定義了一個(gè)page變量,其它都是使用計(jì)算屬性的方式。

data() { return { // 當(dāng)前展示頁數(shù) page: 1, }; },

舉個(gè)栗子:

通過page屬性定義一個(gè)計(jì)算屬性來表示當(dāng)前已經(jīng)加載的數(shù)據(jù)量

// 展示的最大下標(biāo)數(shù)量,存在比總數(shù)據(jù)條數(shù)多的情況,使用slice解決這個(gè)問題 lastIndex() { return this.pageSize * this.page; },

通過這個(gè)計(jì)算屬性同時(shí)衍生出其他的計(jì)算屬性

// 表示表格數(shù)據(jù)是否已經(jīng)加載完畢 busy() { return this.lastIndex >= this.dataSource.length; }, // 當(dāng)前已經(jīng)加載到RecycleScroller滾動(dòng)組件的數(shù)據(jù) tableData() { return this.dataSource.slice(0, this.lastIndex); },

通過一個(gè)page屬性衍生出一系列的計(jì)算屬性,我只需要維護(hù)page屬性,其他都是自動(dòng)計(jì)算的。

2.給表格提供插槽

首先通過表格傳入的columns參數(shù),計(jì)算出需要渲染的列,這里同樣使用計(jì)算屬性。

// 將列數(shù)組轉(zhuǎn)為列對(duì)象,將columnFieldKey值作為鍵,數(shù)組項(xiàng)作為值 columnMap() { return this.columns.reduce((returnValue, cur) => {returnValue[cur[columnFieldKey]] = cur;return returnValue; }, {}); }, // 取數(shù)組里的列鍵值--columnFieldKey columnKeys() { return this.columns .map(item => item[columnFieldKey]); },

在template中遍歷

<div v-for='(key) of columnKeys' :key='key' : > <slot v-if='izSlotRender(columnMap[key])':name='columnMap[key].scopedSlots.customRender':record='row':text='row[key]'> </slot> <span v-else :title='row[key]'>{{ renderItem(row, index, key) }}</span></div> // 是否使用插槽渲染 izSlotRender(item) { return item.scopedSlots && item.scopedSlots.customRender; },

如果在定義columns時(shí)傳入了scopedSlots和customRender,將使用插槽渲染。

但是這里存在和ant-design-vue中表格插槽渲染不一樣的地方。

我通過slot標(biāo)簽定義的插槽,在父組件獲取插槽參數(shù)的時(shí)候,只能使用slot-scope='{record,text}'對(duì)象解構(gòu)的方式。而ant-design-vue表格是可以直接使用slot-scope='record,text'獲取參數(shù)的。

另一種滾動(dòng)加載數(shù)據(jù)的實(shí)現(xiàn)

table數(shù)據(jù)多的時(shí)候打開頁面會(huì)加載一會(huì)才顯示數(shù)據(jù),這樣體驗(yàn)不好,所以要做滾動(dòng)加載數(shù)據(jù)

<el-table :data='materielList' height='250'><el-table-column prop='eventId' label='事件ID'> <template scope='scope'><label>{{eventMap[scope.row.eventId] == null ? ’--’: eventMap[scope.row.eventId].sn}}</label> </template></el-table-column><el-table-column prop='title' label='對(duì)應(yīng)事件'> <template scope='scope'><label>{{eventMap[scope.row.eventId] == null ? ’--’: eventMap[scope.row.eventId].title}}</label> </template></el-table-column><el-table-column prop='age' label='負(fù)責(zé)人'> <template scope='scope'><label>{{eventMap == null || eventMap[scope.row.eventId] == null || eventMap[scope.row.eventId].personalInformation == null ? ’--’: eventMap[scope.row.eventId].personalInformation.name}}</label> </template></el-table-column><el-table-column prop='birthday' label='物料名稱'> <template scope='scope'><label>{{materirlName}}</label> </template></el-table-column><el-table-column prop='idcardNo' label='狀態(tài)'> <template scope='scope'><label>{{formatType(scope.row.type)}}</label> </template></el-table-column><el-table-column prop='relationship' label='數(shù)量'> <template scope='scope'><label>{{formatUseNum(scope.row.useNum)}}</label> </template></el-table-column><el-table-column prop='ethtic' label='使用時(shí)間'> <template scope='scope'><label>{{changeTime(scope.row.createOn)}}</label> </template></el-table-column> </el-table>

下面是js部分 

methods: { init (param) {let id = param.param && param.param.idif(id){this.start = 0 MaterialRecordService.query({param: {baseId: this.baseId, materialId: id},start: this.start,limit: 30}).then(rsp => {//初次請(qǐng)求數(shù)據(jù),30條 this.start += 30 this.materielList = rsp.data MissionEventService.microList({ids: rsp.data.map(n => n.eventId)}).then(rsp3 => {this.eventMap = {}rsp3.data.forEach(n => (this.eventMap[n.id] = n)) }) })} }, onScroll() { let inner = document.querySelector(’.el-table__body-wrapper’); if(inner.scrollHeight - inner.scrollTop <= inner.clientHeight){//為true時(shí)證明已經(jīng)到底,可以請(qǐng)求接口if(this.flag){//設(shè)一個(gè)滾動(dòng)事件的開關(guān),(在data里面聲明 flag: true)默認(rèn)為true this.flag = false MaterialRecordService.query({param: {baseId: this.baseId, materialId: this.entity.id},start: this.start,limit:30}).then(rsp => {//每次加載30條 this.materielList = this.materielList.concat(rsp.data) this.start += 30 this.flag = true MissionEventService.microList({ids: rsp.data.map(n => n.eventId)}).then(rsp3 => { rsp3.data.forEach(n => (this.eventMap[n.id] = n)) }) }) } } }},mounted () { this.init({...this.param})<br>//監(jiān)聽表格dom對(duì)象的滾動(dòng)事件 document.querySelector(’.el-table__body-wrapper’).addEventListener(’scroll’, this.onScroll); }

在這里我要說明一下監(jiān)聽的dom對(duì)象是哪一個(gè)

vue實(shí)現(xiàn)滾動(dòng)加載的表格

我還要解釋下scrollHeight、scrollTop、clientHeight這三個(gè)屬性

vue實(shí)現(xiàn)滾動(dòng)加載的表格

這是我截的別人的圖加了幾筆

scrollHeight:網(wǎng)頁正文全文高度,

scrollTop:網(wǎng)頁滾動(dòng)的高度,

clientHeight:網(wǎng)頁可視區(qū)域的高度

以上就是vue實(shí)現(xiàn)滾動(dòng)加載的表格的詳細(xì)內(nèi)容,更多關(guān)于vue 滾動(dòng)加載的表格的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 集装箱箱号识别_自重载重图像识别_铁路车号自动识别_OCR图像识别 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 四川成人高考_四川成考报名网 | 合肥仿石砖_合肥pc砖厂家_合肥PC仿石砖_安徽旭坤建材有限公司 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 存包柜厂家_电子存包柜_超市存包柜_超市电子存包柜_自动存包柜-洛阳中星 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 全自动包衣机-无菌分装隔离器-浙江迦南科技股份有限公司 | IWIS链条代理-ALPS耦合透镜-硅烷预处理剂-上海顶楚电子有限公司 lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 郑州外墙清洗_郑州玻璃幕墙清洗_郑州开荒保洁-河南三恒清洗服务有限公司 | Brotu | 关注AI,Web3.0,VR/AR,GPT,元宇宙区块链数字产业 | 仪器仪表网 - 永久免费的b2b电子商务平台 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | TwistDx恒温扩增-RAA等温-Jackson抗体-默瑞(上海)生物科技有限公司 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | 网站建设-网站制作-网站设计-网站开发定制公司-网站SEO优化推广-咏熠软件 | 硫化罐-电加热蒸汽硫化罐生产厂家-山东鑫泰鑫智能装备有限公司 | 华夏医界网_民营医疗产业信息平台_民营医院营销管理培训 | 丹佛斯压力传感器,WISE温度传感器,WISE压力开关,丹佛斯温度开关-上海力笙工业设备有限公司 | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 玉米加工设备,玉米深加工机械,玉米糁加工设备.玉米脱皮制糁机 华豫万通粮机 | 布袋除尘器-单机除尘器-脉冲除尘器-泊头市兴天环保设备有限公司 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 哔咔漫画网页版在线_下载入口访问指引 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 重庆小面培训_重庆小面技术培训学习班哪家好【终身免费复学】 | 全球化工设备网—化工设备,化工机械,制药设备,环保设备的专业网络市场。 | 下水道疏通_管道疏通_马桶疏通_附近疏通电话- 立刻通 | 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 专业生产动态配料系统_饲料配料系统_化肥配料系统等配料系统-郑州鑫晟重工机械有限公司 | 中红外QCL激光器-其他连续-半导体连续激光器-筱晓光子 | 海南在线 海南一家| 大型果蔬切片机-水果冬瓜削皮机-洗菜机切菜机-肇庆市凤翔餐饮设备有限公司 | 西安中国国际旅行社(西安国旅) | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 400电话_400电话申请_888元包年_400电话办理服务中心_400VIP网 | 医养体检包_公卫随访箱_慢病随访包_家签随访包_随访一体机-济南易享医疗科技有限公司 |