明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 82|回复: 0

[CAD梦想画图] web cad sdk中调用内部弹框的方法

[复制链接]
发表于 前天 17:17 | 显示全部楼层 |阅读模式
本帖最后由 MxDraw 于 2025-3-8 17:20 编辑

前言
MxCAD APP 二次开发的过程中,为了沿用项目内部的样式保持项目的统一性,我们提供了调用项目内部弹框的接口。用户可根据自己的具体需求按照下面文档介绍的步骤来操作调用项目内部的弹框。

基础调用
1.首先创建一个test_dialog文件夹用于存储弹框相关的文件,如下图:

2.在文件夹下创建 dialog.ts 文件用于注册弹框,代码如下:
  1. // dialog.isShow.value 默认是false
  2. // 如果没有传入命令,则只能通过修改dialog.isShow.value或者调用showDialog来显示弹框
  3. // 如果传入了命令,则调用命令会自动显示或关闭弹框
  4. // 如果传入了第三个参数,则会自定义这个命令的实现
  5. export const dialog = MxPluginContext.useDialogIsShow(
  6.     false,
  7.     "Mx_test_dialog",
  8.     () => {
  9.    dialog.showDialog(!dialog.isShow.value);
  10.     }
  11. );
复制代码
3.在文件夹下创建 dialog.vue 文件用于构建弹框ui界面,代码如下:
  1. <script setup lang="ts">
  2. import { ref } from "vue";
  3. import { VBtn } from "vuetify/components";
  4. import { dialog } from "./dialog";
  5. const { MxDialog } = MxPluginContext.components;
  6. const footerBtnList = [
  7.   {
  8.     name: "取消",
  9.     fun: () => {
  10.       // 弹框点击了取消按钮,传入数据
  11.       dialog.cancel({ data: 1 });
  12.       // 需要先发送数据再关闭弹框
  13.       dialog.showDialog(false);
  14.     },
  15.   },
  16.   {
  17.     name: "确定",
  18.     fun: () => {
  19.       // 弹框点击了确认按钮,传入数据
  20.       dialog.confirm({ data: 2 });
  21.       dialog.showDialog(false);
  22.     },
  23.     primary: true,
  24.   },
  25. ];
  26. const { isShow, onReveal } = dialog;
  27. const title = ref("测试标题");
  28. onReveal((data) => {
  29.   // 接收到显示的消息
  30.   if (data.title) title.value = data.title;
  31. });
  32. </script>
  33. <template>
  34.   <MxDialog
  35.     :title="title"
  36.     v-model="isShow"
  37.     max-width="300"
  38.     :footerBtnList="footerBtnList"
  39.   >
  40.     <h4>这是一个测试弹框!</h4>
  41.     <VBtn>测试按钮</VBtn>
  42.   </MxDialog>
  43. </template>
复制代码
4.在文件夹下创建 index.ts 文件在界面创建弹框,代码如下:
  1. import { createVNode, render } from "vue";
  2. import dialog from "./dialog.vue";
  3. const el = document.createElement("div");
  4. document.body.appendChild(el);
  5. const vnode = createVNode(dialog);
  6. const app = MxPluginContext.getApp();
  7. vnode.appContext = app._context;
  8. render(vnode, el);
复制代码
5.最终在MxCAD项目中的src/index.ts文件中引入test_dialog/index.ts文件,代码如下:
  1. import './test_dialog/index'
复制代码
如下图:

6.启动MxCAD项目,执行上面注册的 'Mx_test_dialog' 命令就能显示弹框了运行效果如下:

高级调用
按照上述步骤操作,用户可直接通过命令行调用来控制项目弹框的显隐,但由于在实际开发过程中会遇到不能直接通过调用命令来控制弹框显隐藏,而是通过直接调用代码。因此,我们提供了useDialogIsShow属性,用户可通过直接控制useDialogIsShow来控制弹框。操作步骤如下:
1.dialog.ts文件下调用 useDialogIsShow 钩子函数通过类型参数化的方式定义对话框显示、确认和取消时需要处理的数据类型,代码如下:
  1.    // 弹框要显示的数据
  2.    type RevealData = { title: string };
  3.    // 弹框确认要传入的数据
  4.    type ConfirmData = { data: number };
  5.    // 弹框取消要传入的数据
  6.    type CancelData = { data: number };
  7.    export const dialog = MxPluginContext.useDialogIsShow<
  8.      RevealData,
  9.      ConfirmData,
  10.      CancelData
  11.    >();
