Dans le développement de Vue3, la table de données est l'un des composants les plus basiques et les plus couramment utilisés. Dans le développement d’applications réelles, nous devons souvent traiter et afficher de grandes quantités de données. Le composant de table de données peut effectuer une pagination, un tri, un filtrage et d'autres opérations élégantes sur les données en fonction du format des données pour répondre aux besoins d'affichage de la visualisation des données.
Vue.js, en tant que framework front-end populaire, fournit de nombreux composants et API pratiques. Cependant, à mesure que les besoins des entreprises continuent d’augmenter, il peut y avoir des situations où la demande ne peut être satisfaite. À l'heure actuelle, nous pouvons utiliser le mécanisme de plug-in Vue.js pour développer des composants personnalisés afin de répondre à des besoins commerciaux particuliers.
Ci-dessous, cet article présentera comment utiliser le mécanisme du plug-in Vue.js pour encapsuler un composant de table de données et implémenter les fonctions suivantes :
import Vue from 'vue' import Paginate from 'vuejs-paginate' // 全局注册分页组件 Vue.component('paginate', Paginate); // 分页参数配置 var options = { perPage: 10, perPageValues: [10, 20, 50], containerClass: 'pagination', infoClass: 'pagination__info', paginationClass: 'pagination__list', itemClass: 'pagination__item', linkClass: 'pagination__link' } // 定义分页组件 Vue.component('my-paginate', { components: { Paginate }, props: { items: { type: Array, // 数据类型为数组 required: true // 验证数据必传 } }, data() { return { currentPage: 1, // 当前页码 options: options // 分页参数 } }, computed: { // 分页处理后的数据 paginatedItems() { var start = (this.currentPage - 1) * this.options.perPage; var end = start + this.options.perPage; return this.items.slice(start, end); } } })
Vue.component('my-sorter', { props: { data: { type: Array, required: true }, sortIndex: { type: Number, // 数字类型 required: true } }, data() { return { direction: true // 排序切换方向 } }, computed: { sortedData() { // 数据排序处理 var copyData = Object.assign([], this.data); // 浅拷贝数组 var direction = this.direction ? 1 : -1; // 升序或降序 copyData.sort(function(a, b) { if (a[this.sortIndex] < b[this.sortIndex]) return -1 * direction; if (a[this.sortIndex] > b[this.sortIndex]) return direction; return 0 }.bind(this)) return copyData; } }, methods: { // 点击表头,切换排序方向 toggle() { this.direction = !this.direction; } }, template: ` <th @click="toggle"> {{ $slots.default[0].text }} <i v-if="direction" class="glyphicon glyphicon-chevron-up"></i> <i v-else class="glyphicon glyphicon-chevron-down"></i> </th> ` })
Vue.component('my-filter', { props: { data: { type: Array, required: true } }, data() { return { search: '' } }, computed: { filteredData() { var searchKey = this.search.toLowerCase(); return this.data.filter(item => { // 遍历数组内的每一项,如果包含搜索关键词,就保留这一项数据 return Object.keys(item).some(key => { return String(item[key]).toLowerCase().indexOf(searchKey) > -1 }) }) } }, template: ` <div> <input v-model="search" class="form-control" type="text" placeholder="搜索..."> <table class="table table-bordered"> <thead> <slot name="thead"></slot> </thead> <tbody> <tr v-for="item in filteredData"> <slot name="tbody" :item="item"></slot> </tr> </tbody> </table> </div> ` })
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!