基于vue實(shí)現(xiàn)分頁(yè)組件的示例代碼
分頁(yè)組件是一種用戶界面元素,用于在長(zhǎng)列表或數(shù)據(jù)集中分割內(nèi)容。它通常用于網(wǎng)頁(yè)、移動(dòng)應(yīng)用或其他軟件界面中,以便用戶能夠按頁(yè)瀏覽內(nèi)容。 分頁(yè)組件是每個(gè)開發(fā)人員必須掌握的一個(gè)組件,廣泛應(yīng)用在各個(gè)場(chǎng)所。用以用戶方便閱讀等。
組件說(shuō)明
變量顏色
@danger: #cc3600; @primary: #6b9eee; @words: #373737; @lightWords: #999; @warn: #dc6a12; @success: #7ebf50; @gray: #b4b8bc; @dark: #202020;
屬性名 | 含義 | 類型 | 必填 | 默認(rèn)值 |
---|---|---|---|---|
current | 當(dāng)前頁(yè)碼 | Number | 否 | 1 |
total | 總數(shù)據(jù)量 | Number | 否 | 0 |
limit | 頁(yè)容量 | Number | 否 | 10 |
visibleNumber | 可見(jiàn)頁(yè)碼數(shù) | Number | 否 | 10 |
事件名 | 含義 | 事件參數(shù) | 參數(shù)類型 |
---|---|---|---|
pageChange | 頁(yè)碼變化 | 新的頁(yè)碼 | Number |
# 基本樣式
新建一個(gè)Page.vue,在template寫入基本模板,通過(guò)a標(biāo)簽(當(dāng)然也可以用其他的),寫出基本模板,同時(shí)加入點(diǎn)擊事件和css樣式和一些動(dòng)態(tài)樣式,用:class來(lái)綁定動(dòng)態(tài)css類,同時(shí)要注意,只有當(dāng)頁(yè)碼數(shù)大于一的時(shí)候才會(huì)用到這個(gè)組件,否則毫無(wú)意義,同時(shí)要注意,子組件不能更改父組件要用的數(shù)據(jù),以免出現(xiàn)錯(cuò)誤
定義了一個(gè)active為加粗顏色,方便確定當(dāng)前位置,通過(guò)vfor根據(jù)生成的數(shù)組循環(huán)生成a標(biāo)簽
<template> <!-- //只有總頁(yè)數(shù)大于1的時(shí)候才會(huì)顯示,比較穩(wěn)定,選擇用vif否則沒(méi)有意義 --> <div class="pager-container" v-if="pageNumber > 1"> <!-- 子組件無(wú)權(quán)更改數(shù)據(jù),在父組件中數(shù)據(jù)更改可能會(huì)影響到其他,所以子組件只能通過(guò)發(fā)出通知的形式告訴父組件 --> <!-- 點(diǎn)擊的時(shí)候調(diào)用h函數(shù),傳入適當(dāng)?shù)膮?shù),大返回就傳入第一頁(yè),小返回就傳入當(dāng)前頁(yè)數(shù)-1 --> <!-- 注意a標(biāo)簽沒(méi)有href,如果寫上了就會(huì)存在重新加載頁(yè)面的問(wèn)題 --> <a @click="handleClick(1)" :class="{ disabled: current === 1 }" >|<<</a > <a @click="handleClick(current - 1)" :class="{ disabled: current === 1 }" ><<</a > <!-- 循環(huán)生成的數(shù)組,設(shè)置唯一值,并且判斷添加active樣式(當(dāng)前頁(yè)是否為) --> <!-- 當(dāng)前頁(yè)是多少就傳入多少 --> <a @click="handleClick(tem)" v-for="(tem, i) in numbers" :key="i" :class="{ active: tem === current }" >{{tem}}</a > <a @click="handleClick(current + 1)" :class="{ disabled: current === pageNumber }" >>></a > <a @click="handleClick(pageNumber)" :class="{ disabled: current === pageNumber }" >>>|</a > </div> </template>
基本樣式設(shè)置(less)
<style lang="less" scoped> @import "../styles/var.less"; .pager-container { display: flex; justify-content: center; margin: 20px 0; a { color: @primary; margin: 0 6px; cursor: pointer; &.disabled { color: @lightWords; cursor: not-allowed; } &.active { color: @words; font-weight: bold; cursor: text; } } } </style>
導(dǎo)出部分
計(jì)算屬性部分: 寫入了四個(gè)計(jì)算函數(shù),分別是pageNumber用來(lái)得到一共分成了多少頁(yè)(Math.ceil(this.total / this.limit); //總條數(shù)/每頁(yè)限制10條 得到頁(yè)數(shù))getMin(),getMax()得到當(dāng)前展示頁(yè)最大的那一個(gè)和最小那一個(gè)頁(yè)數(shù)
算方法:min()this.current - Math.floor(this.visibleNumber / 2);//當(dāng)前頁(yè)面減去最多顯示頁(yè)碼數(shù)的一半得到顯示最小的那個(gè) max()this.getMin + this.visibleNumber - 1;最小值+當(dāng)前頁(yè)面最多顯示幾個(gè)頁(yè)碼-1得到最大的那個(gè)頁(yè)碼 numbers():通過(guò)構(gòu)建一個(gè)數(shù)組,對(duì)數(shù)組里面添加頁(yè)數(shù),通過(guò)for循環(huán)從最小到最大,往里面添加數(shù)字形成數(shù)組(注意:每次轉(zhuǎn)跳都會(huì)重新渲染頁(yè)面,所以min和max都會(huì)不斷變化,數(shù)組的值也會(huì)不斷變化)
方法部分methods部分:
handleClick(newPage)方法拋出事件并且通知父組件,因?yàn)?nbsp; 子組件無(wú)權(quán)更改數(shù)據(jù),在父組件中數(shù)據(jù)更改可能會(huì)影響到其他,所以子組件只能通過(guò)發(fā)出通知的形式告訴父組件
- this.$emit 是 Vue 實(shí)例提供的方法,用于觸發(fā)自定義事件并通知父組件。
- “pageChange” 是自定義事件的名稱,可以根據(jù)具體情況自定義命名。
- newPage 是要傳遞給父組件的新頁(yè)碼數(shù)據(jù)。
- 通過(guò)這段代碼,當(dāng)用戶點(diǎn)擊分頁(yè)組件的頁(yè)面導(dǎo)航按鈕時(shí),會(huì)通過(guò)觸發(fā)自定義事件的方式通知父組件發(fā)生了頁(yè)碼的變化,父組件則可以根據(jù)新的頁(yè)碼進(jìn)行相應(yīng)的處理,例如重新加載對(duì)應(yīng)頁(yè)碼的數(shù)據(jù)或更新UI等。
props:部分:
<script> export default { computed: { pageNumber: function () { return Math.ceil(this.total / this.limit); //總條數(shù)/每頁(yè)限制10條 得到頁(yè)數(shù) }, getMax() { let max = this.getMin + this.visibleNumber - 1; if (max > this.pageNumber) { max = this.pageNumber; } return max; }, getMin() { //得到顯示頁(yè)碼中最小的數(shù)字 //當(dāng)前頁(yè)面減去最多顯示頁(yè)碼數(shù)的一半得到顯示最小的那個(gè) let min = this.current - Math.floor(this.visibleNumber / 2); if (min < 1) { min = 1; } return min; }, numbers() { let arr = []; for (let i = this.getMin; i <= this.getMax; i++) { arr.push(i); } return arr; }, }, methods: { handleClick(newPage) { //如果新頁(yè)面小于1則賦值為1,大于最大的頁(yè)數(shù)則賦值為最大頁(yè)數(shù),等于當(dāng)前頁(yè)數(shù)直接return if (newPage < 1) { newPage = 1; } if (newPage > this.pageNumber) { newPage = this.pageNumber; } if (newPage === this.current) { return; } //拋出事件通知父組件 //參數(shù):名字,數(shù)據(jù) this.$emit("pageChange", newPage); }, }, props: { current: { //當(dāng)前頁(yè) type: Number, default: 1, }, total: { //總條數(shù) type: Number, default: 0, }, limit: { //每頁(yè)展示多少條 type: Number, default: 10, }, // 最多顯示頁(yè)碼的個(gè)數(shù) visibleNumber: { type: Number, default: 10, }, }, }; </script>
組件部分到此為止,接下里是導(dǎo)入部分
app.vue
import Pager from "./components/Page.vue"引入組件,并且通過(guò) components: {Pager, },注冊(cè)組件
模板中寫入自定義的組件,通過(guò)total傳入總頁(yè)數(shù),current傳入當(dāng)前頁(yè)數(shù),點(diǎn)擊調(diào)用子組件拋出的事件交由父組件執(zhí)行,在methods:總定義了新的方法handlePageChange傳入新頁(yè)碼,讓當(dāng)前頁(yè)面變成新頁(yè)
最后data()方面?zhèn)魅肓嘶緮?shù)值
$event
是一個(gè)預(yù)留的特殊變量,用于傳遞事件對(duì)象或其他數(shù)據(jù)給事件處理函數(shù)。@pageChange
是監(jiān)聽自定義事件,當(dāng)自定義事件被觸發(fā)時(shí),Vue 會(huì)自動(dòng)將事件對(duì)象作為參數(shù)傳遞給事件處理函數(shù)。而 $event
則是用于接收這個(gè)事件對(duì)象的特殊變量。你可以自由選擇處理函數(shù)的形參名稱,例如這里使用了 $event
,也可以使用其他名稱,如 event
、e
等。
<template> <div> <Pager :total="total" :current="current" @pageChange="handlePageChange($event)" ></Pager> </div> <!-- <h1 v-if="score>=80">U</h1> <h2 v-else-if="score>=60">L</h2> <h3 v-else>X</h3> --> <!-- vif會(huì)添加和刪除元素,控制是否生成對(duì)應(yīng)的dom,而vshow始終都會(huì)生成dom用dom控制style:display:none,vif則是直接刪除元素 --> <!-- 使用vif可以有效的減少樹的節(jié)點(diǎn)和渲染量,但是也會(huì)導(dǎo)致樹的不穩(wěn)定,而vshow可以保持?jǐn)?shù)的穩(wěn)定,但不能減少樹的節(jié)點(diǎn)和渲染量 --> <!-- 因此,在實(shí)際開發(fā)中,顯示頻繁變化的情況下應(yīng)該用vshow,用以保持樹的穩(wěn)定,顯示狀態(tài)變化少的時(shí)候用vif,用以減少樹的節(jié)點(diǎn)和渲染量 --> </template> <script> import Pager from "./components/Page.vue"; export default { components: { Pager, }, methods: { handlePageChange(newPage) { this.current = newPage; }, }, data() { return { current: 1, total: 302, }; }, }; </script> <style scoped> .iconfont { font-size: 90px; color: black; } </style>
總結(jié):
該組件中需要注意的部分 一是vif和vshow區(qū)別,這一是面試題??嫉?vif會(huì)添加和刪除元素,控制是否生成對(duì)應(yīng)的dom,而vshow始終都會(huì)生成dom用dom控制style:display:none,vif則是直接刪除元素 使用vif可以有效的減少樹的節(jié)點(diǎn)和渲染量,但是也會(huì)導(dǎo)致樹的不穩(wěn)定,而vshow可以保持?jǐn)?shù)的穩(wěn)定,但不能減少樹的節(jié)點(diǎn)和渲染量因此,在實(shí)際開發(fā)中,顯示頻繁變化的情況下應(yīng)該用vshow,用以保持樹的穩(wěn)定,顯示狀態(tài)變化少的時(shí)候用vif,用以減少樹的節(jié)點(diǎn)和渲染量 二是子組件無(wú)權(quán)更改數(shù)據(jù),在父組件中數(shù)據(jù)更改可能會(huì)影響到其他,所以子組件只能通過(guò)發(fā)出通知的形式告訴父組件,于是出現(xiàn)了子組件拋出事件通知父組件要進(jìn)行改變了,從而由父組件進(jìn)行改變,并且重新渲染dom。通過(guò)點(diǎn)擊調(diào)用handleClick(newPage)方法傳入新頁(yè)碼參數(shù),同時(shí)this.emit("pageChange",newPage);是Vue實(shí)例提供的方法,用于觸發(fā)自定義事件并通知父組件。 //參數(shù):名字,數(shù)據(jù) 拋出事件通知父組件還要注意這個(gè)特殊的預(yù)留變量 emit("pageChange", newPage);是 Vue 實(shí)例提供的方法,用于觸發(fā)自定義事件并通知父組件。 //參數(shù):名字,數(shù)據(jù) 拋出事件通知父組件 還要注意這個(gè)特殊的預(yù)留變量 emit("pageChange",newPage);是Vue實(shí)例提供的方法,用于觸發(fā)自定義事件并通知父組件。 //參數(shù):名字,數(shù)據(jù) 拋出事件通知父組件還要注意這個(gè)特殊的預(yù)留變量 event 是一個(gè)預(yù)留的特殊變量,用于傳遞事件對(duì)象或其他數(shù)據(jù)給事件處理函數(shù)。
@pageChange 是監(jiān)聽自定義事件,當(dāng)自定義事件被觸發(fā)時(shí),Vue 會(huì)自動(dòng)將**事件對(duì)象作為參數(shù)傳遞給事件處理函數(shù)**。而
event‘ 則是用于接∗∗收這個(gè)事件對(duì)象的特殊變量∗∗。你可以自由選擇處理函數(shù)的形參名稱,例如這里使用了 ‘event` 則是用于接**收這個(gè)事件對(duì)象的特殊變量**。你可以自由選擇處理函數(shù)的形參名稱,例如這里使用了 `event‘ 則是用于接∗∗收這個(gè)事件對(duì)象的特殊變量∗∗。你可以自由選擇處理函數(shù)的形參名稱,例如這里使用了 ‘event,也可以使用其他名稱,如
event、
e` 等。
以上就是基于vue實(shí)現(xiàn)分頁(yè)組件的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于vue實(shí)現(xiàn)分頁(yè)組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
element table組件內(nèi)容換行的實(shí)現(xiàn)方案
這篇文章主要介紹了element table組件內(nèi)容換行的實(shí)現(xiàn)方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Vue使用自定義指令實(shí)現(xiàn)拖拽行為實(shí)例分析
這篇文章主要介紹了Vue使用自定義指令實(shí)現(xiàn)拖拽行為,結(jié)合實(shí)例形式分析了Vue使用自定義指令實(shí)現(xiàn)拖拽行為具體步驟、原理與操作注意事項(xiàng),需要的朋友可以參考下2020-06-06Vue3和i18n實(shí)現(xiàn)多語(yǔ)言方式
這篇文章主要介紹了Vue3和i18n實(shí)現(xiàn)多語(yǔ)言方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04vue計(jì)算屬性無(wú)法監(jiān)聽到數(shù)組內(nèi)部變化的解決方案
今天小編就為大家分享一篇vue計(jì)算屬性無(wú)法監(jiān)聽到數(shù)組內(nèi)部變化的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11vue 接口請(qǐng)求地址前綴本地開發(fā)和線上開發(fā)設(shè)置方式
這篇文章主要介紹了vue 接口請(qǐng)求地址前綴本地開發(fā)和線上開發(fā)設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08