| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- <template>
- <div class="app-table">
- <table class="app-table__body" cellspacing="0" cellpadding="0">
- <thead>
- <Draggable class="app-table__row" :list="columns" tag="tr" item-key="key">
- <template #header v-if="$slots.expand">
- <th class="app-table__cell expand"></th>
- </template>
- <template #item="{ element }">
- <th class="app-table__cell">{{ element.label }}</th>
- </template>
- </Draggable>
- </thead>
- <tbody>
- <template v-for="(row, i) in dataList" :key="i">
- <tr class="app-table__row" @click="rowClick(i)">
- <td class="app-table__cell expand" v-if="$slots.expand">
- <Icon name="arrow-down" v-if="selectedIndex === i" />
- <Icon name="arrow" v-else />
- </td>
- <td class="app-table__cell" :class="column.className" v-for="(column, n) in columns"
- :key="i + n.toString()">
- <slot :name="column.prop" :value="row[column.prop]" :row="row">{{ row[column.prop] }}</slot>
- </td>
- </tr>
- <!-- expand -->
- <tr class="app-table__row expand" v-show="selectedIndex === i" v-if="$slots.expand">
- <td class="app-table__cell" :colspan="columns.length + 1">
- <slot name="expandRow" :row="row"></slot>
- </td>
- </tr>
- </template>
- </tbody>
- </table>
- </div>
- </template>
- <script lang="ts" setup>
- import { PropType, ref } from 'vue'
- import { Icon } from 'vant'
- import { TableColumn } from './types'
- import Draggable from 'vuedraggable'
- const emit = defineEmits(['rowClick'])
- const props = defineProps({
- // 数据列表
- dataList: {
- type: Array,
- default: () => ([]),
- },
- columns: {
- type: Array as PropType<TableColumn[]>,
- default: () => ([]),
- },
- })
- const selectedIndex = ref(-1);
- const rowClick = (index: number) => {
- if (selectedIndex.value === index) {
- selectedIndex.value = -1;
- } else {
- selectedIndex.value = index;
- }
- emit('rowClick', index, props.dataList[index]);
- }
- </script>
- <style lang="less" scoped>
- @import './index.less';
- </style>
|