目前我在我的应用程序中使用Element-UI进行快速开发,我想创建分页作为子组件,因此我可以在任何父组件中重用它并减小我的应用程序的大小。
我的父组件具有“内联”分页的示例。
parent.vue
<template>
<ol>
<li v-for="student in studentList>{{ student.full_name }}</li>
</ol>
<el-pagination
layout="sizes, prev, pager, next"
:total="totalPages"
:page-size="pageSize"
:page-sizes="[10, 25, 50, 100]"
@size-change="handleSizeChange"
@current-change="handleCurrentChange">
</el-pagination>
</template>
<script>
export default {
data () {
return {
pageSize: 10,
currentPage: 1,
students: [] // this filled from backend when component created
}
},
created () {
// Axios HTTP request to fetch data from server
// to filled students variable
},
computed: {
totalPages () {
return this.students.length
},
studentList () {
return this.students.slice(((this.currentPage - 1) * this.pageSize), (this.pageSize * this.currentPage))
}
},
methods: {
handleSizeChange (size) {
this.pageSize = size
},
handleCurrentChange (value) {
this.currentPage = value
}
}
}
</script>
它工作得非常好,但它可能会很痛苦,因为我应该在任何想要使用分页的组件中重复所有这些内容。 任何人都可以举例说明如何将这个分页创建为子组件,而集合仍然保留在父组件上。
我已经尝试创建它,但坚持将计算属性的返回值传递给父组件。
示例,我失败的试用版创建子组件
child.vue
... // all of template element and functions
computed: {
studentList () {}
},
methods: {
updateStudentList () {
this.$emit('changed-value', this.studentList) // as you can see, studentList is computed function like parent code above
}
}
parent.vue
// there's no more studentList function on computed property in parent component
// instead, it moved on child component
<li v-for="student in students">{{ student.full_name }}</li>
<child-pagination v-on:changed-value="rebuildStudent"></child-pagination>
...
methods: {
rebuildStudent (newCollection) {
this.students = newCollection
}
}
答案 0 :(得分:0)
<强>已更新强>
经过修补,最后我可以解决它。
计算数组应该保留在父组件上,并添加一个存储begin
和end
索引的对象,用于收集数组上的切片。哪个对象将根据子事件使用方法进行更改。
<强> parent.vue 强>
<template>
<pagination v-model="pageIndex"
v-on:paginationInit="paginationInit"
collections="students">
</pagination>
</template>
data () {
return {
students: [] // collection
pageIndex: {}
}
},
computed: {
studentList () {
return this.students.slice(pageIndex.begin, pageIndex.end)
}
},
methods: {
// This method emitted from child component
paginationInit (pageIndex) {
this.pageIndex.begin = pageIndex.begin
this.pageIndex.end = pageIndex.end
}
}
然后在子组件中,计算逻辑移动了一个处理来自clicked分页元素的事件的方法。
<强> child.vue 强>
data () {
return {
pageIndex: { begin: 0, end: 10 }
}
},
created () {
this.init()
},
methods: {
init () {
this.$emit('paginationInit', this.pageIndex)
},
handleCurrentChange (page) {
this.pageIndex.begin = (page - 1) * this.pageSize
this.pageIndex.end = this.pageSize * page
this.$emit('input', this.pageIndex)
}
}