vue+el-table在ajax分页时支持全选单页和全选所有
需求:el-table中,ajax分页的情况下,要支持全选单页和全选所有页中的记录,效果如下图所示:

界面代码:
js部分代码如下:
import pager from "@/components/table/Pager.vue";
// 全选操作
handleSelectionChange (val) {
this.loading = val.length > 0 ? false : true;
this.multipleSelection = val;
},
// 选择需要的/取消选中
toggleSelection (rows) {
if (rows) {
rows.forEach(row => {
this.$refs.table.toggleRowSelection(row);
});
} else {
this.$refs.table.clearSelection();
}
},
//改变全选所有复选框
changeCheckAll (val) {
if (val) {
// 全选选中时当前页所有数据选中
this.tableData.forEach(row => {
if (row) {
this.$refs.table.toggleRowSelection(row, true);
}
});
} else {
this.$refs.table.clearSelection();
}
},
}
}
在每次点击“页码“之后,会自动执行查询方法,此时,如果点击了全选所有按钮,要在数据执行查询之后,再选中当前页面所有项,代码如下图所示:
//执行查询方法getList后回调函数当中编写如下代码:
if(this.checkedAll){
this.$nextTick(()=>{
this.changeCheckAll(this.checkedAll);
})
}
由于要在dom渲染之后执行,所以使用了this.$nextTick()方法。
在element-ui的Table组件当中,并没有提供给表头当中的复选框设置文本的属性和方法,我们可以通过使用css伪类来创建文本。
/deep/ .el-table__header .el-table-column--selection .cell .el-checkbox:after {
content: "当页";
color: #606266;
font-weight: 500;
margin-left: 10px;
font-size: 14px;
}
/deep/用于在css作用域当中进行样式透传,覆盖子组件的样式。
分页组件Pager.vue是对el-pagination组件的二次封装,其代码如下:
<!-- 分页查询
<pager :pager=[分页对象] @query=[列表查询方法] />
-->
<template>
<div class="pagination-box clear">
<span class="page-total fl">
共有记录:
<span>{{ pager.total }}</span>条
</span>
<el-pagination
:small="small"
:layout="layout"
background
:pager-count="7"
:total="pager.total"
:current-page.sync="pager.pageNum"
:page-size="pager.pageSize"
:page-sizes="pageSize"
@size-change="onChangeSize"
@current-change="onChangePage"
></el-pagination>
<span v-if="refresh" class="btn-refresh fn-right" title="刷新" @click="$emit('query')">
<i class="fas fa-redo"></i>
</span>
</div>
</template> <script>
export default {
name: "Pager",
props: {
small: {
type: Boolean,
default: false
},
layout: {
type: String,
default: "sizes,jumper, prev, pager, next"
},
pager: {
type: Object,
required: true
},
refresh: {
type: Boolean
},
pageSize: {
type: Array,
default: () => {
return [10, 15, 20, 50, 100, 200];
}
},
props: {
type: Object,
required: false,
default: () => ({
pageNum: "pageNum", // 第几页
pageSize: "pageSize", // 显示条数
total: "total" // 总记录条数
})
}
},
// 设置绑定参数
model: {
prop: "pager",
event: "setPager"
},
computed: {
total() {
return this.pager[this.props.total] || 0;
},
// 检测获取到的数据是否为空
isEmptyList() {
return (
Math.ceil(
this.pager[this.props.total] / this.pager[this.props.pageSize]
) < this.pager[this.props.pageNum]
);
}
},
watch: {
total() {
// 存在记录但未获取到数据时, 重新请求
if (this.pager[this.props.pageNum] > 1 && this.isEmptyList) {
this.$emit(
"setPager",
Object.assign(this.pager, {
[this.props.pageNum]: this.pager[this.props.pageNum] - 1
})
);
this.$emit("query");
}
}
},
methods: {
// 每页条数
onChangeSize(pageSize) {
const temp = {
[this.props.pageSize]: pageSize,
// 当显示条数小于或等于总条数时,重置页数
[this.props.pageNum]:
pageSize <= this.total ? 1 : this.pager[this.props.pageNum]
};
this.$emit("setPager", Object.assign(this.pager, temp));
// 触发父组件查询请求
this.$emit("query");
},
// 翻页
onChangePage(pageNum) {
this.$emit(
"setPager",
Object.assign(this.pager, { [this.props.pageNum]: pageNum })
);
this.$emit("query");
}
}
};
</script>
<style lang="scss" scoped>
.pagination-box {
width: 100%;
padding-top: 14px;
position: relative;
.el-pagination {
float: right;
}
/deep/ .el-pagination__sizes {
position: absolute;
top: 14px;
left: 150px !important;
}
}
.page-total {
padding-left: 20px;
height: 31px;
line-height: 31px;
font-size: 14px;
color: #838383;
} .page-total span {
color: #3a3a3a;
} .closeBtn {
text-align: center;
margin-top: 10px;
} .el-input--small .el-input__inner {
height: 25px;
line-height: 25px;
} .el-input__inner {
border-color: #838383;
}
.el-pagination .btn-next .el-icon,
.el-pagination .btn-prev .el-icon {
font-size: 19px;
position: relative;
top: -3px;
}
.el-pager li {
margin: 0 8px;
border-radius: 3px;
height: 24px;
line-height: 24px;
min-width: 20px;
} .el-pager li.active {
background: #1881bf !important;
} .el-pagination__jump {
margin-right: 20px;
font-size: 14px;
color: #838383;
} .el-pagination__jump .pagination__editor {
margin-right: 20px;
} .el-pagination__jump .el-pagination__editor.el-input {
width: 28px;
}
.el-pagination__jump .el-input__inner {
box-sizing: border-box;
width: 100%;
color: #3a3a3a;
font-size: 14px;
border-color: #838383 !important;
height: 24px;
line-height: 24px;
border-radius: 3px;
background: #fff !important;
} .el-pagination .el-select .el-input .el-input__inner {
border-radius: 15px !important;
font-size: 14px;
border-color: #838383 !important;
background: #fff !important;
}
.el-button--text > span > span {
color: #1881bf;
font-size: 12px;
text-decoration: underline;
}
</style>
完!
vue+el-table在ajax分页时支持全选单页和全选所有的更多相关文章
- 基于Jquery的Ajax分页,只有上一页和下一页
最近项目中用到ajax分页 在网上找到一个非常好用的分页插件jquery-pagination-ajax,以下是链接 http://www.zhangxinxu.com/wordpress/2010/ ...
- 轻量级表格插件Bootstrap Table。拥有强大的支持固定表头、单/复选、排序、分页、搜索及自定义表头等功能。
Bootstrap Table是轻量级的和功能丰富的以表格的形式显示的数据,支持单选,复选框,排序,分页,显示/隐藏列,固定标题滚动表,响应式设计,Ajax加载JSON数据,点击排序的列,卡片视图等. ...
- MvcPager 概述 MvcPager 分页示例 — 标准Ajax分页 对SEO进行优化的ajax分页 (支持asp.net mvc)
该示例演示如何使用MvcPager最基本的Ajax分页模式. 使用AjaxHelper的Pager扩展方法来实现Ajax分页,使用Ajax分页模式时,必须至少指定MvcAjaxOptions的Upda ...
- PHP+jQuery 长文章分页类 ( 支持 url / ajax 分页方式 )
/* ******* 环境:Apache2.2.8 ( 2.2.17 ) + PHP5.2.6 ( 5.3.3 ) + MySQL5.0.51b ( 5.5.8 ) + jQuery-1.8 **** ...
- PHP+jQuery 列表分页类 ( 支持 url 分页 / ajax 分页 )
/* ******* 环境:Apache2.2.8 ( 2.2.17 ) + PHP5.2.6 ( 5.3.3 ) + MySQL5.0.51b ( 5.5.8 ) + jQuery-1.8.3.mi ...
- 关于使用视图进行分页时出现当前记录集不支持书签的错误解决方法及原因(asp)
一般在使用视图进行查询时,视图中意般都关联了两个或者更多个表,一般在这种情况下才会使用视图,但是但我在使用视图来查询数据时没有问题,但是一旦在分页中使用到视图进行查询就会出现错误提示如下: ADODB ...
- 关于【vue + element-ui Table的数据多选,多页选择数据回显,分页记录保存选中的数据】的优化
之前写的[vue + element-ui Table的数据多选,多页选择数据回显,分页记录保存选中的数据]这篇博客.功能虽然实现了相对应的功能.但是用起来很不爽.所以进行了优化. 备注:最近可能没时 ...
- vue day8 table page
@{ ViewBag.Title = "Home Page"; Layout = null; } <!DOCTYPE html> <html> <he ...
- 【TP3.2】TP3.2下实现ajax分页(原创+亲测可用)
一,写在最开始:ajax分页的原理,是利用了js的ajax执行请求,获取分页list和分页page [代码块],去替换页面显示数据的[代码块] 技术:js的ajax + TP3.2的fetch(&qu ...
随机推荐
- EF Entity Framework Core DBContext中文文档
Add(Object) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的可访问实体,以便在调用SaveChanges()时将它们插入数据库.使用State设置单个实体的状态. Add<TEnt ...
- 玩转Libmodbus(二) 写代码体验
libmodbus在线文档 https://www.jianshu.com/p/d93c17485c0a 原创篇 参考上一篇转载的博客,我的ubuntu上的最终生成的动态库的路径,下图所示 我的lin ...
- 1. Spring Boot入门
1.Spring Boot简介 简化Spring应用开发的一个框架 整个Spring技术栈的一个大整合 J2EE开发的一站式解决方案 优点: – 快速创建独立运行的Spring项目以及与主流框架集成 ...
- 036 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 03 嵌套if结构
036 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 03 嵌套if结构 本文知识点:Java中的嵌套if结构 什么是嵌套if结构? 概念: 嵌套if结构 ...
- ATMEGA的SPI总线 - 第1部分
转自: 1. https://www.yiboard.com/thread-782-1-1.html 2.https://mansfield-devine.com/speculatrix/2018/0 ...
- Java安全之Commons Collections1分析(二)
Java安全之Commons Collections1分析(二) 0x00 前言 续上篇文,继续调试cc链.在上篇文章调试的cc链其实并不是一个完整的链.只是使用了几个方法的的互相调用弹出一个计算器. ...
- 【4】进大厂必须掌握的面试题-Java面试-jdbc
1.什么是JDBC驱动程序? JDBC驱动程序是使Java应用程序与数据库进行交互的软件组件.JDBC驱动程序有4种类型: JDBC-ODBC桥驱动程序 本机API驱动程序(部分为Java驱动程序) ...
- [java进阶]关于多线程的知识点
线程和进程的区别? 进程: 是程序得一次之星过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序就是从一个进程的创建开始,到进程的结束的过程. 在java中当我们的main函数运行时就是 ...
- C&C++代码单元集成测试培训
课程简介 本课程为期3天,结合实例讲解如何使用Cantata开展C和C++代码,通过培训,可以明显提高工程师操作Cantata的效率,并加速单元测试和集成测试. [日期]2020年11月3日-5日(共 ...
- pytest文档41-参数化 ids 用例描述为中文时控制台输出unicode编码问题(pytest_collection_modifyitems)
前言 使用 pytest.mark.parametrize 参数化的时候,加 ids 参数用例描述有中文时,在控制台输出会显示unicode编码,中文不能正常显示. 使用 pytest_collect ...