151 lines
4.9 KiB
TypeScript
151 lines
4.9 KiB
TypeScript
import { CrudMethods, CrudSchema } from '.'
|
||
import Crud from './crud.vue'
|
||
/**
|
||
*
|
||
* 防止未来重构影响
|
||
* 通过统一的 useCrud 钩子封装,即使内部实现发生重构,外部调用方也不会受到影响
|
||
* 提供稳定的API接口,隔离底层实现细节的变化
|
||
* @param crudSchema
|
||
* @returns
|
||
*/
|
||
export function useCrud(crudSchema: CrudSchema) {
|
||
const crudRef = ref<any>(null)
|
||
const register = (crudInstance: any) => {
|
||
crudRef.value = crudInstance
|
||
}
|
||
const crudMethods: CrudMethods = {
|
||
// 获取表格实例
|
||
getCrudRef() {
|
||
return crudRef.value
|
||
},
|
||
// 设置组件状态(props)
|
||
setState(state: any) {
|
||
return crudRef.value?.setState(state)
|
||
},
|
||
// 获取组件状态
|
||
getState() {
|
||
return crudRef.value?.getState()
|
||
},
|
||
getRowSelection() {
|
||
return crudRef.value?.getRowSelection()
|
||
},
|
||
// 刷新表格数据,保留当前表单搜索条件
|
||
reload(params?: Record<string, any>) {
|
||
return crudRef.value?.reload(params)
|
||
},
|
||
// 获取只读状态信息
|
||
getReadonlyState() {
|
||
return crudRef.value?.getReadonlyState() || { selection: [] }
|
||
},
|
||
// 通过接口删除行
|
||
removeByApi(row) {
|
||
return crudRef.value?.removeByApi(row)
|
||
},
|
||
// 获取art表格实例,可通过该方法来操作原生的art-table组件
|
||
// 个人建议,可以在该文件上包装一层再暴露给外部使用,如上述的reload方法一样
|
||
getArtTableInstance() {
|
||
return crudRef.value?.getArtTableInstance()
|
||
},
|
||
exportData() {
|
||
return crudRef.value?.exportData()
|
||
},
|
||
getVxeTableInstance() {
|
||
return crudRef.value?.getVxeTableInstance()
|
||
},
|
||
// 刷新策略
|
||
/** 全量刷新:清空所有缓存,重新获取数据(适用于手动刷新按钮) */
|
||
refreshData() {
|
||
if (crudSchema.useVxeTable) {
|
||
return this.getVxeTableInstance()?.commitProxy('reload', {})
|
||
}
|
||
return this.getArtTableInstance()?.refreshData()
|
||
},
|
||
/** 轻量刷新:仅清空当前搜索条件的缓存,保持分页状态(适用于定时刷新) */
|
||
refreshSoft() {
|
||
if (crudSchema.useVxeTable) {
|
||
return this.getVxeTableInstance()?.commitProxy('query', {})
|
||
}
|
||
return this.getArtTableInstance()?.refreshSoft()
|
||
},
|
||
/** 新增后刷新:回到第一页并清空分页缓存(适用于新增数据后) */
|
||
refreshCreate() {
|
||
if (crudSchema.useVxeTable) {
|
||
return this.getVxeTableInstance()?.commitProxy('reload', {})
|
||
}
|
||
return this.getArtTableInstance()?.refreshCreate()
|
||
},
|
||
/** 更新后刷新:保持当前页,仅清空当前搜索缓存(适用于更新数据后) */
|
||
refreshUpdate() {
|
||
if (crudSchema.useVxeTable) {
|
||
return this.getVxeTableInstance()?.commitProxy('query', {})
|
||
}
|
||
return this.getArtTableInstance()?.refreshUpdate()
|
||
},
|
||
/** 删除后刷新:智能处理页码,避免空页面(适用于删除数据后) */
|
||
refreshRemove() {
|
||
if (crudSchema.useVxeTable) {
|
||
const gridApi = this.getVxeTableInstance()
|
||
const records = gridApi.getCheckboxRecords()
|
||
if (
|
||
gridApi.getTableData()?.fullData?.length === 1 ||
|
||
gridApi.getTableData()?.fullData?.length === records.length
|
||
) {
|
||
const { pager }: any = gridApi.getProxyInfo()
|
||
if (pager.currentPage > 1) {
|
||
pager.currentPage = pager.currentPage - 1
|
||
return this.getVxeTableInstance()?.commitProxy('query', {})
|
||
} else {
|
||
if (pager.total >= gridApi.getTableData()?.fullData?.length) {
|
||
return this.getVxeTableInstance()?.commitProxy('query', {})
|
||
} else {
|
||
return this.getVxeTableInstance()?.commitProxy('reload', {})
|
||
}
|
||
}
|
||
} else {
|
||
return this.getVxeTableInstance()?.commitProxy('query', {})
|
||
}
|
||
}
|
||
return this.getArtTableInstance()?.refreshRemove()
|
||
},
|
||
// 打开内置新增表单
|
||
openAddDialog() {
|
||
return this.getCrudRef()?.openAddDialog()
|
||
},
|
||
// 打开内置修改表单
|
||
openEditDialog() {
|
||
return this.getCrudRef()?.openEditDialog()
|
||
},
|
||
// 打开内置详情表单
|
||
openViewDialog() {
|
||
return this.getCrudRef()?.openViewDialog()
|
||
},
|
||
// 执行内置的删除方法
|
||
executeRemove() {
|
||
return this.getCrudRef()?.executeRemove()
|
||
},
|
||
// 执行内置的批量删除方法
|
||
executeBatchRemove() {
|
||
return this.getCrudRef()?.executeBatchRemove()
|
||
}
|
||
}
|
||
|
||
// 创建表单组件的配置
|
||
const CrudComponent = defineComponent({
|
||
setup(_, { attrs, slots }) {
|
||
return () =>
|
||
h(
|
||
Crud,
|
||
{
|
||
...attrs,
|
||
crudSchema: crudSchema,
|
||
onRegister: register,
|
||
crudMethods: crudMethods
|
||
},
|
||
slots
|
||
)
|
||
}
|
||
})
|
||
|
||
return [CrudComponent, crudMethods] as const
|
||
}
|