复制代码
2.dialog.vue文件下正常编写弹框的vue组件,代码如下:
  1.    <script setup lang="ts">
  2.    import { ref } from "vue";
  3.    import { VBtn } from "vuetify/components";
  4.    import { dialog } from "./dialog";
  5.    const { MxDialog } = MxPluginContext.components;
  6.    const footerBtnList = [
  7.      {
  8.        name: "取消",
  9.        fun: () => {
  10.          // 弹框点击了取消按钮,传入数据
  11.          dialog.cancel({ data: 1 });
  12.          // 需要先发送数据再关闭弹框
  13.          dialog.showDialog(false);
  14.        },
  15.      },
  16.      {
  17.        name: "确定",
  18.        fun: () => {
  19.          // 弹框点击了确认按钮,传入数据
  20.          dialog.confirm({ data: 2 });
  21.          dialog.showDialog(false);
  22.        },
  23.        primary: true,
  24.      },
  25.    ];
  26.    const { isShow, onReveal } = dialog;
  27.    const title = ref("测试标题");
  28.    onReveal((data) => {
  29.      // 接收到显示的消息
  30.      if (data.title) title.value = data.title;
  31.    });
  32.    </script>
  33.    <template>
  34.      <MxDialog
  35.        :title="title"
  36.        v-model="isShow"
  37.        max-width="300"
  38.        :footerBtnList="footerBtnList"
  39.      >
  40.      <h4>这是一个测试弹框!</h4>
  41.        <VBtn>这是一个测试按钮!</VBtn>
  42.      </MxDialog>
  43.    </template>
复制代码
3.index.ts文件下注册渲染弹框,代码如下:
  1.   import DialogComponent from "./dialog.vue";
  2.    import { createVNode, render } from "vue";
  3.    const el = document.createElement("div");
  4.    document.body.appendChild(el);
  5.    const vnode = createVNode(DialogComponent);
  6.    const app = MxPluginContext.getApp();
  7.    vnode.appContext = app._context;
  8.    render(vnode, el);
复制代码
4.同上述基础用法一样,在MxCAD项目中的src/index.ts文件中引入test_dialog/index.ts文件

5.最后在自己的方法中调用dialog就可以直接控制弹框了,代码如下:
  1.    function test() {
  2.        /**
  3.         * 这里是弹出弹框前需要执行的代码
  4.         */
  5.        dialog
  6.            .showDialog(true, { title: "测试标题显示" })
  7.            .then(({ data, isCanceled }) => {
  8.                // 需要等待cancel或者confirm调用才会触发
  9.                if (isCanceled) {
  10.                    // 调用dialog.cancel({ data: 1 })取消
  11.                    console.log("弹框取消的数据", data.data === 1);
  12.                } else {
  13.                    // 调用dialog.confirm({ data: 2 })取消
  14.                    console.log("弹框确认的数据", data.data === 2);
  15.                }
  16.            });
  17.    }
复制代码

6.运行效果如下:

扩展
1.直接调用 dialog.reveal() 方法调用弹框,代码如下:
  1.    import { dialog } from "./dialog";
  2.       dialog.reveal({ title: "reveal" }).then(({ data, isCanceled }) => {
  3.           console.log('确认参数', data);
  4.           console.log('是否取消', isCanceled)
  5.       });
复制代码
运行效果如下:

2.通过监听确认或者取消事件得到数据,代码如下:
  1. // 监听确认事件
  2.   dialog.onConfirm((data) => {
  3.   console.log('确定', data)
  4.   });
  5.   // 监听取消事件
  6.   dialog.onCancel((data) => {
  7.   console.log('取消', data)
  8.   });
复制代码

样式调整
用户在调用 MxCAD APP 内部弹框的时候,在弹框内引入 `vuetify/components` 内部组件的时候,可能会出现样式错乱或层叠的情况,这是由于 `vuetify` 自带的组件样式,与 MxCAD APP 内部封装好的样式发生了冲突。我们只需要在vite的配置文件中,设置调用MxCAD APP内部样式即可,具体操作如下所示:
1引入`vuetify/components` 内部组件,MxCAD APP发生样式错乱


2配置`vite.config.ts`

3重启项目后恢复正常

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-3-10 15:29 , Processed in 0.186723 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表