vue.js table组件封装

table组件 和 分页组件来自iview,在这里我根据公司业务再次做了一次封装,使用slot进行内容分发,可以随意放置input输入框和button按钮 ,再使用props向子组件传递参数,使用emit属性向父组件传递事件,代码如下

《子组件》

<template>

<div style="">

<div class="search-bar run-search-bar" style="background:none;">

<div>

<!-- align="right" style="margin:5px" -->

<slot name="handle-bar"></slot>

</div>

<div>

<slot name="search-bar"></slot>

</div>

</div>

<div class="single-table-con">

<div class="table-bar">

<slot name="table-bar"></slot>

</div>

<Table size="small" ref="table" :loading="loading" @on-current-change="onCurrentChange" :highlight-row="highlightRow" :data="tableData" :columns="tableColumns" @on-selection-change="selectionChange" @on-sort-change="sortHandle" @on-row-click="rowClickHandle" stripe></Table>

<div style="margin: 10px;overflow: hidden" v-if="isPage">

<div style="float: right;">

<Page :placement="placement" :total="total" :show-total="showTotal" :page-size-opts="pageSizeOpts" :show-sizer="showSizer" :page-size="param.page.pageSize" :current="param.page.currentPage" @on-change="changePage" size="small" @on-page-size-change="changePageSize"></Page>

</div>

</div>

</div>

</div>

</template>

<script>

