#vue.js #flexbox
Вопрос:
Добрый день, ребята,
У меня есть неупорядоченный список, к которому я хотел бы применить разбивку на страницы с помощью flexboxes. Любая помощь приветствуется:
> <template>
<div id="app">
<ul>
<li v-for="item in items.results" :key="item.id">
{{ item.pub_date }} {{item.image.file}} {{item.title}}
<div class="downloads">
<span
v-for="downloadable in item.downloadable.filter(d => !!d.document_en)"
:key="downloadable.id"
>{{ downloadable.document_en.file }}</span>
</div>
</li>
</ul>
</div>
</template>
<style>
</style>
Ответ №1:
Шаг 1: Создание Pagination.vue
компонента
<template>
<ul class="pagination">
<li class="pagination-item">
<button type="button" @click="onClickFirstPage" :disabled="isInFirstPage">First</button>
</li>
<li class="pagination-item">
<button type="button" @click="onClickPreviousPage" :disabled="isInFirstPage">Previous</button>
</li>
<li :key="page.id" v-for="page in pages" class="pagination-item">
<button type="button" @click="onClickPage(page.name)" :disabled="page.isDisabled"
:class="{ active: isPageActive(page.name) }">{{ page.name }}</button>
</li>
<li class="pagination-item">
<button type="button" @click="onClickNextPage" :disabled="isInLastPage">Next</button>
</li>
<li class="pagination-item">
<button type="button" @click="onClickLastPage" :disabled="isInLastPage">Last</button>
</li>
</ul>
</template>
<script>
export default {
name: 'pagination',
props: {
maxVisibleButtons: {
type: Number,
required: false,
default: 3
},
totalPages: {
type: Number,
required: true
},
perPage: {
type: Number,
required: true
},
currentPage: {
type: Number,
required: true
}
},
computed: {
isInFirstPage () {
return this.currentPage === 1
},
isInLastPage () {
if (this.totalPages === 0) {
return true
}
return this.currentPage === this.totalPages
},
startPage () {
// When on the first page
if (this.currentPage === 1) {
return 1
}
// When on the last page
if (this.totalPages < this.maxVisibleButtons) {
return 1
}
if (this.currentPage === this.totalPages) {
return this.totalPages - this.maxVisibleButtons 1
}
// When in between
return this.currentPage - 1
},
endPage () {
if (this.totalPages === 0) {
return 1
}
if (this.totalPages < this.maxVisibleButtons) {
return this.totalPages
}
return Math.min(this.startPage this.maxVisibleButtons - 1, this.totalPages)
},
pages () {
const range = []
for (let i = this.startPage; i <= this.endPage; i = 1 ) {
range.push({
name: i,
isDisabled: i === this.currentPage
})
}
return range
}
},
methods: {
onClickFirstPage () {
this.$emit('pagechanged', 1)
},
onClickPreviousPage () {
this.$emit('pagechanged', this.currentPage - 1)
},
onClickPage (page) {
this.$emit('pagechanged', page)
},
onClickNextPage () {
this.$emit('pagechanged', this.currentPage 1)
},
onClickLastPage () {
this.$emit('pagechanged', this.totalPages)
},
isPageActive (page) {
return this.currentPage === page
}
}
}
</script>
<style scoped>
.pagination {
list-style-type: none;
float: right;
margin: 10px 0;
}
.pagination-item {
display: inline-block;
}
.active {
background-color: #943849;
color: #ffffff !important;
font-weight: bold;
}
button[disabled], html input[disabled] {
cursor: defau<
color: lightgray;
}
</style>
Шаг 2: Добавьте Pagination
ссылку на компонент в app.vue
компонент
import Pagination from './components/Pagination'
Добавить Pagination
компонент в app.vue
export default {
components: {
Pagination,
},
Шаг 3: Создайте данные модели с помощью объекта разбивки на страницы
data() {
return {
items:[],
page: 1,
totalPages: 0,
totalRecords: 0,
recordsPerPage: 10
}
},
Шаг 4: Создайте methods
для загрузки data
и добавления pagination
methods: {
loadPressRelease () {
this.showLoader = true
axios.get(`https://zbeta2.mykuwaitnet.net/backend/en/api/v2/media-center/press-release/?page=${this.page}amp;page_size=${this.recordsPerPage}amp;type=5`)
.then(response => {
this.showLoader = false
this.items = response.data
this.totalPages = Math.ceil(response.data.count / this.recordsPerPage)
this.totalRecords = response.data.count
})
},
onPageChange(page) {
this.page = page
this.loadPressRelease()
}
}
Шаг 5: загрузка страницы по умолчанию created
для методов
created() {
this.loadPressRelease()
},
Шаг 6: HTML
шаблон со pagination
ссылкой
<div id="app">
<ul>
<li v-for="item in items.results" :key="item.id">
{{ item.pub_date }} {{item.image amp;amp; item.image.file}} {{item.title}}
<div class="downloads">
<span v-for="downloadable in item.downloadable.filter(d => !!d.document_en)"
:key="downloadable.id">{{ downloadable.document_en.file }}
</span>
</div>
</li>
</ul>
<Pagination v-if="items.results" :total-pages="totalPages" :per-page="this.recordsPerPage" :current-page="page" @pagechanged="onPageChange" />
</div>
Ответ №2:
Это в значительной степени состояние вперед.
Создайте несколько констант:
const ROW_PER_PAGE = 10;
const CURRENT_PAGE = 0;
добавьте их в свой метод данных:
return {
rowPerPage: ROW_PER_PAGE,
currentPage: CURRENT_PAGE,
items: allMyData
}
используйте computed
свойство, чтобы возвращать только необходимое количество строк:
computed: {
getPaginatedData() {
const start = this.currentPage * this.rowPerPage;
const end = start this.rowPerPage;
return this.items.slice(start, end); // end index won't be included
}
}
Теперь просто используйте это getPaginatedData
в своем шаблоне
<li v-for="item in getPaginatedData" :key="item.id">
Последняя часть — это кнопки для изменения страницы. И при каждом изменении страницы просто обновляйте currentPage
переменную.
Для добавления кнопок разбивки на страницы, конечно, вы можете создать свой собственный компонент, но если у вас меньше времени, вы можете использовать индивидуально разработанный компонент. Тот, который мне нравится https://getbootstrap.com/docs/4.0/components/pagination /
Комментарии:
1. спасибо за ваши усилия, Dalvik, но у меня не получилось, это весь проект: github.com/kelbalazs/press-release
2. @BalazsKelemen внедрил в проект функции разбивки на страницы и загрузки и создал запрос на извлечение в репозиторий
3. большое спасибо, Джебасутан, кажется, вы работали над этим вопросом, к сожалению, эта функция flexbox по-прежнему не работает
4. @BalazsKelemen Это мое удовольствие. Я обновил
flexbox
проблему и добавил демонстрационную ссылку. Я также создал запрос на извлечение в github. Пожалуйста, объедините его после проверки кода. Спасибо.