vue + element UI <table>表格的常见的案例

一.table组件的方法,事件

二.常用的事件,属性

(一).属性
1.多选框(type = "selection") 需要实现勾选的功能
在<el-table> 内加入<el-table-column type="selection" width="55"></el-table-column>

2. :data="tableData" 是table的数据绑定

<el-table :data="tableData">
 
export default {   
    data() {
        return{
            tableData: [],
        }
    }
}

3.formatter 用来格式化内容

对table的值进行处理。Function(row, column, cellValue, index){}

A.使用formatter需要注意以下几点:
①无论formatter出何种形式,格式化出的DOM一定都是被包含在默认的div标签内
②在写formatter函数时要保证有值返回,否则单元格没有内容可展示,所以if的时候别忘了else
③formatter函数不会作用在列属性checkbox为true的单元格上,checkbox列是组件预留的。

<template>
    <el-table :data="tableData3"  ref="multipleTable">
        <el-table-column type="selection" width="55" ></el-table-column>
        <el-table-column type="index" label="序号" width="60"></el-table-column>
        <el-table-column prop="sex" label="性别" width="100" :formatter="formatSex"></el-table-column>
        <el-table-column prop="date" label="日期"></el-table-column>
        <el-table-column prop="name" label="姓名"></el-table-column>
         <el-table-column prop="IsAudit"  :formatter="formatterColumn" label="审核状态" ></el-table-column>
        <el-table-column prop="address" label="地址"></el-table-column>
    </el-table>
</template>
<script>
export default {   
    data() {
        return {
            tableData3: [{
                id:'1',
                date: '2016-05-03',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1518 弄',
                IsAudit:0,
                sex:'1'
            }, {
                id:'2',
                date: '2016-05-02',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1518 弄',
                IsAudit:1,
                sex:'0'
            }, {
                id:'3',
                date: '2016-05-02',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1518 弄',
                IsAudit:10,
                sex:'-1'
            }]
        }
    },
    mounted() {
    },
    methods: {
        formatSex: function (row, column, cellValue, index) {
            return row.sex == 1 ? '男' : row.sex == 0 ? '女' : '未知';
        },
        //状态改成汉字
        formatterColumn(row, column) {
            switch(row.IsAudit){
                case 0:
                    return '未通过';
                    break;
                case 1:
                    return '审核通过';
                    break;
                case 10:
                    return '待审核';
                    break;
                case 9:
                    return '草稿';
                    break;
                default:
                    return '未知';
            }
        }
    }
}
</script>
image.png

4.selectable (row, index) 是否可以选中

注意:仅对 type=selection 的列有效,类型为 Function,Function 的返回值用来决定这一行的 CheckBox 是否可以勾选

使用:

<template>
    <el-table :data="tableData3"  ref="multipleTable" @row-click="handleCurrentChange">
        <el-table-column type="selection" width="55"  :selectable="selectable"></el-table-column>
    </el-table>
</template>
<script>
export default {   
    methods: {
        selectable(row, index){
            if(index === 1){
                return true;
            }else{
                return false;
            }
        }
    }
}
</script>

只有第二条是可以选中 其他不能


image.png

(二).方法
1.row-click 点击行事件
<el-table @row-click="handleRowChange">
handleRowChange(row, event, column){ row此行的数据 }
2.selection-change 获取选中的所有值
<el-table @selection-change="selectionRowsChange">
selectionRowsChange(val){ val 选中的值}


image.png

1.table tr 点击 复选框选中 再次点击 复选框取消选中

①设置一个全局函数

exports.install = function (Vue, options) {  
    //删除数组 指定的元素  
    Vue.prototype.removeByValue=function(arr, val){  
        for(var i=0; i<arr.length; i++) {  
            if(arr[i] == val) {  
                arr.splice(i, 1);  
                break;  
            }  
        }  
    };  
};  

②tableUser.vue

