چگونه یک صفحه بندی پویا ساده از ابتدا در Vue ایجاد کنیم
در برخی مواقع ممکن است یک آرایه طولانی بخواهید محتوا را به صفحات مختلف جدا کنید تا کاربران بتوانند به راحتی در محتوا حرکت کنند، بنابراین شما مجبور خواهید بود صفحه بندی کنید، در حالی که ممکن است از یک بسته npm برای صفحه بندی استفاده کنید، همچنین ممکن است بخواهید از ابتدا یکی را ایجاد کنید. مثل من برای کارایی، کارایی و برای اینکه اندازه بستهتان را زیاد نکنید، زیرا همانطور که همه ما میدانیم برنامهای که سبک است سریعتر اجرا میشود و در طول توسعه و تولید کارآمدتر عمل میکند.
ما تابع خود را در یک کد Vue3 موجود مینویسیم.
اولین قدم ایجاد یک آرایه است.
import {ref} from "vue";
const questions = [
{
desc: "Jessica Gabriel recently posted interview questions for UI/UX Designer",
date: "Friday 5th, 2022 6:45pm",
field: "UI/UX Designers",
id: 1,
bg: "#FFFFFF",
},
{
desc: "Jessica Gabriel recently posted interview questions for UI/UX Designer",
date: "Friday 5th, 2022 6:45pm",
field: "UI/UX Designers",
id: 2,
bg: "#F9F2EE",
},
{
desc: "Jessica Gabriel recently posted interview questions for UI/UX Designer",
date: "Friday 5th, 2022 6:45pm",
field: "UI/UX Designers",
id: 3,
bg: "#FFFFFF",
},
{
desc: "Jessica Gabriel recently posted interview questions for UI/UX Designer",
date: "Friday 5th, 2022 6:45pm",
field: "UI/UX Designers",
id: 4,
bg: "#F9F2EE",
},
{
desc: "Jessica Gabriel recently posted interview questions for UI/UX Designer",
date: "Friday 5th, 2022 6:45pm",
field: "UI/UX Designers",
id: 5,
bg: "#FFFFFF",
},
{
desc: "Jessica Gabriel recently posted interview questions for UI/UX Designer",
date: "Friday 5th, 2022 6:45pm",
field: "UI/UX Designers",
id: 6,
bg: "#F9F2EE",
},
{
desc: "Jessica Gabriel recently posted interview questions for UI/UX Designer",
date: "Friday 5th, 2022 6:45pm",
field: "UI/UX Designers",
id: 7,
bg: "#FFFFFF",
},
{
img: require("@/assets/contact/alao.png"),
desc: "Jessica Gabriel recently posted interview questions for UI/UX Designer",
date: "Friday 5th, 2022 6:45pm",
field: "UI/UX Designers",
id: 8,
bg: "#FFFFFF",
},
{
desc: "Jessica Gabriel recently posted interview questions for UI/UX Designer",
date: "Friday 5th, 2022 6:45pm",
field: "UI/UX Designers",
id: 9,
bg: "#F9F2EE",
},
{
desc: "Jessica Gabriel recently posted interview questions for UI/UX Designer",
date: "Friday 5th, 2022 6:45pm",
field: "UI/UX Designers",
id: 10,
bg: "#FFFFFF",
},
];
پس از ایجاد آرایه خود، می توانید پیش بروید و آن را در تگ قالب خود ترسیم کنید.
<template>
<div v-for="item in questions" :key="item.id">
{{ item.field }}
</div>
</template>
آرایه نگاشت شده هر آیتم را در سرور توسعه شما نشان می دهد، مرحله بعدی ایجاد عملکرد صفحه بندی است. ابتدا حالت های خود را ایجاد کرده و مقادیری را به آنها اختصاص می دهید.
// stores the total number of items in array
const totalPosts = questions.length;
// stores the total numbers of page the array creates depending of the number of posts per page
const pageNumbers = ref([]);
// total of items to be displayed on one page
const postPerPage = ref(5);
the number of the current page displayed
const currentPage = ref(1);
// setting starting point amd ending point. there is a differnce of 10 if start is 13 end woukd be 23. so in an current post it will be totalArray.value.slice(13,23)
const indexOfLastPost = ref();
const indexOfFirstPost = ref();
//shows the current array displayed
const currentPosts = ref()
indexOfLastPost.value = currentPage.value * postPerPage.value;
indexOfFirstPost.value = indexOfLastPost.value - postPerPage.value;
currentPosts.value = questions.slice(indexOfFirstPost.value, indexOfLastPost.value);
// total number of pages available
const paginateNumber = Math.ceil(totalPosts / postPerPage.value);
اکنون می توانید آرایه ما در قالب را به آرایه اصلاح شده currentPosts تغییر دهید.
<template>
<div v-for="item in currentPosts" :key="item.id">
{{ item.field }}
</div>
</template>
اکنون می توانید تنها پنج مورد را در سرور توسعه ببینید، اکنون می توانید ناوبری صفحه بندی ما را ایجاد کنید.
<script>
for (let i = 1; i <= Math.ceil(totalPosts / postPerPage.value); i++) {
pageNumbers.value.push(i);
}
</script>
<template>
<div class="interview__pagination">
<h6 @click="previous">Previous</h6>
<div class="numbers">
<p v-for="item in pageNumbers" :key="item" @click="currentPage = item">
{{ item }}
</p>
</div>
<h6 @click="next">Next</h6>
</div>
</template>
سپس می توانید ادامه دهید و عملکردهای ناوبری خود را ایجاد کنید.
const previous = () => {
if (currentPage.value > 1) {
currentPage.value = currentPage.value - 1;
}
};
const next = () => {
if (currentPage.value >= 1 && currentPage.value < paginateNumber) {
currentPage.value = currentPage.value + 1;
}
};
حالا اگر روی دکمههای ناوبری کلیک کنید، هیچ اتفاقی نمیافتد، باید مقادیر تغییر یافته را تماشا کنید و عملکرد را با تغییر بهروزرسانی کنید. ما vue watcher را به کد خود معرفی خواهیم کرد.
import { watch } from "vue";
watch(currentPage, (currentValue, oldValue) => {
indexOfLastPost.value = currentValue * postPerPage.value;
indexOfFirstPost.value = indexOfLastPost.value - postPerPage.value;
console.log(indexOfLastPost.value)
currentPosts.value = questions.slice(indexOfFirstPost.value, indexOfLastPost.value);
});
اکنون، وقتی روی ناوبری خود کلیک می کنید، همه چیز به درستی کار می کند.