基于iView的列表组件封装

Posted lichking2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于iView的列表组件封装相关的知识,希望对你有一定的参考价值。

封装的好处多多,代码便于维护、减少代码量、减少BUG

前台封装以前没有尝试过,这回试试,哈哈

目录

1、列表组件封装

2、树组件封装

3、下拉框组件封装

4、上传组件封装

列表组件的API

 属性 说明 类型 默认值
 url 请求列表数据的地址 必填  String
pagingOption 列表底部是否显示分页信息及总数,有两个配置项 showPaging、showTotal Object 显示分页及总数信息
cols 列定义 必填 Array
height   列表高度 选填 Number 500
checkBox 是否显示复选框 选填 Boolean 显示

 

事件

onSelect:选择某一行时触发,返回值是当前行数据

 

slot

toolButtons:列表上方的工具按钮定义

 

列表组件的封装

1、dataTable.vue文件

<template>
    <div>
        <div class="buttonGroup">
            <slot name="toolButtons"></slot>
        </div>
        <Table :loading="loading" border :height=\'height\' stripe :columns="cols" :data="dataContent" @on-selection-change="onSelect"></Table>
        <Page ref="paging" v-if="pagingOption.showPaging" :total="total" style="margin-top:5px;float: right"
              :show-total="pagingOption.showTotal"
              @on-change="getData"></Page>
    </div>
</template>

<script>

    export default {
        data: function () {
            return {
                current: 1,
                pageSize: 10,
                dataContent: [],
                loading: false,
                total: 0,
                initPage: 1
            }
        },
        props: {
            height:{
              type:Number,
              default:500
            },
            url: {
                type: String,
                require: true
            },
            pagingOption: {
                type: Object,
                default: function () {
                    return {
                        showPaging: true,
                        showTotal: true
                    }
                }
            },
            cols: {},
            checkBox:{
                type:Boolean,
                default:true
            }
        },
        methods: {
            refresh() {
                this.getData(1)
            },

            getData(pageNum) {
                this.loading = true
                this.$http.get(this.url, this.getPagingInfo(pageNum)).then(res => {
                    this.dataContent = res.result.data
                    this.total = res.result.total
                    this.loading = false
                })
            },
            getPagingInfo(page) {
                const param = {
                    current: page,
                    pageSize: this.pageSize
                }
                return param
            },
            onSelect(selection){
                this.$emit(\'onSelect\',{
                    selection:selection
                })
            }
        },
        mounted() {
            this.getData(this.initPage)
        },
        created(){
            if(this.checkBox){
                this.cols.unshift({
                    type: \'selection\',
                    width: 60,
                    align: \'center\'
                })
            }
        }
    }
</script>

<style lang="less" scoped>
    .margin(@border_width:10px) {
        margin-bottom: @border_width;
    }

    .buttonGroup {
        text-align: right;
        .margin(5px)
    }
</style>

2、dataTable.js

import dataTable from \'./dataTable.vue\'