export default {

name: "EasyVueTable",

components: {},

props: {

resource: {

type: Array,

default() {

return [];

}

},

useCatch: {

type: Boolean,

default() {

return false;

}

},

catchParams: {

type: Object,

default() {

return {};

}

},

highlightRow: {

type: Boolean,

default() {

return false;

}

},

action: {

type: String,

default() {

return "";

}

},

params: {

type: Object,

default() {

return {};

}

},

server: {

type: Object,

default() {

return {};

}

},

columns: {

type: Array,

default() {

return [];

}

},

columnsFn: {

type: Function

},

initParam: {

type: Object,

default() {

return {};

}

},

loadCallback: {

type: Function,

default() {

return function(data) {

};

}

},

autoFirst: {

type: Boolean,

default() {

return true;

}

},

pageSize: {

type: Number,

default() {

return 10;

}

},

showTotal: {

type: Boolean,

default() {

return true;

}

},

showSizer: {

type: Boolean,

default() {

return true;

}

},

pageSizeOpts: {

type: Array,

default() {

return [10, 20, 50, 100];

}

},

isPage: {

type: Boolean,

default() {

return true;

}

},

onSelectionChange: {

type: Function

},

rowClickHandle: {

type: Function

}

},

data() {

return {

tableData: [],

tableColumns: [],

total: 0,

currentPage: 1,

selection: [],

loading: false,

param: {

page: {

currentPage: 1,

// pageNum: 0,

pageSize: this.pageSize

},

params: this.params,

sortDTO: {

fieldName: "",

orderBy: ""

}

},

messageJob: undefined,

isSelectionChange: false,

currentRow: undefined

};

},

computed: {

placement() {

let pageTotal = 0;

if (this.total % this.pageSize == 0) {

pageTotal = this.total / this.pageSize;

} else {

pageTotal = this.total / this.pageSize + 1;

}

pageTotal = parseInt(pageTotal);

return this.total % this.pageSize < 3 && this.currentPage == pageTotal

? "bottom"

: "top";

},

lang() {

return $store.state.lang;

}

},

created: function() {

if (!!this.action && this.autoFirst) {

this.load(this.initParam);

} else if(!this.action) {

this.loadLocal();

}

for (let c of this.columns) {

if (!~"selection".indexOf(c.type)) {

c.ellipsis = true;

}

}

this.getColumns();

},

beforeMount: function() {},

mounted: function() {},

beforeDestroy: function() {},

destroyed: function() {},

methods: {

onCurrentChange(currentRow, oldCurrentRow) {

this.currentRow = Object.assign({}, currentRow);

},

getHighlightRow() {

return this.currentRow;

},

getColumns() {

if (typeof this.columnsFn == "function") {

this.tableColumns = [].concat(this.columnsFn());

} else {

this.tableColumns = [].concat(this.columns);

}

},

refresh() {

this.param.page.currentPage = 1;

this.$nextTick(() => {

this.load();

});

},

load(param = {}, page) {

this.selection = [];

for (let p in param) {

this.param.params[p] = param[p];

}

this.loading = true;

if (!!page && typeof page == "number") {

this.param.page.currentPage = page;

}

this.param.page.recordCount = this.total;

!!this.action ? this.loadAjax() : this.loadLocal();

},

loadLocal() {

this.loadCallback(this.resource);

if (!this.isPage) {

this.$nextTick(() => {

this.tableData = [].concat(this.resource);

this.loading = false;

});

return;

}

this.total = this.resource.length;

let start = (this.param.page.currentPage - 1) * this.param.page.pageSize;

let end = start + this.param.page.pageSize;

end = this.resource.length > end ? end : this.resource.length;

this.tableData = [];

for (let i = start; i < end; i++) {

this.tableData.push(this.resource[i]);

}

this.$nextTick(() => {

this.loading = false;

});

},

loadAjax() {

if (this.server[this.action]) {

this.server[this.action](this.param).then(res => {

this.loading = false;

if (!res) return;

this.currentPage = res.data.pageNum;

this.total = res.data.total;

this.tableData = [];

let _list = [];

this.loadCallback(res.data.list);

for (let item of res.data.list) {

this.tableData.push(item);

}

});

} else {

$store.dispatch(this.action, this.param).then(res => {

this.loading = false;

if (!res) return;

this.currentPage = res.data.pageNum;

this.total = res.data.total;

this.tableData = [];

let _list = [];

this.loadCallback(res.data.list);

for (let item of res.data.list) {

this.tableData.push(item);

}

});

}

},

changePage(page) {

this.param.page.currentPage = page;

this.load();

},

changePageSize(page) {

this.param.page.pageSize = page;

this.load();

},

selectionChange(selection) {

this.isSelectionChange = true;

this.selection = selection;

if (typeof this.onSelectionChange == "function") {

this.onSelectionChange(selection);

}

this.$emit("on-selection-change",selection);

},

getSelectioned() {

return this.isSelectionChange ? this.selection : undefined;

},

sortHandle(obj) {

this.param.sortDTO.fieldName = obj.key;

this.param.sortDTO.orderBy = obj.order;

if (this.param.sortDTO.orderBy == "normal") {

this.param.sortDTO = {

fieldName: "",

orderBy: ""

};

}

this.refresh();

},

getSortData() {

return this.param.sortDTO;

},

getTableObj() {

return this.$refs["table"];

}

},

watch: {

lang() {

this.getColumns();

},

resource(newVal, oldVal) {

this.resource = newVal;

}

},

directives: {}

};

</script>

<style lang="less" scoped>

</style>

使用如下:(如有疑问随时联系博主)

《父组件》

<template>

<div class="run-mod-box">

<EasyVueTable:params="searchForm" ref="BankInfoTable" :server="server" action="queryBanks" :columns="columns" :initParams="searchForm" :highlight-row="true" @on-selection-change="onSelectionChange">

<Form :model="searchForm" ref="searchForm" slot="search-bar" label-position="top" class="ivu-form-no-margin-bottom" inline>

<Form-item prop="vendorName" label="供应商名称">

<Input type="text" v-model="searchForm.vendorName" size="small"></Input>

</Form-item>

<Form-item prop="bankName" label="开户行">

<Input type="text" v-model="searchForm.bankName" size="small"></Input>

</Form-item>

</Form>

<div slot="handle-bar">

<Button size="small" @click.native="search" type="warning" icon="search">搜索</Button>

<Button size="small" @click.native="reset" type="info" icon="loop">重置</Button>

</div>

</EasyVueTable>

</div>

</template>

原文地址:https://www.cnblogs.com/husfBK/p/9385429.html

时间: 2024-10-10 21:36:27

vue.js table组件封装的相关文章

Vue.js 自定义组件封装实录——基于现有控件的二次封装(以计时器为例)

