@@ -57,7 +57,19 @@ const emits = defineEmits<{
5757 * on current change event
5858 * @param value {number} current value
5959 */
60- change: [event : number ];
60+ change: [value : number ];
61+ /**
62+ * on next button event click
63+ * @param event {Event} native click event
64+ * @param value {number} new current value
65+ */
66+ next: [event : Event , value : number ];
67+ /**
68+ * on previous button event
69+ * @param event {Event} native click event
70+ * @param value {number} new current value
71+ */
72+ previous: [event : Event , value : number ];
6173}>();
6274
6375const { isMobile } = useMatchMedia (props .mobileBreakpoint );
@@ -131,10 +143,23 @@ const pagesInRange = computed<ReturnType<typeof getPage>[]>(() => {
131143 return pages ;
132144});
133145
146+ const previousButtonBind = computed (() =>
147+ getPage (currentPage .value - 1 , props .ariaPreviousLabel , (e , v ) =>
148+ emits (" previous" , e , v ),
149+ ),
150+ );
151+
152+ const nextButtonBind = computed (() =>
153+ getPage (currentPage .value + 1 , props .ariaNextLabel , (e , v ) =>
154+ emits (" next" , e , v ),
155+ ),
156+ );
157+
134158/** Get properties for a page */
135159function getPage(
136160 num : number ,
137161 ariaLabel ? : string ,
162+ onClick ? : (event : Event , value : number ) => void ,
138163): {
139164 number: number ;
140165 isCurrent: boolean ;
@@ -145,9 +170,12 @@ function getPage(
145170 return {
146171 number: num ,
147172 isCurrent: currentPage .value === num ,
148- onClick : (event : Event ): void => changePage (num , event ),
173+ onClick : (event : Event ): void => {
174+ changePage (num , event );
175+ if (onClick ) onClick (event , num );
176+ },
149177 ariaLabel:
150- ariaLabel || getAriaPageLabel (num , currentPage .value === num ),
178+ ariaLabel ?? getAriaPageLabel (num , currentPage .value === num ),
151179 tag: props .buttonTag ,
152180 };
153181}
@@ -270,11 +298,9 @@ defineExpose({ last, first, prev, next });
270298 @binding {(event: Event): void} onClick - click handler
271299 @binding {string} ariaLabel - aria-label attribute
272300 -->
273- <slot
274- name =" previous"
275- v-bind =" getPage(currentPage - 1, ariaPreviousLabel)" >
301+ <slot name =" previous" v-bind =" previousButtonBind" >
276302 <o-pagination-button
277- v-bind =" getPage(currentPage - 1, ariaPreviousLabel) "
303+ v-bind =" previousButtonBind "
278304 :disabled =" isFirst"
279305 :root-class =" buttonPrevClasses"
280306 :button-class =" buttonClasses"
@@ -290,9 +316,9 @@ defineExpose({ last, first, prev, next });
290316 @binding {(event: Event): void} onClick - click handler
291317 @binding {string} ariaLabel - aria-label attribute
292318 -->
293- <slot name =" next" v-bind =" getPage(currentPage + 1, ariaNextLabel) " >
319+ <slot name =" next" v-bind =" nextButtonBind " >
294320 <o-pagination-button
295- v-bind =" getPage(currentPage + 1, ariaNextLabel) "
321+ v-bind =" nextButtonBind "
296322 :disabled =" isLast"
297323 :root-class =" buttonNextClasses"
298324 :button-class =" buttonClasses"
0 commit comments