<!--用户名 增删改 基本操作-->
<template>
    <section>
        <!--工具条-->
        <el-col :span="24" class="el-table_headtoolbar" style="padding-bottom: 0px;">
            <el-form :inline="true" :model="filters" class="userform" label-width="50px">
                <el-form-item label="姓名"  prop="name">
                    <el-input v-model="filters.name" placeholder="姓名"  prefix-icon="el-icon-search"></el-input>
                </el-form-item>
                <el-form-item label="性别" prop="sex">
                    <el-select v-model="filters.sex" filterable placeholder="请选择" prop="sex">
                        <el-option v-for="item in sexOptions" :key="item.value"  :label="item.label" :value="item.value">
                        </el-option>
                    </el-select>
                </el-form-item>
                <el-dropdown split-button type="primary" @click="btnSearch" trigger="click">
                    检索
                    <el-dropdown-menu slot="dropdown" class="lyzbtn-group" trigger="click">
                        <el-dropdown-item @click.native="btnReset">重置</el-dropdown-item>
                    </el-dropdown-menu>
                </el-dropdown>
                <el-dropdown split-button type="primary" @click="btnNew" trigger="click">
                    新增
                    <el-dropdown-menu slot="dropdown" trigger="click">
                        <el-dropdown-item  @click.native="btnEdit">编辑</el-dropdown-item>
                        <el-dropdown-item  @click.native="btnDelete">删除</el-dropdown-item>
                    </el-dropdown-menu>
                </el-dropdown>
            </el-form>
        </el-col>
        <!--列表-->
        <el-table :data="users.slice((page-1)*pagesize,page*pagesize)"  highlight-current-row v-loading="listLoading"  style="width: 100%;"  @selection-change="selsUserChange" class="userTableJs" @row-click="handleRowChange"  ref="table">
            <el-table-column type="selection" width="55">
            </el-table-column>
            <el-table-column type="index" label="序号" width="60">
            </el-table-column>
            <el-table-column prop="name" label="姓名" width="120">
            </el-table-column>
            <el-table-column prop="sex" label="性别" width="100" :formatter="formatSex">
            </el-table-column>
            <el-table-column prop="age" label="年龄" width="100" >
            </el-table-column>
            <el-table-column prop="birth" label="生日" width="120">
            </el-table-column>
            <el-table-column prop="addr" label="地址" min-width="180">
            </el-table-column>
        </el-table>
        <!--工具条-->
        <el-col :span="24" class="el-table_footertoolbar">
            <el-pagination layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange" :page-sizes="[10, 20, 50, 100]" :page-size="pagesize" :total="users.length" style="float:right;">
            </el-pagination>
        </el-col>
        <!--新增界面-->
        <el-dialog title="新增" :visible.sync="addFormVisible">
            <el-form :model="addForm" label-width="80px" :rules="addFormRules" ref="addForm">
                <el-form-item label="姓名" prop="name">
                    <el-input v-model="addForm.name" auto-complete="off"></el-input>
                </el-form-item>
                <el-form-item label="性别">
                    <el-radio-group v-model="addForm.sex">
                        <el-radio class="radio" :label="1">男</el-radio>
                        <el-radio class="radio" :label="0">女</el-radio>
                    </el-radio-group>
                </el-form-item>
                <el-form-item label="年龄">
                    <el-input-number v-model="addForm.age" :min="0" :max="200"></el-input-number>
                </el-form-item>
                <el-form-item label="生日">
                    <el-date-picker type="date" placeholder="选择日期" v-model="addForm.birth"></el-date-picker>
                </el-form-item>
                <el-form-item label="地址">
                    <el-input type="textarea" v-model="addForm.addr"></el-input>
                </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button @click.native="addFormVisible = false">取消</el-button>
                <el-button type="primary" @click.native="addSubmit" :loading="addLoading">提交</el-button>
            </div>
        </el-dialog>
        <!--编辑界面-->
        <el-dialog title="编辑" :visible.sync="editFormVisible">
            <el-form :model="editForm" label-width="80px" :rules="editFormRules" ref="editForm">
                <el-form-item label="姓名" prop="name">
                    <el-input v-model="editForm.name" auto-complete="off"></el-input>
                </el-form-item>
                <el-form-item label="性别">
                    <el-radio-group v-model="editForm.sex">
                        <el-radio class="radio" :label="1">男</el-radio>
                        <el-radio class="radio" :label="0">女</el-radio>
                    </el-radio-group>
                </el-form-item>
                <el-form-item label="年龄">
                    <el-input-number v-model="editForm.age" :min="0" :max="200"></el-input-number>
                </el-form-item>
                <el-form-item label="生日">
                    <el-date-picker type="date" placeholder="选择日期" v-model="editForm.birth"></el-date-picker>
                </el-form-item>
                <el-form-item label="地址">
                    <el-input type="textarea" v-model="editForm.addr"></el-input>
                </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button @click.native="editFormVisible = false">取消</el-button>
                <el-button type="primary" @click.native="editSubmit" :loading="editLoading">提交</el-button>
            </div>
        </el-dialog>
    </section>