在本人着手开发一个考试系统的过程中,出现了如下一个需求:制作一个倒计时的控件显示在试卷页面上.本文所记录的就是这样的一个过程. 前期工作 对于这个需求,自然我想到的是有没有现成的组件可以直接使用(本着不重复发明轮子的原则).于是我就在 GitHub 上找寻.确实找到了不少,但是与需求之间的差距还比较大.从零开始写又不太现实(时间摆在那里,加之自己的前端也是刚学,还没有从零开始手撸一个控件的能力),所以在已有组件的基础上进行二次封装便成了一个比较可行的方法(几乎也是唯一解).遂在 npm 上以 c

Vue.js的组件化思想--上

Vue.js的组件化思想--上 一.Vue中的组件 Vue视图层的灵魂 -  组件化 组件(Component)是 Vue.js 最强大的功能之一: 组件可以扩展 HTML 元素,封装可重用的代码: 在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. 二.全局组件的创建和注册  全局组件-步骤:1.创建组件Vue.extend(),指定组件的名称--2.注册组件Vue.component()--3.

Vue.js之组件嵌套小demo

Vue.js之组件嵌套的小demo项目 第一步:初始化一个wabpack项目,这里不在复述.第二步:在components文件夹下新建Header.vue Footer.vue和Users.vue三个组件文件 Header.vue文件: 1 <!--1模板:html结构 --> 2 <template> 3 <header> 4 <h1>{{title}}</h1> 5 </header> 6 </template> 7

Vue.js之组件嵌套

Vue.js中组件嵌套有两种方式 第一种:注册全局组件 例如在components文件夹下新建一个User.vue组件,然后在main.js文件中注册全局组件 1 //注册全局组件 2 Vue.component("users",Users); //前面的users是我们起的名字,后面的Users是我们对应的组件,想要识别这个组件,必须在上面通过import引入, 3 //引入组件 4 import Users from './components/Users' 有了全局组件的话,就可

Vue.js的组件化思想--下

Vue.js的组件化思想--下 一.组件间的通信        组件实例的作用域是孤立的:这意味着不能并且不应该在子组件的模板内直接引用父组件的数据.但是父子组件之间需要通信:父组件要给子组件传递数据,子组件需要将它内部发生的事情告知给父组件.          在 Vue.js 中,父子组件的关系可以总结为 props down, events up .父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息.如下图所示: 二. Prop - 父组件传递数据给子

Vue.js父子组件如何传值

https://blog.csdn.net/qq_40259641/article/details/81265950 Vue.js父子组件如何传值 通俗易懂原创 阿猫阿狗哈 发布于2018-07-28 22:04:42 阅读数 14278 收藏展开父子组件传值原理图 一般页面的视图App.vue应为这样 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue2.Child.vue的中创建props,然后创建一个名为message的属性 3.在A

Vue.js说说组件

什么是组件:组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展. 如何注册组件? 需要使用Vue.extend方法创建一个组件,然后使用Vue.component方法注册组件.Vue.extend方法格式如下: var MyComponent = Vue.extend({ // 选项...后面再介绍 }) 如果想要其他地方使用这个创

VUE JS 使用组件实现双向绑定

1.VUE 前端简单介绍  VUE JS是一个简洁的双向数据绑定框架,他的性能超过ANGULARJS,原因是实现的机制和ANGULARJS 不同,他在初始化时对数据增加了get和set方法,在数据set时,在数据属性上添加监控,这样数据发生改变时,就会触发他上面的watcher,而ANGULARJS 是使用脏数据检查来实现的. 另外VUEJS 入门比ANGULARJS 简单,中文文档也很齐全. 2.组件实现    在使用vue开发过程中,我们会需要扩展一些组件,在表单中使用,比如一个用户选择器.

vue.js之组件篇

Vue.js 组件 模块化:是从代码逻辑的角度进行划分的: 组件化:是从UI界面的角度进行划分的. 组件(Component)是 Vue.js 最强大的功能之一,组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树,如下图所示: 使用Vue.extend来创建全局vue组件: var com1 = Vue.extend({ template: '<h3>这是使用 Vue.extend 创建的组件&