vue3 ts实现el-table实现行列互换位置,举个完整的例子
时间: 2023-07-07 12:37:13 浏览: 255
vue实现行列转换的一种方法
5星 · 资源好评率100%
好的,下面是一个完整的例子,展示如何使用 Vue3 和 TypeScript 实现 el-table 的行列互换位置:
```html
<template>
<el-table :data="tableData" :row-style="{ display: 'flex', flexDirection: 'row' }">
<el-table-column
v-for="(column, index) in tableColumns"
:key="index"
:prop="column.prop"
:label="column.label"
:width="column.width"
>
<template #default="{ row }">
<div
v-for="(item, i) in row"
:key="i"
:style="{ flex: '1 1 ' + (100 / row.length) + '%' }"
>
{{ item }}
</div>
</template>
</el-table-column>
</el-table>
<el-button @click="swapRowsAndColumns">行列互换</el-button>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import { TableColumn } from 'element-plus/lib/el-table';
interface TableDataItem {
name: string;
age: number;
address: string;
}
interface TableColumnItem extends TableColumn {
prop: keyof TableDataItem;
}
export default defineComponent({
name: 'TableDemo',
setup() {
const tableData = ref<TableDataItem[]>([
{ name: 'John', age: 18, address: 'New York' },
{ name: 'Mike', age: 22, address: 'Los Angeles' },
{ name: 'Amy', age: 25, address: 'Chicago' },
]);
const tableColumns = ref<TableColumnItem[]>([
{ prop: 'name', label: '姓名', width: '100px' },
{ prop: 'age', label: '年龄', width: '100px' },
{ prop: 'address', label: '地址', width: '200px' },
]);
const swapRowsAndColumns = () => {
const newData: TableDataItem[] = [];
for (let i = 0; i < tableData.value[0].length; i++) {
const newRow: TableDataItem = {} as TableDataItem;
for (let j = 0; j < tableData.value.length; j++) {
newRow[tableColumns.value[j].prop] = tableData.value[j][i];
}
newData.push(newRow);
}
tableData.value = newData;
tableColumns.value = tableColumns.value.map((column) => {
return {
prop: column.prop === 'name' ? 'index' : column.prop,
label: column.prop === 'name' ? '#' : column.label,
width: column.width,
};
});
};
return {
tableData,
tableColumns,
swapRowsAndColumns,
};
},
});
</script>
```
在这个例子中,我们首先定义了 `TableDataItem` 和 `TableColumnItem` 接口,分别代表表格数据项和表格列项的类型。接着,我们使用 `defineComponent` 函数来定义一个组件,并且在 `setup` 函数中定义了表格数据和表格列的数据。
在模板中,我们使用了上面提到的方法来实现行列互换的效果,并且添加了一个按钮,用来触发行列互换的功能。
在 `swapRowsAndColumns` 函数中,我们首先创建一个 `newData` 数组,用来存储行列互换后的数据。然后使用两个循环来遍历表格数据和表格列,将每一列的数据按照行的方式存储到 `newData` 数组中。
接着,我们对表格列进行修改,将第一列的属性名由 `name` 改为 `index`,并将第一列的标签由 `姓名` 改为 `#`,从而让表格列的顺序和表格数据的顺序保持一致。
最后,将修改后的数据重新赋值给 `tableData` 和 `tableColumns`,界面上的表格就会自动更新,实现行列互换的效果。
阅读全文