其一:创建组件并在当前控制器中引入组件
<!-- 示例核心代码(1/3) -->
<!-- 详情组件在此处使用,但显示与否的判断是写在组件内的 -->
<Detail />
<!-- 引入组件 -->
import Detail from './detail.vue'
?其二:注册按钮
const optButtons: OptButton[] = defaultOptButtons(['edit', 'delete'])
放在此处之后
/**
* 示例核心代码(2/3)
* 表格操作按钮组 optButtons 只是个普通的数组,此处向其 push 一个 OptButton
*/
optButtons.push({
render: 'tipButton',
// name 是任意的
name: 'detail',
// title 是语言翻译 key
title: 'treetable.detailBtnTitle',
text: '',
type: 'warning',
icon: 'fa fa-search-plus icon',
click(row, field) {
console.info('%c-------详情按钮被点击了--------', 'color:blue')
console.log('接受到行数据和列数据', row, field)
console.log('%c赋值:baTable.table.extend!.showInfo = true', 'color:red')
// 在 extend 上自定义一个变量标记详情弹窗显示状态,详情组件内以此判断显示即可!
baTable.table.extend!.showInfo = true
// 您也可以使用 baTable.form.operate,默认情况它有三个值`Add、Edit、空字符串`,前两个值将显示添加和编辑弹窗
// 您也可以再来个 loading 态,然后请求详情数据等
baTable.table.extend!.infoLoading = true
setTimeout(() => {
baTable.table.extend!.infoData = row
baTable.table.extend!.infoLoading = false
}, 1000)
},
})
?其三:详情组件代码
<!-- 示例核心代码(3/3) -->
<script setup lang="ts">
import { inject } from 'vue'
import { timeFormat } from '/@/utils/common'
import type baTableClass from '/@/utils/baTable'
const baTable = inject('baTable') as baTableClass
</script>
<template>
<el-dialog class="ba-operate-dialog" v-model="baTable.table.extend!.showInfo" width="50%">
<template #header>
<div class="title" v-drag="['.ba-operate-dialog', '.el-dialog__header']" v-zoom="'.ba-operate-dialog'">详情</div>
</template>
<div v-loading="baTable.table.extend!.infoLoading" class="info-box ba-markdown">
<div v-if="baTable.table.extend!.infoData">
<!-- <div><code>baTable.table.extend!.showInfo == true</code>时,本弹窗就显示了,它是在按钮被点击时赋值的</div>-->
<div class="mt-40">id:{{ baTable.table.extend!.infoData.id }}</div>
<div>父级ID:{{ baTable.table.extend!.infoData.pid }}</div>
<div>上下级:{{ baTable.table.extend!.infoData.name}}</div>
<div>创建时间:{{ timeFormat(baTable.table.extend!.infoData.create_time) }}</div>
</div>
</div>
</el-dialog>
</template>
<style scoped lang="scss">
.info-box {
margin-top: 60px;
div {
width: 100%;
text-align: center;
}
.mt-40 {
margin-top: 40px;
}
}
</style>