const _dataTable = {
    install:function(Vue){
        Vue.component(\'WtDataTable\',dataTable)
    }
}

export default _dataTable

3、添加组件到Vue中

import WtDataTable from \'./components/table/dataTable.js\'
Vue.use(WtDataTable)

列表组件的应用(简单)

以系统日志模块举例

syslogPerformance.vue

<template>
    <WtDataTable :url="url" :checkBox="checkBox" :cols="cols">
    </WtDataTable>
</template>

<script>
    export default {
        data:function(){
            return {
                url:\'syslogPerformance/getData\',
                checkBox:false,
                cols:[
                    {
                        title: \'来访主机\',
                        key: \'remoteHost\'
                    },
                    {
                        title: \'访问的url\',
                        key: \'requestURI\'
                    },
                    {
                        title: \'请求类型\',
                        key: \'requestType\'
                    },
                    {
                        title: \'远程端口\',
                        key: \'remotePort\'
                    },
                    {
                        title: \'耗时\',
                        key: \'timeConsuming\'
                    },
                    {
                        title: \'发起时间\',
                        key: \'createDateTime\'
                    }
                ]
            }
        }
    }
</script>

<style scoped>

</style>

效果

 

列表组件应用(复杂)

<template lang="html">
    <div>
        <WtDataTable ref="userList" :url="url"
                     :pagingOption="pagingOption" :cols="columns" @onSelect="onSelect">
            <div slot="toolButtons">
                <Button type="primary" @click="add">新增</Button>
                <Button type="error" @click="batchDelete">删除</Button>
            </div>
        </WtDataTable>
    </div>
</template>

<script>
    export default {
        data() {
return {
                url: \'/sysUser/getData\',

                pagingOption: {
                    showPaging: true,
                    showTotal: true
                },
                columns: [
                    {
                        title: \'Id\',
                        key: \'userId\',
                        display: \'none\'
                    },
                    {
                        title: \'姓名\',
                        key: \'userName\',
                        render: (h, params) => {
                            return h(\'a\', {
                                style: {
                                    color: \'blue\',
                                    \'text-decoration\': \'underline\'
                                },
                                on: {
                                    click: () => {
                                        this.$Modal.info({
                                            title: \'User Info\',
                                            content: \'neirong\'
                                        })
                                    }
                                }
                            }, params.row.userName)
                        }
                    },
                    {
                        title: \'账号\',
                        key: \'account\'
                    },
                    {
                        title: \'密码\',
                        key: \'password\'
                    },
                    {
                        title: \'邮箱\',
                        key: \'mail\'
                    },
                    {
                        title: \'生日\',
                        key: \'birthday\'
                    },
                    {
                        title: \'状态\',
                        key: \'inUse\',
                        render: (h, params) => {
                            let text = params.row.inUse ? \'开启\' : \'禁用\'
                            return h(\'span\', text)
                        }
                    },
                    {
                        title: \'操作\',
                        key: \'action\',
                        fixed: \'right\',
                        width: 120,
                        render: (h, params) => {
                            return h(\'div\', [
                                h(\'Button\', {
                                    props: {
                                        type: \'error\',
                                        size: \'small\'
                                    },
                                    on: {
                                        click: () => {
                                            // this.remove(params)
                                            const _this = this
                                            WT.modal.confirm({
                                                content: \'确认删除?\',
                                                onOk: function () {
                                                    _this.deleteUser(params)
                                                }
                                            })
                                        }
                                    }
                                }, \'删除\'),
                                h(\'Button\', {
                                    props: {
                                        type: \'text\',
                                        size: \'small\'
                                    },
                                    on: {
                                        click: () => {
                                            this.edit(params)
                                        }
                                    }
                                }, \'修改\')
                            ]);
                        }
                    }
                ],

                defaultAvatars:[],
                ruleValidate: {
                    userName: [{
                        required: true,
                        message: \'用户姓名不能为空\',
                        trigger: \'blur\'
                    }],
                    account: [{
                        required: true,
                        message: \'账号不能为空\',
                        trigger: \'blur\'
                    }],
                    password: [{
                        trigger: \'blur\',
                        validator: validatePass
                    }],
                    passwordConfirm: [{
                        trigger: \'blur\',
                        validator: validatePassCheck
                    }],
                    mail: [
                        {required: true, message: \'邮箱必填\', trigger: \'blur\'},
                        {type: \'email\', message: \'邮箱地址有误\', trigger: \'blur\'}
                    ]
                },
                userInfo: {
                    userId: null,
                    userName: \'\',
                    mail: \'\',
                    password: \'\',
                    account: \'\',
                    passwordConfirm: \'\',
                    inUse: true,
                    birthday: \'\',
                    avatars: []
                },
                selectedItem: [],
                mailSuffixs: []
            }
        },
        methods: {

            //列表方法
            add() {
                this.showUserAddModal()
            },
            batchDelete() {
                if (this.selectedItem) {
                    const userIds = new Array()
                    this.selectedItem.forEach((k, v) => {
                        userIds.push(k.userId)
                    })
                    this.$http.delete(\'/sysUser/deleteBatch\', userIds).then(res => {
                        WT.toast.success("删除成功")
                        this.reloadDataGrid()
                    })
                }
            }
        }
    }
</script>

<style lang="css">
    .ivu-form-item-content {
        text-align: left;
    }
</style>

 

效果

 

 

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=ewx3bubweekk 

以上是关于基于iView的列表组件封装的主要内容,如果未能解决你的问题,请参考以下文章

iview使用select封装的组件添加filterable属性有空格

iviewui也就是之前的iview最垃圾的组件库

基于vue的iviewui组件应用和封装开发

iview page组件页码显示的时候乱码

[转]iview的render函数用法

iVIew对话框封装