2117 lines
36 KiB
Plaintext
2117 lines
36 KiB
Plaintext
|
|
---
|
|||
|
|
description: cl-table 组件示例
|
|||
|
|
globs: *.tsx, *.ts, *.vue
|
|||
|
|
---
|
|||
|
|
## 起步 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>base</el-tag>
|
|||
|
|
<span>起步</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/base.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="起步" width="80%">
|
|||
|
|
<!--【很重要】需要包含在 cl-crud 组件内 -->
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<!-- 参数文档查看:https://element-plus.org/zh-CN/component/table.html#table-%E5%B1%9E%E6%80%A7 -->
|
|||
|
|
<cl-table ref="Table" stripe></cl-table>
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
// 测试数据,移步到 cl-crud 例子查看
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
// 是否自动计算表格高度,表格高度等于减去上区域和下区域的高度
|
|||
|
|
//【很重要】在弹窗或者上级不确定高度中,设置 autoHeight: false,避免显示异常。也可以手动设置最大高度 maxHeight: 500
|
|||
|
|
autoHeight: false,
|
|||
|
|
|
|||
|
|
// 右键菜单,移步到右键菜单示例中查看
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
// 列配置,点击 columns 查看描述
|
|||
|
|
// 更多配置查看 el-table-column 文档,https://element-plus.org/zh-CN/component/table.html#table-column-%E5%B1%9E%E6%80%A7
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
// 是否为多选框操作列
|
|||
|
|
type: 'selection'
|
|||
|
|
|
|||
|
|
// 是否为序号列
|
|||
|
|
// type: "index"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
// 表头标题
|
|||
|
|
label: '姓名',
|
|||
|
|
|
|||
|
|
// 绑定值
|
|||
|
|
prop: 'name',
|
|||
|
|
|
|||
|
|
// 最小宽度
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
// 字典匹配,移步到字典示例中查看
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
// 是否排序,desc, asc
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 多级表头 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>children</el-tag>
|
|||
|
|
<span>多级表头</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/children.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="多级表头" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table" />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
label: '用户信息',
|
|||
|
|
prop: 'baseInfo',
|
|||
|
|
minWidth: 250,
|
|||
|
|
|
|||
|
|
// 配置 children 参数
|
|||
|
|
children: [
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 自定义列展示 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>column-custom</el-tag>
|
|||
|
|
<span>自定义列展示</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/column-custom.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="自定义列展示" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<!--【很重要】组件配置,设置为 Table 的 columns,也可以自定义 -->
|
|||
|
|
<cl-column-custom :columns="Table?.columns" />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table"></cl-table>
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '状态',
|
|||
|
|
prop: 'status',
|
|||
|
|
dict: [
|
|||
|
|
{
|
|||
|
|
label: '启用',
|
|||
|
|
value: 1,
|
|||
|
|
type: 'success'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '禁用',
|
|||
|
|
value: 0,
|
|||
|
|
type: 'danger'
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 组件渲染 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>component</el-tag>
|
|||
|
|
<span>组件渲染</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/component/index.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="组件渲染" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table"></cl-table>
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
import { ElMessage } from 'element-plus';
|
|||
|
|
import UserInfo from './user-info.vue';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
type: 'selection'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140,
|
|||
|
|
|
|||
|
|
//【很重要】组件实例方式渲染
|
|||
|
|
component: {
|
|||
|
|
vm: UserInfo
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140,
|
|||
|
|
|
|||
|
|
//【很重要】组件名方式渲染
|
|||
|
|
component: {
|
|||
|
|
// 组件名,组件必须全局注册了
|
|||
|
|
name: 'el-input',
|
|||
|
|
|
|||
|
|
// 传入参数
|
|||
|
|
props: {
|
|||
|
|
onChange(val) {
|
|||
|
|
ElMessage.info(val);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## user-info 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="user-info">
|
|||
|
|
<cl-avatar :size="36" />
|
|||
|
|
|
|||
|
|
<div class="det">
|
|||
|
|
<p>{{ scope?.name }}</p>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<!-- name 必须填写且唯一 -->
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
defineOptions({
|
|||
|
|
name: 'user-info'
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const props = defineProps({
|
|||
|
|
prop: String, // 列配置的 prop
|
|||
|
|
scope: null // 列数据
|
|||
|
|
});
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
.user-info {
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
|
|||
|
|
.det {
|
|||
|
|
flex: 1;
|
|||
|
|
margin-left: 10px;
|
|||
|
|
text-align: left;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 右键菜单 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>context-menu</el-tag>
|
|||
|
|
<span>右键菜单</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/context-menu.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="右键菜单">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table"></cl-table>
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<!-- 新增、编辑 -->
|
|||
|
|
<cl-upsert ref="Upsert" />
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable, useUpsert } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
import { ElMessage } from 'element-plus';
|
|||
|
|
import { EditPen, MoreFilled } from '@element-plus/icons-vue';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
|
|||
|
|
// 右键菜单配置,为 [] 时则不显示内容
|
|||
|
|
contextMenu: [
|
|||
|
|
'refresh', // 刷新
|
|||
|
|
'check', // 选择行
|
|||
|
|
'edit', // 弹出编辑框
|
|||
|
|
'delete', // 弹出删除提示
|
|||
|
|
'info', // 弹出详情
|
|||
|
|
'order-desc', // 使列倒序
|
|||
|
|
'order-asc', // 使列升序
|
|||
|
|
{
|
|||
|
|
label: '禁用状态',
|
|||
|
|
disabled: true
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '带图标',
|
|||
|
|
prefixIcon: EditPen,
|
|||
|
|
suffixIcon: MoreFilled
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '超出隐藏,看我有很多字非常多',
|
|||
|
|
ellipsis: true
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '多层级',
|
|||
|
|
children: [
|
|||
|
|
{
|
|||
|
|
label: 'A',
|
|||
|
|
children: [
|
|||
|
|
{
|
|||
|
|
label: 'A-1',
|
|||
|
|
callback(done) {
|
|||
|
|
ElMessage.success('点击了A-1');
|
|||
|
|
done();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: 'B'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: 'C'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
// row 行数据
|
|||
|
|
// column 列属性
|
|||
|
|
// event 事件对象
|
|||
|
|
(row, column, event) => {
|
|||
|
|
// 必须返回一个对象
|
|||
|
|
return {
|
|||
|
|
label: '自定义2',
|
|||
|
|
callback(done) {
|
|||
|
|
ElMessage.info('获取中');
|
|||
|
|
|
|||
|
|
setTimeout(() => {
|
|||
|
|
ElMessage.success('Ta 是' + row.name);
|
|||
|
|
|
|||
|
|
// 关闭右键菜单,只有在用到 callback 方法时才需要
|
|||
|
|
done();
|
|||
|
|
}, 500);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
type: 'selection'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// cl-upsert 配置,详细移步到 cl-upsert 示例查看
|
|||
|
|
const Upsert = useUpsert({
|
|||
|
|
items: [
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
component: {
|
|||
|
|
name: 'el-input'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
component: {
|
|||
|
|
name: 'el-input'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
component: {
|
|||
|
|
name: 'cl-select',
|
|||
|
|
props: {
|
|||
|
|
tree: true,
|
|||
|
|
checkStrictly: true,
|
|||
|
|
options: dict.get('occupation')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 字典匹配 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>dict</el-tag>
|
|||
|
|
<span>字典匹配</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/dict.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="字典匹配" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table" />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { computed, reactive, ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
const options = reactive({
|
|||
|
|
occupation: [] as { label: string; value: any }[]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
|
|||
|
|
//【很重要】字典匹配
|
|||
|
|
// 使用字典模块的 get 方法绑定,菜单地址 /dict/list
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
|
|||
|
|
// 是否使用不同颜色区分
|
|||
|
|
dictColor: true,
|
|||
|
|
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '等级',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
|
|||
|
|
//【很重要】动态匹配列表的情况,使用 computed
|
|||
|
|
dict: computed(() => options.occupation),
|
|||
|
|
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '状态',
|
|||
|
|
prop: 'status',
|
|||
|
|
|
|||
|
|
// 自定义匹配列表
|
|||
|
|
dict: [
|
|||
|
|
{
|
|||
|
|
label: '启用',
|
|||
|
|
value: 1,
|
|||
|
|
type: 'success'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '禁用',
|
|||
|
|
value: 0,
|
|||
|
|
type: 'danger'
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
|
|||
|
|
// 模拟接口获取数据
|
|||
|
|
setTimeout(() => {
|
|||
|
|
options.occupation = [
|
|||
|
|
{
|
|||
|
|
label: 'A',
|
|||
|
|
value: 0
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: 'B',
|
|||
|
|
value: 1
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: 'C',
|
|||
|
|
value: 2
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: 'D',
|
|||
|
|
value: 3
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: 'E',
|
|||
|
|
value: 4
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: 'F',
|
|||
|
|
value: 5
|
|||
|
|
}
|
|||
|
|
];
|
|||
|
|
}, 1500);
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 数据格式化 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>formatter</el-tag>
|
|||
|
|
<span>数据格式化</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/formatter.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="数据格式化" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table" />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-09-26</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="tsx">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140,
|
|||
|
|
formatter(row) {
|
|||
|
|
return '📱' + row.phone;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '用户信息',
|
|||
|
|
minWidth: 200,
|
|||
|
|
// tsx 方式渲染
|
|||
|
|
// 【很重要】使用 tsx 语法时,script 的 lang 一定要设置为 tsx
|
|||
|
|
formatter(row) {
|
|||
|
|
// row 为当前行数据
|
|||
|
|
return (
|
|||
|
|
<el-row>
|
|||
|
|
<cl-avatar size={30} />
|
|||
|
|
<el-text style={{ marginLeft: '10px' }}>{row.name}</el-text>
|
|||
|
|
</el-row>
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 隐藏/显示 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>hidden</el-tag>
|
|||
|
|
<span>隐藏/显示</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/hidden.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="隐藏/显示" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<!--配置一个 tab -->
|
|||
|
|
<el-tabs v-model="active">
|
|||
|
|
<el-tab-pane label="员工" name="user"></el-tab-pane>
|
|||
|
|
<el-tab-pane label="企业" name="company"></el-tab-pane>
|
|||
|
|
</el-tabs>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<!-- 使用方法 showColumn 显示 -->
|
|||
|
|
<el-button @click="showColumn('account')">显示账号</el-button>
|
|||
|
|
|
|||
|
|
<!-- 使用方法 hideColumn 隐藏 -->
|
|||
|
|
<el-button @click="hideColumn('account')">隐藏账号</el-button>
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table"></cl-table>
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { computed, ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
// 测试数据,移步到 cl-crud 例子查看
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
const active = ref('user');
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
label: 'ID',
|
|||
|
|
prop: 'id',
|
|||
|
|
minWidth: 140,
|
|||
|
|
|
|||
|
|
//【很重要】配置 hidden 参数,格式为 boolean 或者 Vue.ComputedRef<boolean>
|
|||
|
|
hidden: computed(() => {
|
|||
|
|
return active.value != 'company';
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '账号',
|
|||
|
|
prop: 'account',
|
|||
|
|
minWidth: 140,
|
|||
|
|
hidden: true // 默认 false
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function showColumn(prop: string) {
|
|||
|
|
Table.value?.showColumn(prop);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function hideColumn(prop: string) {
|
|||
|
|
Table.value?.hideColumn(prop);
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 操作栏 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>op</el-tag>
|
|||
|
|
<span>操作栏</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/op.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="操作栏" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table">
|
|||
|
|
<!-- 插槽的渲染方式 #[component.name] -->
|
|||
|
|
<template #slot-btns="{ scope }">
|
|||
|
|
<el-button
|
|||
|
|
@click="
|
|||
|
|
() => {
|
|||
|
|
ElMessage.info(scope.row.name);
|
|||
|
|
}
|
|||
|
|
"
|
|||
|
|
>插槽按钮</el-button
|
|||
|
|
>
|
|||
|
|
</template>
|
|||
|
|
</cl-table>
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<!-- 新增、编辑 -->
|
|||
|
|
<cl-upsert ref="Upsert" />
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable, useUpsert } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
import { ElMessage } from 'element-plus';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
//【很重要】type 必须是 op
|
|||
|
|
type: 'op',
|
|||
|
|
|
|||
|
|
width: 410, // 宽度
|
|||
|
|
|
|||
|
|
//【很重要】操作按钮配置,edit 和 info 必须搭配 cl-upsert 实现
|
|||
|
|
// edit 编辑,预先获取 service 的 info 接口数据,并带入 cl-upsert 的表单值中
|
|||
|
|
// info 详情,cl-upsert 内的组件全部传入 disabled 参数
|
|||
|
|
// delete 删除,调用 service 的 delete 接口删除行数据
|
|||
|
|
buttons: [
|
|||
|
|
{
|
|||
|
|
label: '编辑',
|
|||
|
|
type: 'primary',
|
|||
|
|
onClick({ scope }) {
|
|||
|
|
ElMessage.info(scope.row.name);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '删除',
|
|||
|
|
type: 'danger',
|
|||
|
|
onClick({ scope }) {
|
|||
|
|
ElMessage.info(scope.row.name);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '更多',
|
|||
|
|
type: 'success',
|
|||
|
|
children: [
|
|||
|
|
{
|
|||
|
|
label: '查看',
|
|||
|
|
onClick({ scope }) {
|
|||
|
|
ElMessage.info(scope.row.name);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '禁用',
|
|||
|
|
onClick({ scope }) {
|
|||
|
|
ElMessage.info(scope.row.name);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: 'slot-btns'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// cl-upsert 配置,详细移步到 cl-upsert 示例查看
|
|||
|
|
const Upsert = useUpsert({
|
|||
|
|
items: [
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
component: {
|
|||
|
|
name: 'el-input'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
component: {
|
|||
|
|
name: 'el-input'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
component: {
|
|||
|
|
name: 'cl-select',
|
|||
|
|
props: {
|
|||
|
|
tree: true, // 树形方式选择
|
|||
|
|
checkStrictly: true, // 任意层级都能点
|
|||
|
|
options: dict.get('occupation') // 使用字典数据
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 插件的使用 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>plugin</el-tag>
|
|||
|
|
<span>插件的使用</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/plugin/base.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="插件的使用" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table" />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="tsx">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
import { merge } from 'lodash-es';
|
|||
|
|
import { defineComponent } from 'vue';
|
|||
|
|
|
|||
|
|
// 插件:列标签匹配,方便多个列表公用同一个组件
|
|||
|
|
function setColumn(): ClTable.Plugin {
|
|||
|
|
const columns = {
|
|||
|
|
UserInfo: {
|
|||
|
|
label: '用户信息',
|
|||
|
|
minWidth: 200,
|
|||
|
|
component: {
|
|||
|
|
vm: defineComponent({
|
|||
|
|
name: 'user-info',
|
|||
|
|
|
|||
|
|
props: {
|
|||
|
|
scope: null
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
setup(props) {
|
|||
|
|
return () => {
|
|||
|
|
return (
|
|||
|
|
<div>
|
|||
|
|
<p>{props.scope.name}</p>
|
|||
|
|
<p>{props.scope.phone}</p>
|
|||
|
|
</div>
|
|||
|
|
);
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} as { [key: string]: DeepPartial<ClTable.Column> };
|
|||
|
|
|
|||
|
|
return ({ exposed }) => {
|
|||
|
|
function deep(arr: ClTable.Column[]) {
|
|||
|
|
arr.forEach(e => {
|
|||
|
|
if (e.tag) {
|
|||
|
|
merge(e, columns[e.tag]);
|
|||
|
|
}
|
|||
|
|
deep(e.children || []);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
deep(exposed.columns);
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
type: 'selection'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
tag: 'UserInfo'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
|
|||
|
|
//【很重要】配置插件
|
|||
|
|
plugins: [setColumn()]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 行编辑 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>row-edit</el-tag>
|
|||
|
|
<span>行编辑</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/plugin/row-edit.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="行编辑" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<el-text class="mb-4" tag="p">点击姓名、手机号可以进行编辑</el-text>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table" />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
import { Plugins } from '/#/crud';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140,
|
|||
|
|
// 【很重要】行编辑,默认 el-input
|
|||
|
|
edit: true
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140,
|
|||
|
|
// 【很重要】行编辑,开启、关闭
|
|||
|
|
edit: {
|
|||
|
|
enable: true
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140,
|
|||
|
|
edit: {
|
|||
|
|
enable: true,
|
|||
|
|
// 【很重要】行编辑,组件配置
|
|||
|
|
component: {
|
|||
|
|
name: 'cl-select',
|
|||
|
|
props: {
|
|||
|
|
options: dict.get('occupation'),
|
|||
|
|
tree: true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc',
|
|||
|
|
// 【很重要】行编辑,组件配置
|
|||
|
|
edit: {
|
|||
|
|
enable: true,
|
|||
|
|
component: {
|
|||
|
|
name: 'el-date-picker',
|
|||
|
|
props: {
|
|||
|
|
type: 'date',
|
|||
|
|
valueFormat: 'YYYY-MM-DD'
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
type: 'op',
|
|||
|
|
buttons: ['delete']
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
|
|||
|
|
//【很重要】行编辑插件
|
|||
|
|
plugins: [Plugins.Table.rowEdit()]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 表头搜索 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>search</el-tag>
|
|||
|
|
<span>表头搜索</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/search.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="表头搜索" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table" />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="tsx">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
import { Plus } from '@element-plus/icons-vue';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140,
|
|||
|
|
|
|||
|
|
//【很重要】搜索参数配置
|
|||
|
|
search: {
|
|||
|
|
isInput: false, // 默认false,是否输入框模式
|
|||
|
|
value: '', // 默认值
|
|||
|
|
refreshOnChange: true, // 默认false,搜索时刷新数据,service 的 page 接口请求参数为 { page: 1, [绑定的prop]: 输入值 }
|
|||
|
|
// 自定义渲染组件
|
|||
|
|
component: {
|
|||
|
|
name: 'el-input',
|
|||
|
|
props: {
|
|||
|
|
placeholder: '搜索姓名'
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140,
|
|||
|
|
|
|||
|
|
//【很重要】搜索参数配置
|
|||
|
|
search: {
|
|||
|
|
// 是否显示搜索图标
|
|||
|
|
icon: () => <Plus />,
|
|||
|
|
|
|||
|
|
// 自定义渲染组件
|
|||
|
|
component: {
|
|||
|
|
name: 'el-input',
|
|||
|
|
props: {
|
|||
|
|
placeholder: '搜索手机号',
|
|||
|
|
|
|||
|
|
// 自定义 change 事件
|
|||
|
|
onChange(val) {
|
|||
|
|
Crud.value?.refresh({
|
|||
|
|
page: 1,
|
|||
|
|
phone: val
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140,
|
|||
|
|
|
|||
|
|
//【很重要】搜索参数配置
|
|||
|
|
search: {
|
|||
|
|
// 是否显示搜索图标
|
|||
|
|
icon: () => <cl-svg name="icon-app" size={13} />,
|
|||
|
|
// 自定义渲染组件
|
|||
|
|
component: {
|
|||
|
|
name: 'cl-select',
|
|||
|
|
props: {
|
|||
|
|
placeholder: '搜索工作',
|
|||
|
|
options: dict.get('occupation')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 多选框数据 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>selection</el-tag>
|
|||
|
|
<span>多选框数据</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/selection.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="多选框数据" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<el-button @click="selectRow">选中2行</el-button>
|
|||
|
|
<el-button :disabled="Table?.selection.length == 0" @click="clear">
|
|||
|
|
取消选择
|
|||
|
|
</el-button>
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table" />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<el-text>已选 {{ Table?.selection.length }} 人</el-text>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh', 'check'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
type: 'selection'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
function selectRow() {
|
|||
|
|
const [a, b] = Table.value?.data || [];
|
|||
|
|
|
|||
|
|
// 选中2个
|
|||
|
|
Table.value?.toggleRowSelection(a);
|
|||
|
|
Table.value?.toggleRowSelection(b);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function clear() {
|
|||
|
|
Table.value?.clearSelection();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 插槽的使用 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>slot</el-tag>
|
|||
|
|
<span>插槽的使用</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/slot.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="插槽的使用" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table">
|
|||
|
|
<!--【很重要】必须与 prop 名保持一致,格式:column-[prop] -->
|
|||
|
|
<template #column-name="{ scope }">
|
|||
|
|
<cl-row type="flex" align="middle">
|
|||
|
|
<cl-avatar :size="36" :style="{ marginRight: '10px' }" />
|
|||
|
|
<el-text>{{ scope.row.name }}</el-text>
|
|||
|
|
</cl-row>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<template #column-phone="{ scope }"> 📱{{ scope.row.phone }} </template>
|
|||
|
|
</cl-table>
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
headerAlign: 'left',
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 合并行或列 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>span-method</el-tag>
|
|||
|
|
<span>合并行或列</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/span-method.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="合并行或列" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table" :span-method="onSpanMethod" />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '存款',
|
|||
|
|
prop: 'wages',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
interface SpanMethodProps {
|
|||
|
|
row: any;
|
|||
|
|
column: any;
|
|||
|
|
rowIndex: number;
|
|||
|
|
columnIndex: number;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSpanMethod({ row, column, rowIndex, columnIndex }: SpanMethodProps) {
|
|||
|
|
// 根据实际业务需求调整返回值 { rowspan, colspan }
|
|||
|
|
if (columnIndex === 0) {
|
|||
|
|
if (rowIndex % 2 === 0) {
|
|||
|
|
return {
|
|||
|
|
rowspan: 2,
|
|||
|
|
colspan: 1
|
|||
|
|
};
|
|||
|
|
} else {
|
|||
|
|
return {
|
|||
|
|
rowspan: 0,
|
|||
|
|
colspan: 0
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 表尾合计行 示例
|
|||
|
|
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<div class="scope">
|
|||
|
|
<div class="h">
|
|||
|
|
<el-tag size="small" effect="dark" disable-transitions>summary</el-tag>
|
|||
|
|
<span>表尾合计行</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="c">
|
|||
|
|
<el-button @click="open">预览</el-button>
|
|||
|
|
<demo-code :files="['table/summary.vue']" />
|
|||
|
|
|
|||
|
|
<!-- 自定义表格组件 -->
|
|||
|
|
<cl-dialog v-model="visible" title="表尾合计行" width="80%">
|
|||
|
|
<cl-crud ref="Crud">
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-table ref="Table" show-summary :summary-method="getSummaries" />
|
|||
|
|
</cl-row>
|
|||
|
|
|
|||
|
|
<cl-row>
|
|||
|
|
<cl-flex1 />
|
|||
|
|
<cl-pagination />
|
|||
|
|
</cl-row>
|
|||
|
|
</cl-crud>
|
|||
|
|
</cl-dialog>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="f">
|
|||
|
|
<span class="date">2024-01-01</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup lang="ts">
|
|||
|
|
import { useCrud, useTable } from '@cool-vue/crud';
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { useDict } from '/$/dict';
|
|||
|
|
|
|||
|
|
const { dict } = useDict();
|
|||
|
|
|
|||
|
|
// cl-crud 配置
|
|||
|
|
const Crud = useCrud(
|
|||
|
|
{
|
|||
|
|
service: 'test'
|
|||
|
|
},
|
|||
|
|
app => {
|
|||
|
|
app.refresh();
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// cl-table 配置
|
|||
|
|
const Table = useTable({
|
|||
|
|
autoHeight: false,
|
|||
|
|
contextMenu: ['refresh'],
|
|||
|
|
|
|||
|
|
columns: [
|
|||
|
|
{
|
|||
|
|
label: '姓名',
|
|||
|
|
prop: 'name',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '存款',
|
|||
|
|
prop: 'wages',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '手机号',
|
|||
|
|
prop: 'phone',
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '工作',
|
|||
|
|
prop: 'occupation',
|
|||
|
|
dict: dict.get('occupation'),
|
|||
|
|
minWidth: 140
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
label: '创建时间',
|
|||
|
|
prop: 'createTime',
|
|||
|
|
minWidth: 170,
|
|||
|
|
sortable: 'desc'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
function getSummaries() {
|
|||
|
|
return ['合计', '$' + Table.value?.data.reduce((a, b) => a + b.wages, 0)];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const visible = ref(false);
|
|||
|
|
|
|||
|
|
function open() {
|
|||
|
|
visible.value = true;
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
```
|