</template>
<script>
import util from '@/utils/index'//日期的操作
import { getUserListPage,batchRemoveUser,addUser,editUser} from '@/assets/api/api';//接口
export default {
    data() {
        return {
            filters: {
                name: ''
            },
            //性别
            sexOptions:[
                {value: '1',label: '男'}, 
                {value: '0',label: '女'}
            ],
            users: [],//表格数据 
            page: 1,//当前页数
            pagesize:10,//一页显示几条
            listLoading: false,
            sels: [],//列表选中列
            total: 0,
            editFormVisible: false,//编辑界面是否显示
            editLoading: false,
            editFormRules: {
                name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
                birth: [{ type: 'date', required: true, message: '日期必须填写', trigger: 'change' }]
            },
            //编辑界面数据
            editForm: {
                id:undefined,
                name: '',
                sex:-1,
                age: 0,
                birth:new Date(),
                addr: ''
            },
 
            addFormVisible: false,//新增界面是否显示
            addLoading: false,
            addFormRules: {
                name: [{ required: true, message: '请输入姓名', trigger: 'blur' },],
                birth: [{ type: 'date', required: true, message: '日期必须填写', trigger: 'change' }]
            },
            //新增界面数据
            addForm: {
                name: '',
                sex: -1,
                age: 0,
                birth: new Date(),
                addr: ''
            },
            arrID:[],
 
        }
    },
    methods: {
        //性别显示转换
        formatSex: function (row, column) {
            return row.sex == 1 ? '男' : row.sex == 0 ? '女' : '未知';
        },
        //初始页page、初始每页数据数pagesize和数据data
        handleSizeChange(size){
            this.pagesize = size;
        },
        handleCurrentChange(val) {
            this.page = val;
            this.getUsers();
        },
        handleRowChange(row, event, column){
            var same=false;
            if(this.arrID.length > 0){
                for(var i=0; i<this.arrID.length ;i++){
                    if(this.arrID[i]==row.id){
                        same=true;
                        this.removeByValue(this.arrID, row.id);
                        break;
                    }
                }
                if(same==true){
                    this.$refs.table.toggleRowSelection(row,false);
                }else{
                    this.$refs.table.toggleRowSelection(row,true);
                    this.arrID.push(row.id);
                }
            }else{
                this.$refs.table.toggleRowSelection(row,true);
                this.arrID.push(row.id);
            }
        },
        //获取用户列表
        getUsers() {
            let para = {
                page: this.page,
                name: this.filters.name,
                sex: this.filters.sex
 
            };
            this.listLoading = true;
            getUserListPage(para).then((res) => {
                this.users = res.data.users;
                this.total = res.data.total;
                this.listLoading = false;
                
            });
        },
        //检索
        btnSearch(){
            console.log('检索')
            var searchParams = { name: this.filters.name, sex: this.filters.sex };
                //searchUser(searchParams).then(data => {
                
                //});
        },
        //重置
        btnReset(){
            this.resetForm(".userform");
        },
        //新增
        btnNew(){
            this.addFormVisible = true;
        },
        //编辑
        btnEdit(){
            var ids = this.sels.map(item => item.id);
            if(ids =='' || ids.length >1){
                this.$alert('请选择一条要编辑的记录', '提示', {
                    dangerouslyUseHTMLString: true
                });
            }else{
                const obj={};
                obj.id=this.sels.map(item => item.id).toString();
                obj.name=this.sels.map(item => item.name).toString();
                console.log(this.sels.map(item => item.sex).toString())
                if(this.sels.map(item => item.sex).toString() == 1){
                    obj.sex=1;
                }else if(this.sels.map(item => item.sex).toString() == 0){
                    obj.sex=0;
                }else{
                    obj.sex=-1;
                }
                obj.age=this.sels.map(item => item.age).toString();
                obj.birth=this.sels.map(item => item.birth).toString();
                obj.addr=this.sels.map(item => item.addr).toString();
                this.editFormVisible = true;
                this.editForm = Object.assign({},obj);
            }
 
        },
        //删除
        btnDelete(){
            var ids = this.sels.map(item => item.id).toString();
            if(ids ==''){
                this.$alert('请选择要删除的记录', '提示', {
                    dangerouslyUseHTMLString: true
                });
            }else{
                this.$confirm('确认删除选中记录吗?', '提示', {
                    type: 'warning'
                }).then(() => {
                    this.listLoading = true;
                    //NProgress.start();
                    let para = { ids: ids };
                    batchRemoveUser(para).then((res) => {
                        this.listLoading = false;
                        //NProgress.done();
                        this.$message({
                            message: '删除成功',
                            type: 'success'
                        });
                        this.getUsers();
                    });
                }).catch(() => {
 
                });
            }
        },
        //编辑
        editSubmit: function () {
            this.$refs.editForm.validate((valid) => {
                if (valid) {
                    this.$confirm('确认提交吗?', '提示', {}).then(() => {
                        this.editLoading = true;
                        //NProgress.start();
                        let para = Object.assign({}, this.editForm);
                        para.birth = (!para.birth || para.birth == '') ? '' : util.formatDate.format(new Date(para.birth), 'yyyy-MM-dd');
                        editUser(para).then((res) => {
                            this.editLoading = false;
                            //NProgress.done();
                            this.$message({
                                message: '提交成功',
                                type: 'success'
                            });
                            this.$refs['editForm'].resetFields();
                            this.editFormVisible = false;
                            this.getUsers();
                        });
                    });
                }
            });
        },
        //新增
        addSubmit: function () {
            this.$refs.addForm.validate((valid) => {
                if (valid) {
                    this.$confirm('确认提交吗?', '提示', {}).then(() => {
                        this.addLoading = true;
                        //NProgress.start();
                        let para = Object.assign({}, this.addForm);
                        para.birth = (!para.birth || para.birth == '') ? '' : util.formatDate.format(new Date(para.birth), 'yyyy-MM-dd');
                        addUser(para).then((res) => {
                            this.addLoading = false;
                            //NProgress.done();
                            this.$message({
                                message: '提交成功',
                                type: 'success'
                            });
                            this.$refs['addForm'].resetFields();
                            this.addFormVisible = false;
                            this.getUsers();
                        });
                    });
                }
            });
        },
        selsUserChange(sels) {
            this.sels = sels;
            if(sels.length>0){
                var valId=[];
                for(var i=0;i<sels.length;i++){
                    var arrIDsame=false;
                    valId.push(sels[i].id);
                }
                this.arrID=valId;
            }
        }
    },
    mounted() {
        this.getUsers();
        
    }
}
</script>

