前端
前端中中使用的pagination
代码如下
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
传参理解过程
今天的学习中我尝试理解若依分页的具体实现逻辑,原以pagination
和el-table
的数据交互点在queryParams
上,也就是认为pagination
负责修改queryParams
,el-table
负责使用queryParams
但是在查看el-table
代码的时候发现了问题,el-table
的标签长这样
<el-table v-loading="loading" :data="memoryList" @selection-change="handleSelectionChange">
我就奇了怪了,这里面都没有这些参数,是如何进行传递的呢,因此很好奇两个封装的组件之间,没有在标签中进行传参是如何进行数据传递的,翻找element-ui
源码无果,最后发现,我忽略了一个叫getList
方法,事实上应该在pagination
被点击发生改变的时候就会重新获取列表,而el-table
是通过这个列表去进行渲染的。
由此又发现了自己知识一个薄弱的点,为什么@pagination="getList"
这么写,就会在更改分页的时候触发,触发条件是如何定义的,于是去查看了pagination
组件的源码,相关代码如下:
handleSizeChange(val) {
if (this.currentPage * val > this.total) {
this.currentPage = 1
}
this.$emit('pagination', { page: this.currentPage, limit: val })
if (this.autoScroll) {
scrollTo(0, 800)
}
}
显然,this.$emit('pagination', { page: this.currentPage, limit: val })
这行代码就是在定义这件事情,当handleSizeChange
事件发生的时候就会去触发名为pagination
的事件
$emit
方法是 Vue.js 中用于触发自定义事件的方法。它可以让我们在一个组件中触发一个自定义事件并可选传入参数,这里以key-value
形式传入了两个参数,分别是当前页和展示数据条数限制。
那么随之而来的问题就是,这个东西的作用域是多少,总不能整个项目所有同名事件都触发吧,还是说确实是这样,所以带来事件不能重名的限制呢?
经过查询之后未能得到准确的结论,网上的回复大多说是用于父子组件的传值,但很明显当前的用法便不是,于是查阅官方文档,据我目前的理解,这就是一个简单的事件触发器之类的东西,官方演示了触发本组件内事件与触发父组件事件两种用法,但我还是不清楚在此之外的作用域,猜测为所有祖先以及自己,待以后验证
.sync
的理解
在pagination
标签的参数中出现了.sync修饰符,尝试对其具体原理进行理解。
sync
是vue
中用于实现简单的“双向绑定”的语法糖vue
的prop
是单向下行绑定:父级的prop
的更新会向下流动到子组件中,但是反过来不行。所以所谓的双向绑定就是将子向父的数值传递也打通,使之成为“双向”绑定- 一个组件上只能定义一个
v-model
,如果其他prop
也要实现双向绑定的效果该怎么办呢?简单的方法是子组件向父组件发送一个事件,父组件监听该事件,然后更新prop
,事实上Vue
就是以这种模式实现的sync
修饰符,这里面也用到了$emit
后端
在若依所生成的后端代码中,仅有此处存在分页相关的代码,我是年轻人,我就觉得很神奇啊,理论上来说不应该是mapper
里对sql
语句进行相关的配置吗,返回也没有看到哪里有total
啊。
mapper
暂时看不到哪里改了,但是这里的return
一定是包含所有需要的数据也就是total
和list
的,所以进去看一下total
怎么来的
打开一看,更懵逼了orz
新建个对象就可以getTotal
了?可是传进去的list
明明是分页后的当页数据,不可能根据这个统计了,那是哪来的呢?至少整个PageInfo
类中没有相关代码
没办法了,等我查查资料再继续总结,想不出来了
查询资料之后理解如下
pageHelper
使用的方法是创建一个线程,首先接收并存储前端传入的分页参数(存在疑问,这是怎么获取到的相关参数的,后端的list()
方法并没有接收相关参数,Memory
类及其父类都没有)- 对
startPage()
方法之后的第一个查询进行拦截,并改造sql
语句(但这只能解决为什么返回值是当前页数据的疑惑,并不能解决分页数据从哪来的疑惑,例如下一页是否还有,total
的值等等)