matrix_components 2.0.300

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +438 -0
  2. package/dist/ComponentDemo/DialogDemo.vue +208 -0
  3. package/dist/ComponentDemo/ExcelDemo.vue +263 -0
  4. package/dist/ComponentDemo/OfficeDemo.vue +189 -0
  5. package/dist/ComponentDemo/PdfDemo.vue +207 -0
  6. package/dist/ComponentDemo/Test.vue +6 -0
  7. package/dist/ComponentDemo/VideoDemo.vue +273 -0
  8. package/dist/ComponentDemo/WordDemo.vue +191 -0
  9. package/dist/cdn/ezuikit/ezuikit.js +27 -0
  10. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl1/HasSIMD/Decoder.js +168 -0
  11. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl1/NoSIMD/Decoder.js +168 -0
  12. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/HasSIMD/Decoder.js +21 -0
  13. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/HasSIMD/Decoder.wasm +0 -0
  14. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/HasSIMD/Decoder.worker.js +1 -0
  15. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/NoSIMD/Decoder.js +21 -0
  16. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/NoSIMD/Decoder.wasm +0 -0
  17. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/hasWorker/NoSIMD/Decoder.worker.js +1 -0
  18. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/noWorker/Decoder.js +21 -0
  19. package/dist/cdn/ezuikit/ezuikit_static/PlayCtrlWasm/playCtrl3/noWorker/Decoder.wasm +0 -0
  20. package/dist/cdn/ezuikit/ezuikit_static/css/component.css +1257 -0
  21. package/dist/cdn/ezuikit/ezuikit_static/css/inspectTheme.css +354 -0
  22. package/dist/cdn/ezuikit/ezuikit_static/css/theme copy.css +126 -0
  23. package/dist/cdn/ezuikit/ezuikit_static/css/theme.css +140 -0
  24. package/dist/cdn/ezuikit/ezuikit_static/imgs/bg.png +0 -0
  25. package/dist/cdn/ezuikit/ezuikit_static/imgs/bg.svg +33 -0
  26. package/dist/cdn/ezuikit/ezuikit_static/imgs/empty.png +0 -0
  27. package/dist/cdn/ezuikit/ezuikit_static/imgs/end.png +0 -0
  28. package/dist/cdn/ezuikit/ezuikit_static/imgs/fallback.svg +52 -0
  29. package/dist/cdn/ezuikit/ezuikit_static/imgs/start.png +0 -0
  30. package/dist/cdn/ezuikit/ezuikit_static/rec/datepicker.js +1522 -0
  31. package/dist/cdn/ezuikit/ezuikit_static/rec/datepicker.min.css +36 -0
  32. package/dist/cdn/ezuikit/ezuikit_static/rec/datepicker.zh-CN.js +19 -0
  33. package/dist/cdn/ezuikit/ezuikit_static/rec/jquery.min.js +2 -0
  34. package/dist/cdn/ezuikit/ezuikit_static/speed/speed.css +145 -0
  35. package/dist/cdn/ezuikit/ezuikit_static/talk/adapeter.js +5497 -0
  36. package/dist/cdn/ezuikit/ezuikit_static/talk/janus.js +3507 -0
  37. package/dist/cdn/ezuikit/ezuikit_static/talk/tts-v4.js +343 -0
  38. package/dist/cdn/ezuikit.js +27 -0
  39. package/dist/cdn/h5player/h5player.min.js +313 -0
  40. package/dist/cdn/h5player/playctrl1/DecodeWorker.js +642 -0
  41. package/dist/cdn/h5player/playctrl1/Decoder.js +1 -0
  42. package/dist/cdn/h5player/playctrl1simd/DecodeWorker.js +642 -0
  43. package/dist/cdn/h5player/playctrl1simd/Decoder.js +1 -0
  44. package/dist/cdn/h5player/playctrl2/Decoder.js +21 -0
  45. package/dist/cdn/h5player/playctrl2/Decoder.wasm +0 -0
  46. package/dist/cdn/h5player/playctrl2/Decoder.worker.js +1 -0
  47. package/dist/cdn/h5player/playctrl3/Decoder.js +21 -0
  48. package/dist/cdn/h5player/playctrl3/Decoder.wasm +0 -0
  49. package/dist/cdn/h5player/playctrl3/Decoder.worker.js +1 -0
  50. package/dist/cdn/h5player/talk/AudioInterCom.js +21 -0
  51. package/dist/cdn/h5player/talk/AudioInterCom.wasm +0 -0
  52. package/dist/cdn/h5player/talkW/AudioInterCom.js +21 -0
  53. package/dist/cdn/h5player/talkW/AudioInterCom.wasm +0 -0
  54. package/dist/cdn/h5player/talkW/AudioInterCom.worker.js +1 -0
  55. package/dist/cdn/h5player/transform/libSystemTransform.js +6525 -0
  56. package/dist/cdn/h5player/transform/libSystemTransform.wasm +0 -0
  57. package/dist/cdn/h5player/transform/systemTransform-worker.js +120 -0
  58. package/dist/cdn/md5.js +254 -0
  59. package/dist/favicon.ico +0 -0
  60. package/dist/js/EasyPlayer-decode.js +1 -0
  61. package/dist/js/EasyPlayer-lib.js +1 -0
  62. package/dist/js/EasyPlayer-pro.js +1 -0
  63. package/dist/js/EasyPlayer-pro.wasm +0 -0
  64. package/dist/js/EasyPlayer-snap.wasm +0 -0
  65. package/dist/matrix_components.css +1 -0
  66. package/dist/matrix_components.js +60018 -0
  67. package/dist/matrix_components.umd.cjs +1 -0
  68. package/package.json +81 -0