3.table行内编辑
vue slot的scope传递,要表述的意思组件中slot这个插槽上可以赋值各种属性,在调用组件的页面中可以使用<template slot-scope="props"> 来获取插槽上的属性值,获取到的值是一个对象。
(1).一行一行编辑

<template>
    <el-table :data="tableData" style="width: 100%">
        <el-table-column label="日期" width="180">
            <template slot-scope="scope">
                <span>{{scope.row.date}}</span>
            </template>
        </el-table-column>
        <el-table-column prop="name" label="姓名">
            <template slot-scope="scope">
                <span>{{scope.row.name}}</span>
            </template>
        </el-table-column>
        <el-table-column prop="address" label="地址">
            <template slot-scope="scope">
                <template v-if="scope.row.edit">
                    <el-input class="edit-input" size="small" v-model="scope.row.address"></el-input>
                </template>
                <span v-else>{{ scope.row.address }}</span>
            </template>
        </el-table-column>
        <el-table-column label="操作">
            <template slot-scope="scope">
                <el-button v-if="scope.row.edit" type="success" @click="confirmEdit(scope.$index, scope.row)" size="small" icon="el-icon-circle-check-outline">保存</el-button>
                <el-button v-else type="primary" @click='scope.row.edit=!scope.row.edit' size="small" icon="el-icon-edit">编辑</el-button>
            </template>
        </el-table-column>
    </el-table>
</template>
 
<script>
  export default {
    data() {
      return {
        tableData: [{
            id:'1',
            date: '2016-05-02',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1518 弄',
            edit:false
        }, {
            id:'2',
            date: '2016-05-04',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1517 弄',
            edit:false
        }, {
            id:'3',
            date: '2016-05-01',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1519 弄',
            edit:false
        }, {
            id:'4',
            date: '2016-05-03',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1516 弄',
            edit:false
        }]
      }
    },
    methods: {
        confirmEdit(index,row){
            row.edit = false;
            this.$message({
                message: '该地址已经成功修改',
                type: 'success'
            })
        }
    }
  }
</script>
image.png

(2).table批量编辑列字段

<template>
    <section>
        <!--工具条-->
        <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
            <el-button v-if="editOk"  type="success" @click="btnOk" size="small" icon="el-icon-circle-check-outline">保存</el-button>
            <el-button v-else="editOk" type="primary"  @click="btnEdit" size="small" icon="el-icon-edit">编辑</el-button>
        </el-col>
        <el-table :data="tableData" style="width: 100%">
            <el-table-column label="日期" width="180">
                <template slot-scope="scope">
                    <span>{{scope.row.date}}</span>
                </template>
            </el-table-column>
            <el-table-column prop="name" label="姓名">
                <template slot-scope="scope">
                    <span>{{scope.row.name}}</span>
                </template>
            </el-table-column>
            <el-table-column prop="address" label="地址">
                <template slot-scope="scope">
                    <template  v-if="editOk">
                        <el-input class="edit-input" size="small" v-model="scope.row.address"></el-input>
                    </template>
                    <span v-else>{{ scope.row.address }}</span>
                </template>
            </el-table-column>
        </el-table>
    </section>
</template>
<script>
  export default {
    data() {
      return {
        tableData: [{
            id:'1',
            date: '2016-05-02',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1518 弄',
        }, {
            id:'2',
            date: '2016-05-04',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1517 弄',
        }, {
            id:'3',
            date: '2016-05-01',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1519 弄',
        }, {
            id:'4',
            date: '2016-05-03',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1516 弄',
        }],
        editOk:false
      }
    },
    methods: {
        btnEdit(){
             this.editOk=true;
        },
        btnOk(){
            this.editOk=false;
        }
    }
  }
</script>
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容