From c92d6a2b1db0cdfbafbf03c58f19ac614d3d62d9 Mon Sep 17 00:00:00 2001 From: dap <15891557205@163.com> Date: Thu, 7 Aug 2025 20:31:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20vxe/antd=E5=8F=AF=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E8=A1=A8=E6=A0=BC=E9=80=82=E9=85=8D=E5=99=A8=20&=20=E5=8F=AF?= =?UTF-8?q?=E7=BC=96=E8=BE=91demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/演示使用自行删除/vxe/edit-table.vue | 121 +++++++++++++----- packages/effects/plugins/package.json | 1 + .../effects/plugins/src/vxe-table/init.ts | 12 ++ 3 files changed, 104 insertions(+), 30 deletions(-) diff --git a/apps/web-antd/src/views/演示使用自行删除/vxe/edit-table.vue b/apps/web-antd/src/views/演示使用自行删除/vxe/edit-table.vue index 2c285f51..d1fdcec3 100644 --- a/apps/web-antd/src/views/演示使用自行删除/vxe/edit-table.vue +++ b/apps/web-antd/src/views/演示使用自行删除/vxe/edit-table.vue @@ -4,7 +4,6 @@ import type { VxeGridProps } from '#/adapter/vxe-table'; import { nextTick, onMounted } from 'vue'; import { JsonPreview } from '@vben/common-ui'; -import { getPopupContainer } from '@vben/utils'; import { Button, @@ -18,6 +17,16 @@ import { import { useVbenVxeGrid } from '#/adapter/vxe-table'; +/** + * 与antdv集成 可以参考这里使用自定义插槽 + * https://vxetable.cn/other4/#/table/other/antd + */ + +const options = ['前端佬', '后端佬', '组长'].map((item) => ({ + label: item, + value: item, +})); + const gridOptions: VxeGridProps = { editConfig: { // 触发编辑的方式 @@ -32,12 +41,19 @@ const gridOptions: VxeGridProps = { }, checkboxConfig: {}, editRules: { - name: [{ required: true, message: '请输入姓名', trigger: 'blur' }], + name: [{ required: true, message: '请输入姓名' }], age: [ - { required: true, message: '请输入年龄', trigger: 'blur' }, - { min: 0, max: 200, message: '年龄必须为1-200' }, + { required: true, message: '请输入年龄' }, + { type: 'number', min: 0, max: 200, message: '年龄必须为1-200' }, + ], + job: [{ required: true, message: '请选择工作' }], + phone: [ + { + required: true, + message: '请输入正确的手机号', + pattern: /^1[3-9]\d{9}$/, + }, ], - job: [{ required: true, message: '请选择工作', trigger: 'blur' }], }, columns: [ { @@ -61,8 +77,16 @@ const gridOptions: VxeGridProps = { } return {row.name}; }, - edit: ({ row }) => { - return ; + edit: (props) => { + const { row, $grid } = props; + + return ( + $grid?.updateStatus(props)} + placeholder={'请输入'} + v-model:value={row.name} + /> + ); }, }, }, @@ -78,10 +102,12 @@ const gridOptions: VxeGridProps = { } return {row.age}; }, - edit: ({ row }) => { + edit: (props) => { + const { row, $grid } = props; return ( $grid?.updateStatus(props)} placeholder={'请输入'} v-model:value={row.age} /> @@ -90,8 +116,8 @@ const gridOptions: VxeGridProps = { }, }, { - field: '工作', - title: 'job', + field: 'job', + title: '工作', align: 'left', editRender: {}, slots: { @@ -101,15 +127,14 @@ const gridOptions: VxeGridProps = { } return {row.job}; }, - edit: ({ row }) => { - const options = ['前端佬', '后端佬', '组长'].map((item) => ({ - label: item, - value: item, - })); + edit: (props) => { + const { row, $grid } = props; + return ( $grid?.updateStatus(props)} + placeholder={'请输入'} + v-model:value={row.phone} + /> + ); + }, + }, + }, { field: 'action', title: '操作', @@ -136,18 +186,22 @@ const gridOptions: VxeGridProps = { }, }, ], - height: 'auto', + // height: 500, keepSource: true, pagerConfig: { enabled: false, }, proxyConfig: { - enabled: false, + enabled: true, }, toolbarConfig: { enabled: false, }, showOverflow: false, + cellConfig: { + // 保持高度 防止进入编辑模式会有一个撑开的效果 + height: 50, + }, }; const [BasicTable, tableApi] = useVbenVxeGrid({ @@ -160,16 +214,19 @@ onMounted(async () => { name: '张三', age: 18, job: '前端佬', + phone: '', }, { name: '李四', age: 19, job: '后端佬', + phone: '', }, { name: '王五', age: 20, job: '组长', + phone: '', }, ]; await nextTick(); @@ -187,6 +244,7 @@ async function handleRemove() { async function handleValidate() { const result = await tableApi.grid.validate(true); + console.log(result); if (result) { message.error('校验失败'); } else { @@ -210,20 +268,23 @@ function getData() { diff --git a/packages/effects/plugins/package.json b/packages/effects/plugins/package.json index edbb7284..dcd2df69 100644 --- a/packages/effects/plugins/package.json +++ b/packages/effects/plugins/package.json @@ -39,6 +39,7 @@ "@vben/utils": "workspace:*", "@vueuse/core": "catalog:", "@vueuse/motion": "catalog:", + "@vxe-ui/plugin-render-antd": "^4.0.18", "echarts": "catalog:", "vue": "catalog:", "vxe-pc-ui": "catalog:", diff --git a/packages/effects/plugins/src/vxe-table/init.ts b/packages/effects/plugins/src/vxe-table/init.ts index 00e9d8ab..914ae651 100644 --- a/packages/effects/plugins/src/vxe-table/init.ts +++ b/packages/effects/plugins/src/vxe-table/init.ts @@ -6,6 +6,15 @@ import { usePreferences } from '@vben/preferences'; import { useVbenForm } from '@vben-core/form-ui'; +/** + * 该插件提供了在表格中渲染第三方组件,用于兼容 ant-design-vue 组件库 + * + * 解决组件问题(如select浮层与失焦冲突) + * + * @see https://vxeui.com/other4/#/plugin-render-antd/start/full/npmInstall + * @see https://vxetable.cn/other4/#/table/other/antd + */ +import VxeUIPluginRenderAntd from '@vxe-ui/plugin-render-antd'; import { VxeButton, VxeCheckbox, @@ -47,6 +56,8 @@ import { import { extendsDefaultFormatter } from './extends'; +import '@vxe-ui/plugin-render-antd/dist/style.css'; + // 是否加载过 let isInit = false; @@ -96,6 +107,7 @@ export function initVxeTable() { // VxeUI.component(VxeTextarea); VxeUI.component(VxeTooltip); VxeUI.component(VxeUpload); + VxeUI.use(VxeUIPluginRenderAntd); isInit = true; }