package/README.md ADDED
@@ -0,0 +1,438 @@
1
+ # **组件库2.0**
2
+ ```
3
+ version:2.0.300
4
+ 2025年10月9日14:58:45
5
+ 更新日志:
6
+ 1.支持输入框自定义正则: v-length.regex="{ maxLength: 100, pattern: /^[a-zA-Z0-9]*$/ }"
7
+ ```
8
+
9
+ ```
10
+ version:2.0.299
11
+ 2025年9月29日18:59:38
12
+ 更新日志:
13
+ 1.NsDialog弹出框支持返回dom动态组件Ref
14
+ 2.绑定window.__dialogInstances, 保存所有弹出框实例
15
+ ```
16
+
17
+ ```
18
+ version:2.0.298
19
+ 2025年9月24日17:03:10
20
+ 更新日志:
21
+ 1.NsOffice样式修改
22
+ ```
23
+
24
+ ```
25
+ version:2.0.297
26
+ 2025年9月19日16:54:21
27
+ 更新日志:
28
+ 1.添加NsDialog支持允许穿透, modal:false即可穿透
29
+ ```
30
+
31
+ ```
32
+ version:2.0.296
33
+ 2025年9月18日13:21:31
34
+ 更新日志:
35
+ 1.优化NsExcel非弹窗模式切换file时重新加载
36
+ 2.增加NsOffice组件
37
+ ```
38
+
39
+ ```
40
+ version:2.0.295
41
+ 2025年9月18日09:56:34
42
+ 更新日志:
43
+ 1.NsVideo没有树结构时,样式修改
44
+ ```
45
+
46
+ ```
47
+ version:2.0.294
48
+ 2025年9月15日15:50:49
49
+ 更新日志:
50
+ 1.NsDialog弹出框支持x/y定位和放大还原功能
51
+ ```
52
+
53
+ ```
54
+ version:2.0.293
55
+ 2025年9月15日15:50:49
56
+ 更新日志:
57
+ 1.NsWord预览组件
58
+ 2.修改NsExcel,支持url和上传文件方式预览,新增只读模式
59
+ ```
60
+
61
+ ```
62
+ version:2.0.292
63
+ 2025年8月13日10:30:59
64
+ 更新日志:
65
+ 1.NsPdf预览组件支持搜索功能
66
+ ```
67
+
68
+ ## 创建公共组件库步骤
69
+
70
+ - npm create vue@latest
71
+ - 主目录:创建packages(任意文件夹), 创建全局导出文件index.ts
72
+
73
+ ```
74
+ 主index.ts
75
+ import NsXX from './packages/NsXX/index.ts'
76
+ const components = { NsXX, 其他公共组件 }
77
+ const NsComponents = {
78
+ install: (app: App)=> {
79
+ Object.Keys(components).forEach((compName)=>{
80
+ app.component(compName, components[compName])
81
+ })
82
+ }
83
+ }
84
+ // 按需导出
85
+ export {
86
+ NsXX,
87
+ 其他公共组件
88
+ }
89
+ // 全局导入
90
+ export default NsComponents
91
+ ```
92
+
93
+ - 子目录:NsXX目录,创建独立导出index.ts
94
+
95
+ ```
96
+ 子index.ts:
97
+ import NsXX from './comps/index.ts'
98
+ // 按需导出
99
+ NsXX.install = (app)=>{
100
+ app.component(NsXX.name, NsXX)
101
+ }
102
+ // 导出子组件
103
+ export default NsXX
104
+ ```
105
+
106
+ - 配置package.json
107
+
108
+ ```
109
+ {
110
+ "name": "matrix_components", // 打包的名称
111
+ "version": "2.0.100", // 版本号
112
+ "private": false, // 是否私有
113
+ "type": "module",
114
+ "files": [
115
+ "dist"
116
+ ],
117
+ "main": "./dist/matrix_components.umd.cjs",
118
+ "module": "./dist/matrix_components.js",
119
+ "exports": {
120
+ "./dist/matrix_components.css": "./dist/matrix_components.css",
121
+ "./css": "./dist/matrix_components.css",
122
+ ".": {
123
+ "import": "./dist/matrix_components.js",
124
+ "require": "./dist/matrix_components.umd.cjs"
125
+ }
126
+ },
127
+ "publishConfig": {
128
+ "registry": "http://199.10.9.178:8081/repository/npm-hosted/"
129
+ },
130
+ ...
131
+ }
132
+ ```
133
+
134
+ - 配置vite.config.ts
135
+
136
+ ```
137
+ build: {
138
+ outDir: "dist",
139
+ lib: {
140
+ // 指定入口主文件!!!!
141
+ entry: fileURLToPath(new URL("./pacakges/index.ts"), import.meta.url),
142
+ // 组件库导出后可以使用的全局变量
143
+ name: 'MatrixComponents',
144
+ // 不指定为package.json的name属性
145
+ fileName: 'matrix_components',
146
+ },
147
+ rollupOptions: {
148
+ // 使用外部依赖(打包时删除的包,避免打入到组件库中)
149
+ external: ["vue"],
150
+ output: {
151
+ // 主index.ts导出多个module时需要指定"named"否则报警告,默认为"default"
152
+ exports: 'named',
153
+ // 配合external: ["vue"], 使用外部项目的变量映射
154
+ globals: {
155
+ vue: 'Vue',
156
+ },
157
+ }
158
+ },
159
+ // 【可选】压缩方式,viet3+需安装pnpm i terser -D
160
+ minify: 'terser',
161
+ terserOptions: {
162
+ compress: {
163
+ drop_console: true,
164
+ drop_debugger: true,
165
+ },
166
+ format: {
167
+ comments: false,
168
+ },
169
+ },
170
+ }
171
+ ```
172
+
173
+ - 打包
174
+
175
+ ```
176
+ npm run build
177
+ ```
178
+
179
+ - 当前项目main.ts使用
180
+
181
+ ```
182
+ import NsComponents from '../dist/matrix_components.js'
183
+ // 按需引入
184
+ // import {NsXX} from '../dist/matrix_components,js'
185
+ ...
186
+ app.use(NsComponents)
187
+ // 按需引入
188
+ // app.use(NsXX)
189
+
190
+ ```
191
+
192
+ - 当前项目Test.vue使用
193
+
194
+ ```
195
+ <template>
196
+ <NsXX />
197
+ </template>
198
+ ```
199
+
200
+ ## 使用公共组件库
201
+
202
+ ```
203
+ // 1. 引入组件库
204
+ pnpm i element-plus
205
+ pnpm i matrix_components -S --registry=http://199.10.9.178:8081/repository/npm-group/
206
+ // 安装失败:pnpm i matrix_components --registry=http://199.10.9.178:8081/repository/npm-hosted/
207
+
208
+ // 非初始化安装
209
+ pnpm i -S --registry=http://199.10.9.178:8081/repository/npm-group/
210
+
211
+ // 2. main.ts中引入
212
+ // 安装 Element-Plus
213
+ import 'element-plus/dist/index.css'
214
+ import ElementPlus from 'element-plus'
215
+ import zhCn from 'element-plus/es/locale/lang/zh-cn'
216
+ app.use(ElementPlus, {
217
+ locale: zhCn,
218
+ })
219
+ // 安装组件库(ts需要//@ts-ignore)
220
+ //@ts-ignore
221
+ import NsComponents from 'matrix_components'
222
+ import 'matrix_components/dist/matrix_components.css'
223
+ app.use(NsComponents)
224
+
225
+ ```
226
+
227
+ ### 1. 视频组件(NsVideo)
228
+
229
+ ```
230
+ // 1. 复制播放器资源
231
+ js文件夹 到 public/目录中
232
+ cdn文件夹 到 public/目录中
233
+
234
+ // 2. index.html中引入
235
+ <script src="./js/EasyPlayer-pro.js"></script>
236
+ <script src="./cdn/h5player/h5player.min.js"></script>
237
+
238
+ // 3.安装公共组件库 (安装过则无需安装)
239
+ //@ts-ignore
240
+ import NsComponents from 'matrix_components'
241
+ import 'matrix_components/dist/matrix_components.css'
242
+ app.use(NsComponents)
243
+
244
+ // 4. 项目组件中引入视频组件, NsVideo组件配置参考NsVideo目录ReadMe.md和VideoDemo.vue
245
+ <template>
246
+ <NsVideo class="nsvideo" ref="nsVideoRef" v-bind="videoData" v-on="videoEvent" @changeSplit='changeSplitHandler'>
247
+ <!-- 自定义插槽
248
+ <template #video-tree><span>左侧树-自定义插槽</span></template>
249
+ <template #video-player-head><span>播放区域头部-自定义插槽</span></template>
250
+ <template #video-player-view><span>播放区域主体-自定义插槽</span></template>
251
+ <template #video-player-foot><span>播放区域底部控制按钮-自定义插槽</span></template>
252
+ -->
253
+ </NsVideo>
254
+ </template>
255
+ ```
256
+
257
+ ### 2. 自适应函数(autoScaleInit)
258
+
259
+ ```
260
+ // 1. 安装公共组件库 (安装过则无需安装)
261
+ //@ts-ignore
262
+ import NsComponents, { autoScaleInit } from 'matrix_components'
263
+ import 'matrix_components/dist/matrix_components.css'
264
+ app.use(NsComponents)
265
+
266
+ // 2. 在main.t中初始化,建议在App创建之前
267
+ autoScaleInit(document.querySelector('body'), {
268
+ designWidth: 1920,
269
+ designHeight: 920,
270
+ mode: 'stretch', // 可选 horizontal/vertical/stretch
271
+ });
272
+
273
+ ```
274
+
275
+ ### 3. 弹出框组件(NsDialog)
276
+ ```
277
+ import { NsDialog } from 'matrix_components'
278
+ NsDialog({
279
+ title: '测试',
280
+ // 任何组件添加 $emit('close') 时,会触发关闭弹出框事件
281
+ dom: VideoDemo, // 也可以通过异步方式:import("@/views/VideoDemo.vue") 和 () => import("@/views/VideoDemo.vue")
282
+ option: {
283
+ // dom对应的自定义组件props属性
284
+ ...data,
285
+ },
286
+ events: {
287
+ // dom组件内部自定义事件emit('btnClick', xxx)
288
+ btnClick: () => {
289
+ console.log("点击中间区域内容");
290
+ },
291
+ },
292
+ modalColor: 'rgb(0 21 115 / 20%)', // 遮罩层颜色
293
+ width: '800px', // 宽度, 整个弹出框的高度,非内容高度
294
+ height: '450px', // 高度, 不配置则默认为内容高度
295
+ dialogPadding: [10, 20], // 弹窗内padding
296
+ showFooter: true, // 默认显示底部按钮
297
+ immediately: false, // true立即取消弹出框, false异步请求后取消弹出框,默认false
298
+ draggable: true, // 是否可拖拽,默认false
299
+
300
+ confirm: async (closeFn: any, componentRef: any, footerLoading: any) => { // 底部确认按钮回调事件
301
+ // 2.componentRef可以调用内部函数,前提需要defineExpose
302
+ try{
303
+ const selectRows = componentRef?.value?.getSelectedRows();
304
+ console.log("点击确认,选择数据:", selectRows);
305
+ } catch(e) {
306
+ console.log(e)
307
+ await new Promise(resolve => setTimeout(resolve, 1000))
308
+ }
309
+ // 3.footerLoading可以控制底部loading状态
310
+ if(footerLoading) {
311
+ footerLoading.value = false
312
+ }
313
+ // 1.请求数据,再关闭
314
+ if(closeFn) {
315
+ closeFn()
316
+ }
317
+ },
318
+ close: () => { // 关闭弹出时立即出发
319
+ console.log("点击关闭");
320
+ },
321
+ closed: () => { // 弹窗销毁时触发
322
+ console.log("完成关闭");
323
+ },
324
+ // 头部+底部自定义配置
325
+ // 任何组件添加 $emit('close') 时,会触发关闭弹出框事件
326
+ headerDom: xxx,
327
+ headerOption: {},
328
+ headerEvents: {},
329
+ // 任何组件添加 $emit('close') 时,会触发关闭弹出框事件
330
+ footerDom: yyy,
331
+ footerOption: {},
332
+ footerEvents: {},
333
+ // 底部按钮名称
334
+ footerTitle: {
335
+ close: "取消",
336
+ confirm: "确定",
337
+ },
338
+ }, true, '#app') // true为是否遮罩(非必填), '#app'为挂载点(非必填)
339
+ ```
340
+
341
+ ### 4. 指令集(v-permission / v-length / v-event-unuse / v-event-use / v-sline)
342
+ ```
343
+ // 使用方法
344
+ // 1. 按钮权限 v-permission.class.display / v-permission.id.display / v-permission.class / v-permission.id(默认)
345
+ <button id="zuhu_list_add" v-permission>新增</button>
346
+
347
+ // 使用按钮权限时,需要在外部项目中通过注入权限数据实现(注意:需要在引入公共组件库之前!!!)
348
+ app.provide('btnsPermission', btnsPermission)
349
+ // NsComponents为引入公共组件库
350
+ app.use(NsComponents)
351
+
352
+ // 2. 长度限制(默认50位):v-length[.number][="100"], 如:v-length.number="11" / v-length
353
+ <el-input placeholder="请输入手机号" v-length.number="11"/>
354
+ <el-input placeholder="请输入用户名" v-length />
355
+
356
+ // 3. span单行显示并隐藏溢出文本: 'v-sline'
357
+ <span v-sline >xxxx</span>
358
+
359
+ // 4. 用在能点击下层事件时:event-use (阻止穿透事件) / event-unuse (穿透事件)
360
+ <div v-event-use></div>
361
+ <div>无法点击到</div>
362
+
363
+ <div v-event-unuse></div>
364
+ <div>可以点击到</div>
365
+
366
+ ```
367
+
368
+
369
+ ### 5. sm2加密(getEncryptSm2)
370
+ ```
371
+ // 使用方法
372
+ import NsComponents, { getEncryptSm2 } from 'matrix_components'
373
+ app.use(NsComponents)
374
+ const encrypArrs = getEncryptSm2(publicKey, ["xxx", "yyy"], isAdd04=false, cipherMode=1)
375
+
376
+ ```
377
+
378
+ ### 6. get/post请求(http/get)
379
+ ```
380
+ // 使用方法
381
+ // 1. main.ts中引入, 并指定app.config.globalProperties.$BaseUrl全局请求地址
382
+ import NsComponents from 'matrix_components'
383
+
384
+ // 请求地址的baseUrl使用时必须get/psot必须传值,建议在app.use(NsComponents)之前设置
385
+ app.config.globalProperties.$BaseUrl = "http://xxx";
386
+ app.use(NsComponents)
387
+
388
+ // 【可选】请求添加的token头的key,默认为satoken。token的key和value需要在外部项目中自己设置
389
+ app.config.globalProperties.$TonkenKey = "satoken";
390
+ // 【可选】
391
+ app.config.globalProperties.$LogoutCallback = ()=>{
392
+ // 退出登录回调或者401回调
393
+ };
394
+
395
+ // 2. xx.vue / xx.ts 调用获取get、post请求
396
+ import { get, post } from 'matrix_components'
397
+ export const login = (data) => post('/mag/AccAdmin/doLogin', data);
398
+ ```
399
+
400
+ ### 7. NsPdf组件
401
+ ```
402
+ // 使用方法
403
+ import { NsPdf } from 'matrix_components'
404
+ <NsPdf ref="pdfRef" :url="pdfUrl"></NsPdf>
405
+ const pdfRef = ref()
406
+
407
+ function searchKeyword() {
408
+ pdfRef.value?.search('人')
409
+ }
410
+ ```
411
+
412
+ ### 8. NsOffice组件
413
+ ```
414
+ // 统一的办公文档预览组件,根据文件URL自动选择合适的组件
415
+ // 支持格式:Excel(.xlsx/.xls)、PDF(.pdf)、Word(.docx/.doc)
416
+
417
+ // 使用方法
418
+ import { NsOffice } from 'matrix_components'
419
+
420
+ // 基础使用
421
+ <NsOffice :url="fileUrl" />
422
+
423
+ // Excel编辑模式(仅对Excel文件有效)
424
+ <NsOffice :url="excelUrl" :isEdit="true" />
425
+
426
+ // 获取组件信息
427
+ <NsOffice ref="officeRef" :url="fileUrl" />
428
+ const officeRef = ref()
429
+
430
+ // 获取文件类型
431
+ const fileType = officeRef.value?.getFileType() // 'excel' | 'pdf' | 'word' | 'unsupported'
432
+
433
+ // 获取当前激活的组件实例
434
+ const activeComponent = officeRef.value?.getActiveComponent()
435
+
436
+ // 刷新组件
437
+ officeRef.value?.refresh()
438
+ ```
@@ -0,0 +1,208 @@
1
+ <template>
2
+ <div>
3
+ <el-button type="warning" @click="openDialog({ params: { test: '222' } })">弹出框组件</el-button>
4
+ <el-button type="primary" @click="updateDialogOption">更新弹窗选项</el-button>
5
+ <el-button type="success" @click="callDialogMethod">调用弹窗方法</el-button>
6
+ <!-- 为每个打开的弹窗生成一个关闭按钮 -->
7
+ <div v-for="(instance, index) in dialogInstances" :key="instance.id" style="margin-top: 10px;">
8
+ <el-button type="danger" @click="closeDialog(instance)">关闭弹窗 {{ index + 1 }}</el-button>
9
+ </div>
10
+
11
+ <!-- 全部关闭按钮 -->
12
+ <el-button v-if="dialogInstances.length > 0" type="danger" @click="closeAllDialogs" style="margin-top: 10px;">关闭所有弹窗</el-button>
13
+ </div>
14
+ </template>
15
+ <script setup lang="ts">
16
+ import VideoDemo from '@/views/VideoDemo.vue'
17
+ import { onMounted, onUnmounted, ref } from 'vue'
18
+
19
+ // 扩展Window接口
20
+ declare global {
21
+ interface Window {
22
+ __dialogInstances: any[];
23
+ NsDialog: any;
24
+ }
25
+ }
26
+
27
+ // 保存当前打开的弹窗实例数组
28
+ const dialogInstances = ref<any[]>([])
29
+ const openIndex = ref(0);
30
+ function openDialog(data = {}) {
31
+ openIndex.value++;
32
+ if(dialogInstances.value.length === 0) {
33
+ openIndex.value = 0;
34
+ }
35
+ window.NsDialog(
36
+ {
37
+ class: 'xxx',
38
+ title: '测试',
39
+ // 任何组件添加 $emit('close') 时,会触发关闭弹出框事件
40
+ dom: VideoDemo, // 也可以通过异步方式:import("@/views/VideoDemo.vue") 和 () => import("@/views/VideoDemo.vue")
41
+ domCompleted: (domRef: any)=>{
42
+ // dom加载完成或触发函数,domRef为dom实例可以执行defineExpose暴露出的函数
43
+ console.log('组件加载完成,domRef:', domRef)
44
+ domRef?.xxx?.()
45
+ },
46
+ option: {
47
+ // dom对应的自定义组件props属性
48
+ ...data,
49
+ },
50
+ events: {
51
+ // dom组件内部自定义事件emit('btnClick', xxx)
52
+ btnClick: () => {
53
+ console.log('点击中间区域内容')
54
+ },
55
+ },
56
+ width: '800px', // 宽度, 整个弹出框的高度,非内容高度
57
+ height: '450px', // 高度, 不配置则默认为内容高度
58
+ dialogPadding: [10, 20], // 弹窗内padding
59
+ // 弹窗绝对定位
60
+ x: 250 + openIndex.value * 20,
61
+ y: 100 + openIndex.value * 20,
62
+ // 设置函数时,则有放大和还原按钮,且按返回的对象设置弹出框。(会关闭拖动功能)
63
+ // maxSize: function () {
64
+ // return { width: '100%', height: '800px', x: 0, y: 100 }
65
+ // },
66
+ modal: false, // 模态框
67
+ modalColor: 'rgb(0 21 115 / 20%)', // 遮罩层颜色
68
+ showFooter: true, // 默认显示底部按钮
69
+ immediately: false, // true立即取消弹出框, false异步请求后取消弹出框,默认false
70
+ draggable: true, // 是否可拖拽,默认false
71
+ // 底部确认按钮回调事件
72
+ confirm: async (closeFn: any, componentRef: any, footerLoading: any) => {
73
+ // 2.componentRef可以调用内部函数,前提需要defineExpose
74
+ try {
75
+ const selectRows = componentRef?.value?.getSelectedRows()
76
+ console.log('点击确认,选择数据:', selectRows)
77
+ } catch (e) {
78
+ console.log(e)
79
+ await new Promise((resolve) => setTimeout(resolve, 1000))
80
+ }
81
+ // 3.footerLoading可以控制底部loading状态
82
+ if (footerLoading) {
83
+ footerLoading.value = false
84
+ }
85
+ // 1.请求数据,再关闭
86
+ if (closeFn) {
87
+ closeFn()
88
+ }
89
+ },
90
+ close: () => {
91
+ // 关闭弹出时立即出发
92
+ console.log('点击关闭')
93
+ // 更新dialogInstances数组
94
+ updateDialogInstances()
95
+ },
96
+ closed: () => {
97
+ // 弹窗销毁时触发
98
+ console.log('完成关闭')
99
+ // 更新dialogInstances数组
100
+ updateDialogInstances()
101
+ },
102
+ // 头部+底部自定义配置
103
+ /*
104
+ // 任何组件添加 $emit('close') 时,会触发关闭弹出框事件
105
+ headerDom: xxx,
106
+ headerOption: {},
107
+ headerEvents: {},
108
+ // 任何组件添加 $emit('close') 时,会触发关闭弹出框事件
109
+ footerDom: yyy,
110
+ footerOption: {},
111
+ footerEvents: {},
112
+ // 底部按钮名称
113
+ footerTitle: {
114
+ close: "取消",
115
+ confirm: "确定",
116
+ },
117
+ */
118
+ },
119
+ true,
120
+ '#app',
121
+ ) // true为是否遮罩(非必填), '#app'为挂载点(非必填)
122
+
123
+ // 更新dialogInstances数组
124
+ updateDialogInstances()
125
+
126
+ setTimeout(()=>{
127
+ const data = window.__dialogInstances;
128
+ console.log('当前所有弹窗实例:', data)
129
+ }, 333)
130
+ }
131
+
132
+ // 更新dialogInstances数组
133
+ function updateDialogInstances() {
134
+ // 使用setTimeout确保在DOM更新后执行
135
+ setTimeout(() => {
136
+ dialogInstances.value = [...window.__dialogInstances]
137
+ }, 0)
138
+ }
139
+
140
+ // 更新弹窗选项
141
+ function updateDialogOption() {
142
+ if (dialogInstances.value.length > 0) {
143
+ // 更新最后一个弹窗的选项
144
+ const lastInstance = dialogInstances.value[dialogInstances.value.length - 1]
145
+ lastInstance.updateOption({
146
+ params: { test: 'updated_' + Date.now() }
147
+ })
148
+ console.log('已更新弹窗选项')
149
+ } else {
150
+ console.warn('没有打开的弹窗实例')
151
+ }
152
+ }
153
+
154
+ // 调用弹窗内组件的方法
155
+ function callDialogMethod() {
156
+ if (dialogInstances.value.length > 0) {
157
+ // 调用最后一个弹窗内组件的方法
158
+ const lastInstance = dialogInstances.value[dialogInstances.value.length - 1]
159
+ if (lastInstance.domRef) {
160
+ // 使用新的callMethod方法调用组件方法
161
+ // 注意:这里需要组件内部通过defineExpose暴露方法
162
+ lastInstance.callMethod('defineExpose暴露的方法名', 'arg1', 'arg2')
163
+ console.log('已调用弹窗内组件方法')
164
+ } else {
165
+ console.warn('组件引用不存在')
166
+ }
167
+ } else {
168
+ console.warn('没有打开的弹窗实例')
169
+ }
170
+ }
171
+
172
+ // 关闭指定弹窗
173
+ async function closeDialog(instance: any) {
174
+ if (instance) {
175
+ // 使用新的close方法关闭弹窗
176
+ await instance.close()
177
+ console.log('已关闭指定弹窗')
178
+ } else {
179
+ console.warn('弹窗实例不存在')
180
+ }
181
+ }
182
+
183
+ // 关闭所有弹窗
184
+ function closeAllDialogs() {
185
+ // 关闭所有弹窗
186
+ dialogInstances.value.forEach(instance => {
187
+ instance.close()
188
+ })
189
+ openIndex.value = 0;
190
+ console.log('已关闭所有弹窗')
191
+ }
192
+
193
+ onMounted(() => {
194
+ setTimeout(() => {
195
+ openDialog({ params: { test: '1' } })
196
+ }, 300)
197
+
198
+ // 初始化dialogInstances数组
199
+ updateDialogInstances()
200
+ })
201
+
202
+ onUnmounted(()=>{
203
+ window.__dialogInstances.forEach(item=>{
204
+ item.close()
205
+ })
206
+ })
207
+ </script>
208
+ <style scoped></style>