Непонятно, что вы подразумеваете под «той же страницей». Если в вашей таблице всего 100 строк, и вы отображаете 10 строк на странице, и в настоящее время вы просматриваете строки 31-40 (т. Е. «Страница 3»), и вы переключаетесь на 50 строк на страницу, какой страницей вы должны быть на? С новыми строками на страницу будет всего 2 страницы, поэтому быть на «странице 3» было бы бессмысленно. Если вы переключились на 5 строк на страницу, то пункты 31-35 были бы на странице 7, а пункты 36-40 были бы на странице 8. Какая страница должна отображаться?
Поскольку нет четкого, однозначного определения «той же страницы», Vuetify по умолчанию возвращает к первой странице в качестве разумного поведения.
Однако, ради аргумента, давайте решим, что под «той же страницей» вы подразумеваете, что любой элемент был в первой строке таблицы до изменения элементов на странице останутся видимыми на экране после изменения элементов на странице. Очевидно, что если количество элементов на странице уменьшается, например, увеличивается с 10 до 5, вы не сможете отобразить ВСЕ элементы, которые были на экране до изменения.
Вот демонстрация этого в действии на Codepen .
v-data-table
имеет событие @pagination
, которое срабатывает при каждом изменении страницы, как при переходе по страницам, так и при изменении количества элементов на странице. Обработчик событий получает объект, который выглядит следующим образом:
{
"page": 5, // 1-based index, i.e. first page is 1 (not zero)
"itemsPerPage": 5, // current items per page
"pageStart": 20, // 0-based index of the first item displayed on the screen
"pageStop": 25, // 0-based index of the first item on the *next* page
"pageCount": 20, // total number of pages
"itemsLength": 100 // total number of rows
}
Мы можем сохранить эти значения для последующего использования, включая обновление текущей страницы при изменении количества элементов на странице.
First вам нужно будет добавить два реквизита к вашему v-data-table
:
<v-data-table
:headers="headers"
:items="items"
:items-per-page="5"
:page.sync="pagination.page"
@pagination="updatePage"
></v-data-table>
page.sync
, позволяющим программно установить текущую страницу, т.е. поддерживать ее в синхронизации c с указанным реквизитом данных. @pagination
позволяет указать функцию для получения и обработки информации о нумерации страниц при каждом ее изменении. Раздел скрипта вашего компонента будет выглядеть так:
export default {
name: 'MyComponentWithADataTable',
data () {
return {
headers: [ /* ...data table header info... */ ],
items: [ /* ...the actual data in the table... */ ],
pagination: {}, // <-- holds our pagination data
}
},
computed: {
firstItem () {
// the index of the item that is the top row displayed on the screen
return this.pagination.pageStart
},
itemsPerPage () {
// the current number of items per page
return this.pagination.itemsPerPage
},
},
methods: {
updatePage (pagination) {
// detect change in itemsPerPage
if (this.itemsPerPage !== pagination.itemsPerPage) {
for (let p = 0; p < pagination.pageCount; p++) {
// figure out the page bounds
const start = p * pagination.itemsPerPage
const end = start + pagination.itemsPerPage
// is the target item on this page?
if (this.firstItem >= start && this.firstItem < end) {
// yes, so set the page to this page
pagination.page = p + 1
// break out of the loop
break;
}
}
}
// update the pagination info
this.pagination = pagination
}
},
}