matrix_components 2.0.393 → 2.0.400

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matrix_components",
3
- "version": "2.0.393",
3
+ "version": "2.0.400",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "files": [
@@ -1,210 +0,0 @@
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
- // 现在可以直接更新弹窗标题了
146
- lastInstance.updateOption({
147
- title: '更新后的标题',
148
- params: { test: '更新后的参数' }
149
- })
150
- console.log('已更新弹窗标题和选项')
151
- } else {
152
- console.warn('没有打开的弹窗实例')
153
- }
154
- }
155
-
156
- // 调用弹窗内组件的方法
157
- function callDialogMethod() {
158
- if (dialogInstances.value.length > 0) {
159
- // 调用最后一个弹窗内组件的方法
160
- const lastInstance = dialogInstances.value[dialogInstances.value.length - 1]
161
- if (lastInstance.domRef) {
162
- // 使用新的callMethod方法调用组件方法
163
- // 注意:这里需要组件内部通过defineExpose暴露方法
164
- lastInstance.callMethod('defineExpose暴露的方法名', 'arg1', 'arg2')
165
- console.log('已调用弹窗内组件方法')
166
- } else {
167
- console.warn('组件引用不存在')
168
- }
169
- } else {
170
- console.warn('没有打开的弹窗实例')
171
- }
172
- }
173
-
174
- // 关闭指定弹窗
175
- async function closeDialog(instance: any) {
176
- if (instance) {
177
- // 使用新的close方法关闭弹窗
178
- await instance.close()
179
- console.log('已关闭指定弹窗')
180
- } else {
181
- console.warn('弹窗实例不存在')
182
- }
183
- }
184
-
185
- // 关闭所有弹窗
186
- function closeAllDialogs() {
187
- // 关闭所有弹窗
188
- dialogInstances.value.forEach(instance => {
189
- instance.close()
190
- })
191
- openIndex.value = 0;
192
- console.log('已关闭所有弹窗')
193
- }
194
-
195
- onMounted(() => {
196
- setTimeout(() => {
197
- openDialog({ params: { test: '1' } })
198
- }, 300)
199
-
200
- // 初始化dialogInstances数组
201
- updateDialogInstances()
202
- })
203
-
204
- onUnmounted(()=>{
205
- window.__dialogInstances.forEach(item=>{
206
- item.close()
207
- })
208
- })
209
- </script>
210
- <style scoped></style>
@@ -1,270 +0,0 @@
1
- // 动态表单配置文件
2
- export const formConfig = {
3
- // 表单数据初始值
4
- formData: {
5
- name: "",
6
- email: "",
7
- age: null,
8
- gender: "",
9
- hobbies: [],
10
- isVip: false,
11
- score: 0,
12
- birthday: null,
13
- city: [],
14
- description: "",
15
- customField: "",
16
- province: "",
17
- citySelect: "",
18
- district: "",
19
- category: "",
20
- subcategory: "",
21
- },
22
-
23
- // 表单配置项
24
- formItems: [
25
- {
26
- label: "输入框",
27
- prop: "name",
28
- component: "input",
29
- span: 12,
30
- required: true,
31
- placeholder: "请输入输入框",
32
- props: {
33
- clearable: true,
34
- },
35
- },
36
- {
37
- label: "邮箱",
38
- prop: "email",
39
- component: "input",
40
- span: 12,
41
- required: true,
42
- props: {
43
- clearable: true,
44
- },
45
- rules: [
46
- { type: "email", message: "请输入正确的邮箱地址", trigger: "blur" },
47
- ],
48
- },
49
- {
50
- label: "数值输入",
51
- prop: "age",
52
- component: "number",
53
- span: 12,
54
- props: {
55
- min: 1,
56
- max: 120,
57
- controlsPosition: "right",
58
- },
59
- },
60
- {
61
- label: "单选",
62
- prop: "gender",
63
- component: "radio-group",
64
- span: 12,
65
- options: [
66
- { label: "AAA", value: "male" },
67
- { label: "BBB", value: "female" },
68
- ],
69
- },
70
- {
71
- label: "多选",
72
- prop: "hobbies",
73
- component: "checkbox-group",
74
- span: 24,
75
- options: [
76
- { label: "读书", value: "reading" },
77
- { label: "运动", value: "sports" },
78
- { label: "音乐", value: "music" },
79
- { label: "旅行", value: "travel" },
80
- ],
81
- },
82
- {
83
- label: "滑块",
84
- prop: "isVip",
85
- component: "switch",
86
- span: 12,
87
- },
88
- {
89
- label: "评分",
90
- prop: "score",
91
- component: "el-slider",
92
- span: 12,
93
- props: {
94
- min: 0,
95
- max: 100,
96
- showStops: true,
97
- showTooltip: false,
98
- },
99
- },
100
- {
101
- label: "日期选择",
102
- prop: "birthday",
103
- component: "date-picker",
104
- span: 12,
105
- props: {
106
- type: "date",
107
- format: "YYYY-MM-DD",
108
- valueFormat: "YYYY-MM-DD",
109
- },
110
- },
111
- {
112
- label: "城市",
113
- prop: "city",
114
- component: "cascader",
115
- span: 12,
116
- options: [
117
- {
118
- value: "jiangsu",
119
- label: "江苏省",
120
- children: [
121
- { value: "nanjing", label: "南京市" },
122
- { value: "suzhou", label: "苏州市" },
123
- ],
124
- },
125
- {
126
- value: "zhejiang",
127
- label: "浙江省",
128
- children: [
129
- { value: "hangzhou", label: "杭州市" },
130
- { value: "ningbo", label: "宁波市" },
131
- ],
132
- },
133
- ],
134
- props: {
135
- clearable: true,
136
- filterable: true,
137
- },
138
- },
139
- {
140
- label: "长文本",
141
- prop: "description",
142
- component: "textarea",
143
- span: 24,
144
- props: {
145
- rows: 4,
146
- maxlength: 200,
147
- showWordLimit: true,
148
- },
149
- },
150
- {
151
- label: "关联字段",
152
- prop: "customField",
153
- component: "input",
154
- span: 24,
155
- slot: "customSlot",
156
- },
157
- {
158
- label: "级联A",
159
- prop: "province",
160
- component: "select",
161
- span: 8,
162
- optionsKey: "provinces",
163
- props: {
164
- clearable: true,
165
- },
166
- },
167
- {
168
- label: "城市",
169
- prop: "citySelect",
170
- component: "select",
171
- span: 8,
172
- dependsOn: {
173
- field: "province",
174
- optionsKey: "cities",
175
- },
176
- props: {
177
- clearable: true,
178
- },
179
- },
180
- {
181
- label: "区县",
182
- prop: "district",
183
- component: "select",
184
- span: 8,
185
- dependsOn: {
186
- field: "citySelect",
187
- optionsKey: "districts",
188
- },
189
- props: {
190
- clearable: true,
191
- },
192
- },
193
- ],
194
-
195
- // 表单验证规则
196
- formRules: {
197
- name: [
198
- { required: true, message: "请输入输入框", trigger: "blur" },
199
- { min: 2, max: 20, message: "长度在 2 到 20 个字符", trigger: "blur" },
200
- ],
201
- email: [{ required: true, message: "请输入邮箱地址", trigger: "blur" }],
202
- },
203
-
204
- // 下拉框选项数据源
205
- optionsData: {
206
- provinces: [
207
- { label: "江苏省", value: "jiangsu" },
208
- { label: "浙江省", value: "zhejiang" },
209
- { label: "上海市", value: "shanghai" },
210
- ],
211
- cities: {
212
- jiangsu: [
213
- { label: "南京市", value: "nanjing" },
214
- { label: "苏州市", value: "suzhou" },
215
- { label: "无锡市", value: "wuxi" },
216
- ],
217
- zhejiang: [
218
- { label: "杭州市", value: "hangzhou" },
219
- { label: "宁波市", value: "ningbo" },
220
- { label: "温州市", value: "wenzhou" },
221
- ],
222
- shanghai: [
223
- { label: "黄浦区", value: "huangpu" },
224
- { label: "徐汇区", value: "xuhui" },
225
- { label: "长宁区", value: "changning" },
226
- ],
227
- },
228
- districts: {
229
- nanjing: [
230
- { label: "玄武区", value: "xuanwu" },
231
- { label: "秦淮区", value: "qinhuai" },
232
- { label: "建邺区", value: "jianye" },
233
- ],
234
- suzhou: [
235
- { label: "姑苏区", value: "gusu" },
236
- { label: "虎丘区", value: "huqiu" },
237
- { label: "吴中区", value: "wuzhong" },
238
- ],
239
- hangzhou: [
240
- { label: "西湖区", value: "xihu" },
241
- { label: "拱墅区", value: "gongshu" },
242
- { label: "江干区", value: "jianggan" },
243
- ],
244
- },
245
- categories: [
246
- { label: "电子产品", value: "electronics" },
247
- { label: "服装鞋帽", value: "clothing" },
248
- { label: "图书音像", value: "books" },
249
- ],
250
- subcategories: {
251
- electronics: [
252
- { label: "手机", value: "phone" },
253
- { label: "电脑", value: "computer" },
254
- { label: "平板", value: "tablet" },
255
- ],
256
- clothing: [
257
- { label: "男装", value: "mens" },
258
- { label: "女装", value: "womens" },
259
- { label: "童装", value: "kids" },
260
- ],
261
- books: [
262
- { label: "小说", value: "novel" },
263
- { label: "技术书籍", value: "tech" },
264
- { label: "教育", value: "education" },
265
- ],
266
- },
267
- },
268
- };
269
-
270
- export default formConfig;