使用iview的组件 Table 表格,有固定列,设置其中一个列适应屏幕大小

本文介绍在使用 iView 的 Table 组件时,如何解决固定列和自适应列宽的问题。通过计算表格总宽度与各列设定宽度的差值,实现特定列的自适应宽度调整,确保表格在不同屏幕尺寸下布局合理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

在使用iview的组件Table表格时,有固定列,表格列宽不等。
在表格平铺时,不能自适应宽度。

clipboard.png

问题

每个列有需要设置的宽度,有固定的列,很难调整某一列的宽度为刚刚好的。此时需要某一列自适应宽度。

解决

clipboard.png

<template>
    <Table ref="testTable" border :columns="columns" :data="data"></Table>
</template>
<script>

    export default {
        data () {
            return {
                columns:[
                    {
                        title: 'Show',
                        key: 'show',
                        width: 100
                    },
                    {
                        title: 'Weak',
                        key: 'weak',
                        width: 250

                    },
                    {
                        title: 'Signin',
                        key: 'signin',
                        width: 100

                    },

                    {
                        title: 'Click',
                        key: 'click',
                        width: 300

                    },
                    {
                        title: 'Active',
                        key: 'active',
                        width: 150

                    },
                    {
                        title: '7, retained',
                        key: 'day7',
                        width: 150

                    },
                    {
                        title: '30, retained',
                        key: 'day30',
                        width: 150

                    },
                    {
                        title: 'The next day left',
                        key: 'tomorrow',
                        width: 150,
                        fixed:'right'

                    },

                ],
                data: this.mockTableData2(),
            }
        },
        mounted () {
            // 计算宽度
            this.columns=this.setTableBlankColumnsWidth(
                {
                    tableObj:this,
                    ref:'testTable',
                    columns:this.columns,
                    focusKey:'day7'
                }
            );

        },
        methods:{
            /**
             * 模拟 数据
             */
            mockTableData2 () {
                let data = [];
                function getNum() {
                    return Math.floor(Math.random () * 10000 + 1);
                }
                for (let i = 0; i < 10; i++) {
                    data.push({
                        name: 'Name ' + (i+1),
                        fav: 0,
                        show: getNum(),
                        weak: getNum(),
                        signin: getNum(),
                        click: getNum(),
                        active: getNum(),
                        day7: getNum(),
                        day30: getNum(),
                        tomorrow: getNum(),
                        day: getNum(),
                        week: getNum(),
                        month: getNum()
                    })
                }
                return data;
            },
            /**
             * 设置表头的宽度
             * @returns {Array}
             */
            getColumns(){
                let _columns=[];

                _columns=this.setTableBlankColumnsWidth(
                    {
                        tableObj:this,
                        ref:'testTable',
                        columns:this.columns,
                        focusKey:'day7'
                    }
                );
                return _columns;
            },
            /**
             * 2018年9月28日10:39:11
             * @author pink-pink
             * @describe 此方法可以作为公共方法调用,此处为了方便直接写在这里了。
             * 处理表格空白问题
             * 1. 获取到表格的宽度 tableClientWidth
             * 2. 所有列宽的和(CheckBox、序号、操作列等都计算在内) columnsWidthSum
             * 3. 自适应的列是,action 前面的列,即最后一个表格内容列 focusColumnKey
             * 4. columnsWidthSum<=tableClientWidth
             *
             * params tableObj  有表格组件的 this
             * params ref       表格的refName
             * params columns   表格的所有的列
             * params focusKey  指定放宽的列(没有此参数。默认是右侧固定列前面那个列)
             * @returns {Array}
             */
            setTableBlankColumnsWidth(json){
                let tableObj=json.tableObj || {};
                let columns=json.columns || [];
                let tableClientWidth=tableObj.$refs[json.ref] ? tableObj.$refs[json.ref].$el.clientWidth : 0;

                let columnsWidthSum=0;
                let otherColumnWidth=0;

                let focusColumn={};
                let focusColumnWidth=0;
                let focusIndex=-1;

                // 3. 操作列前面的表格内容列
                if(json.focusKey)
                {
                    // 有指定目标key
                    columns.forEach((column, columnIndex)=>{
                        if(column.key==json.focusKey)
                        {
                            focusColumn=column || {};
                            focusColumnWidth=focusColumn.width ? Number(focusColumn.width) : 0;
                            focusIndex=columnIndex;
                        }
                    });
                }
                else
                {
                    focusIndex=columns.length-2;
                    focusColumn=columns[focusIndex] || {};
                    focusColumnWidth=focusColumn.width ? Number(focusColumn.width) : 0;

                }

                // 2. 获取到,所有列宽的
                columns.forEach((column, columnIndex)=>{
                    columnsWidthSum+=Number(column.width);
                });
                // 拿到其他列的和
                otherColumnWidth=columnsWidthSum-focusColumnWidth;

                // 4. 计算
                if(columnsWidthSum<=tableClientWidth)
                {
                    columns[focusIndex] && (columns[focusIndex].width=tableClientWidth-otherColumnWidth);
                }

                return columns;
            }
        }
    }
</script>
在Vue2中使用iView框架开发时,如果你想让一组数据按照特定的Table表格中展示,可以遵循以下步骤: 1. 首先,确保你已经在项目中安装了`iview`库,并且已经引入了`<table>`组件以及相关的表头和单元格插件。 ```html <script src="https://unpkg.com/iview/dist/iview.min.js"></script> ``` 2. 定义数据结构:将你需要在表格中展示的数据存储在一个数组中,每条数据应该是一个对象,包含你要显示的所有字段。 ```javascript data() { return { tableData: [ { id: 1, name: '张三', age: 20 }, { id: 2, name: '李四', age: 25 }, // 更多数据... ] }; } ``` 3. 使用v-for指令遍历数据并在模板中渲染每一行。在每个单元格中,你可以直接引用对象的属性名作为插槽内容。 ```html <table border :columns="tableColumns" :data="tableData"> <template v-for="item in tableData"> <tr> <td slot="name">{{ item.name }}</td> <!-- 显示name --> <td slot="age">{{ item.age }}</td> <!-- 显示age --> <!-- 可以添加更多,如手机号码等 --> </tr> </template> </table> <script> // 初始化配置 export default { data() { return { tableColumns: [ { field: 'name', title: '姓名' }, // 标题 { field: 'age', title: '年龄' } // 标题 // 添加其他字段标题... ] }; } }; </script> ``` 4. 如果需要对某些进行排序、搜索或过滤,可以结合`iTable`组件提供的功能,如`methods`里的`sortColumn`、`filterMethod`等。 以上就是一个基本的例子,你可以根据实际需求调整字段名称和样式。如果你有多个表格,还可以将这些设置封装到单独的组件中以便复用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值