@10yun/cv-mobile-ui 0.3.25 → 0.4.1

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 (190) hide show
  1. package/build/parse-pages.js +2 -2
  2. package/package.json +1 -1
  3. package/plugins/request.js +0 -1
  4. package/ui-cv/README.md +3 -0
  5. package/ui-cv/cv-badge/uni-badge.vue +249 -0
  6. package/ui-cv/cv-banner/cv-banner.vue +1 -1
  7. package/ui-cv/cv-banner-card/cv-banner-card.vue +1 -1
  8. package/ui-cv/cv-block/cv-block.vue +1 -1
  9. package/ui-cv/cv-box/cv-box.vue +1 -1
  10. package/{ui-uni/uni-calendar → ui-cv/cv-calendar}/calendar.js +0 -0
  11. package/{ui-uni/uni-calendar → ui-cv/cv-calendar}/uni-calendar-item.vue +0 -0
  12. package/{ui-uni/uni-calendar → ui-cv/cv-calendar}/uni-calendar.vue +0 -0
  13. package/{ui-uni/uni-calendar → ui-cv/cv-calendar}/util.js +0 -0
  14. package/{ui-uni/uni-card → ui-cv/cv-card}/uni-card.vue +0 -0
  15. package/ui-cv/cv-cell/cv-cell.vue +1 -1
  16. package/ui-cv/cv-checkbox-group/cv-checkbox-group.vue +227 -0
  17. package/ui-cv/cv-checkbox-opt-base/cv-checkbox-opt-base.vue +57 -0
  18. package/ui-cv/cv-checkbox-opt-tag/cv-checkbox-opt-tag.vue +107 -0
  19. package/ui-cv/cv-code-sms/cv-code-sms.vue +23 -42
  20. package/{ui-uni/uni-col → ui-cv/cv-col}/uni-col.vue +0 -0
  21. package/{ui-uni/uni-collapse → ui-cv/cv-collapse}/uni-collapse.vue +0 -0
  22. package/{ui-uni/uni-collapse-item → ui-cv/cv-collapse-item}/uni-collapse-item.vue +0 -0
  23. package/{ui-uni/uni-combox → ui-cv/cv-combox}/uni-combox.vue +0 -0
  24. package/{ui-uni/uni-countdown → ui-cv/cv-countdown}/uni-countdown.vue +0 -0
  25. package/{ui-uni/uni-data-checkbox → ui-cv/cv-data-checkbox}/uni-data-checkbox.vue +0 -0
  26. package/{ui-uni/uni-data-indexed-list → ui-cv/cv-data-indexed-list}/clientdb.js +0 -0
  27. package/{ui-uni/uni-data-indexed-list → ui-cv/cv-data-indexed-list}/uni-data-indexed-list-item.vue +0 -0
  28. package/{ui-uni/uni-data-indexed-list → ui-cv/cv-data-indexed-list}/uni-data-indexed-list.vue +0 -0
  29. package/{ui-uni/uni-data-picker → ui-cv/cv-data-picker}/keypress.js +0 -0
  30. package/{ui-uni/uni-data-picker → ui-cv/cv-data-picker}/uni-data-picker.vue +0 -0
  31. package/{ui-uni/uni-data-pickerview → ui-cv/cv-data-pickerview}/uni-data-picker.js +0 -0
  32. package/{ui-uni/uni-data-pickerview → ui-cv/cv-data-pickerview}/uni-data-pickerview.vue +0 -0
  33. package/{ui-uni/uni-dateformat → ui-cv/cv-dateformat}/date-format.js +0 -0
  34. package/{ui-uni/uni-dateformat → ui-cv/cv-dateformat}/uni-dateformat.vue +0 -0
  35. package/{ui-uni/uni-datetime-picker → ui-cv/cv-datetime-picker}/calendar-item.vue +0 -0
  36. package/{ui-uni/uni-datetime-picker → ui-cv/cv-datetime-picker}/calendar.js +0 -0
  37. package/{ui-uni/uni-datetime-picker → ui-cv/cv-datetime-picker}/calendar.vue +0 -0
  38. package/{ui-uni/uni-datetime-picker → ui-cv/cv-datetime-picker}/keypress.js +0 -0
  39. package/{ui-uni/uni-datetime-picker → ui-cv/cv-datetime-picker}/time-picker.vue +0 -0
  40. package/{ui-uni/uni-datetime-picker → ui-cv/cv-datetime-picker}/uni-datetime-picker.vue +0 -0
  41. package/{ui-uni/uni-datetime-picker → ui-cv/cv-datetime-picker}/util.js +0 -0
  42. package/ui-cv/cv-dialog-bottom/cv-dialog-bottom.vue +1 -1
  43. package/ui-cv/cv-dialog-full/cv-dialog-full.vue +1 -1
  44. package/ui-cv/cv-dialog-loading/cv-dialog-loading.vue +3 -3
  45. package/ui-cv/cv-drawer/cv-drawer.vue +185 -0
  46. package/{ui-uni/uni-drawer → ui-cv/cv-drawer}/keypress.js +14 -14
  47. package/{ui-uni/uni-easyinput → ui-cv/cv-easyinput}/common.js +0 -0
  48. package/{ui-uni/uni-easyinput → ui-cv/cv-easyinput}/uni-easyinput.vue +0 -0
  49. package/ui-cv/cv-editor-parse/readme.md +2 -3
  50. package/ui-cv/{cv-editor → cv-editor-quill}/compressImage.vue +0 -0
  51. package/ui-cv/{cv-editor/cv-editor.vue → cv-editor-quill/cv-editor-quill.vue} +3 -23
  52. package/ui-cv/{cv-editor → cv-editor-quill}/editor-icon.css +0 -0
  53. package/ui-cv/{cv-editor → cv-editor-quill}/editor-icon.ttf +0 -0
  54. package/ui-cv/{cv-editor → cv-editor-quill}/index.js +0 -0
  55. package/{ui-uni/uni-fab → ui-cv/cv-fab}/uni-fab.vue +0 -0
  56. package/{ui-uni/uni-fab → ui-cv/cv-fab}/uni-fab.vue.bak +0 -0
  57. package/{ui-uni/uni-fav → ui-cv/cv-fav}/uni-fav.vue +0 -0
  58. package/{ui-uni/uni-file-picker → ui-cv/cv-file-picker}/choose-and-upload-file.js +0 -0
  59. package/{ui-uni/uni-file-picker → ui-cv/cv-file-picker}/uni-file-picker.vue +0 -0
  60. package/{ui-uni/uni-file-picker → ui-cv/cv-file-picker}/upload-file.vue +0 -0
  61. package/{ui-uni/uni-file-picker → ui-cv/cv-file-picker}/upload-image.vue +0 -0
  62. package/{ui-uni/uni-file-picker → ui-cv/cv-file-picker}/utils.js +0 -0
  63. package/ui-cv/cv-form-base/cv-form-base.vue +470 -0
  64. package/ui-cv/cv-form-base/validate.js +477 -0
  65. package/ui-cv/cv-form-group/cv-form-group.vue +123 -80
  66. package/ui-cv/cv-form-group/cv-form-group2.vue +80 -0
  67. package/ui-cv/cv-form-item/cv-form-item.vue +482 -174
  68. package/ui-cv/cv-form-item/cv-form-item2.vue +215 -0
  69. package/ui-cv/cv-form-merge/cv-form-merge.vue +1 -1
  70. package/ui-cv/cv-geo-local/cv-geo-local.vue +14 -26
  71. package/{ui-uni/uni-goods-nav → ui-cv/cv-goods-nav}/uni-goods-nav.vue +0 -0
  72. package/ui-cv/cv-grid-group/cv-grid-group.vue +148 -0
  73. package/ui-cv/cv-grid-item/cv-grid-item.vue +132 -0
  74. package/ui-cv/cv-icons/cv-icons.vue +1 -1
  75. package/ui-cv/cv-icons2/cv-icons2.vue +78 -0
  76. package/ui-cv/cv-icons2/icons.js +132 -0
  77. package/{ui-uni/uni-icons → ui-cv/cv-icons2}/uni.ttf +0 -0
  78. package/{ui-uni/uni-indexed-list → ui-cv/cv-indexed-list}/uni-indexed-list-item.vue +0 -0
  79. package/{ui-uni/uni-indexed-list → ui-cv/cv-indexed-list}/uni-indexed-list.vue +0 -0
  80. package/ui-cv/cv-info/cv-info.vue +5 -20
  81. package/ui-cv/cv-input-btn/cv-input-btn.vue +25 -43
  82. package/ui-cv/cv-input-digit/cv-input-digit.vue +61 -28
  83. package/ui-cv/cv-input-idcard/cv-input-idcard.vue +47 -29
  84. package/ui-cv/cv-input-number/cv-input-number.vue +60 -28
  85. package/ui-cv/cv-input-password/cv-input-password.vue +80 -30
  86. package/ui-cv/cv-input-text/cv-input-text.vue +55 -37
  87. package/ui-cv/cv-link/uni-link.vue +130 -0
  88. package/{ui-uni/uni-list → ui-cv/cv-list}/uni-list.vue +0 -0
  89. package/{ui-uni/uni-list → ui-cv/cv-list}/uni-refresh.vue +0 -0
  90. package/{ui-uni/uni-list → ui-cv/cv-list}/uni-refresh.wxs +0 -0
  91. package/{ui-uni/uni-list-ad → ui-cv/cv-list-ad}/uni-list-ad.vue +0 -0
  92. package/{ui-uni/uni-list-chat → ui-cv/cv-list-chat}/uni-list-chat.scss +0 -0
  93. package/{ui-uni/uni-list-chat → ui-cv/cv-list-chat}/uni-list-chat.vue +0 -0
  94. package/{ui-uni/uni-list-item → ui-cv/cv-list-item}/uni-list-item.vue +0 -0
  95. package/ui-cv/cv-load-more/config.json +9 -9
  96. package/ui-cv/cv-load-more/cv-load-more.vue +34 -5
  97. package/ui-cv/cv-message/cv-message.vue +1 -1
  98. package/{ui-uni/uni-nav-bar → ui-cv/cv-nav-bar}/uni-nav-bar.vue +0 -0
  99. package/{ui-uni/uni-nav-bar → ui-cv/cv-nav-bar}/uni-status-bar.vue +0 -0
  100. package/ui-cv/cv-nav-col/cv-nav-col.vue +1 -1
  101. package/ui-cv/cv-nav-row/cv-nav-row.vue +1 -1
  102. package/{ui-uni/uni-notice-bar → ui-cv/cv-notice-bar}/uni-notice-bar.vue +0 -0
  103. package/{ui-uni/uni-number-box → ui-cv/cv-number-box}/uni-number-box.vue +0 -0
  104. package/{ui-uni/uni-pagination → ui-cv/cv-pagination}/uni-pagination.vue +0 -0
  105. package/ui-cv/cv-picker-date/cv-picker-date.vue +17 -27
  106. package/ui-cv/cv-picker-datetime/cv-picker-datetime.vue +31 -41
  107. package/ui-cv/cv-picker-datetime5/cv-picker-datetime5.vue +19 -29
  108. package/ui-cv/cv-picker-region/cv-picker-region.vue +23 -33
  109. package/ui-cv/cv-picker-time/cv-picker-time.vue +16 -26
  110. package/ui-cv/cv-picker1/cv-picker1.vue +16 -28
  111. package/ui-cv/cv-picker2/cv-picker2.vue +22 -32
  112. package/ui-cv/cv-picker3/cv-picker3.vue +34 -44
  113. package/{ui-uni/uni-popup → ui-cv/cv-popup}/keypress.js +0 -0
  114. package/{ui-uni/uni-popup → ui-cv/cv-popup}/popup.js +0 -0
  115. package/{ui-uni/uni-popup → ui-cv/cv-popup}/uni-popup.vue +0 -0
  116. package/{ui-uni/uni-popup-dialog → ui-cv/cv-popup-dialog}/keypress.js +0 -0
  117. package/{ui-uni/uni-popup-dialog → ui-cv/cv-popup-dialog}/uni-popup-dialog.vue +0 -0
  118. package/{ui-uni/uni-popup-message → ui-cv/cv-popup-message}/uni-popup-message.vue +0 -0
  119. package/{ui-uni/uni-popup-share → ui-cv/cv-popup-share}/uni-popup-share.vue +0 -0
  120. package/ui-cv/cv-radio-group/cv-radio-group.vue +185 -0
  121. package/ui-cv/cv-radio-opt-base/cv-radio-opt-base.vue +57 -0
  122. package/ui-cv/cv-radio-opt-tag/cv-radio-opt-tag.vue +107 -0
  123. package/ui-cv/cv-rate/cv-rate.vue +13 -17
  124. package/ui-cv/cv-rate/uni-rate.vue +358 -0
  125. package/ui-cv/cv-row/uni-row.vue +157 -0
  126. package/ui-cv/cv-search/cv-search.vue +4 -4
  127. package/{ui-uni/uni-search-bar → ui-cv/cv-search-bar}/uni-search-bar.vue +0 -0
  128. package/{ui-uni/uni-section → ui-cv/cv-section}/uni-section.vue +0 -0
  129. package/{ui-uni/uni-segmented-control → ui-cv/cv-segmented-control}/uni-segmented-control.vue +0 -0
  130. package/ui-cv/cv-skeleton/cv-skeleton2.vue +5 -5
  131. package/ui-cv/cv-specs/cv-specs.vue +1 -1
  132. package/{ui-uni/uni-status-bar → ui-cv/cv-status-bar}/uni-status-bar.vue +0 -0
  133. package/{ui-uni/uni-steps → ui-cv/cv-steps}/uni-steps.vue +0 -0
  134. package/{ui-uni/uni-swipe-action → ui-cv/cv-swipe-action}/uni-swipe-action.vue +0 -0
  135. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/bindingx.js +0 -0
  136. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/index.wxs +0 -0
  137. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/isPC.js +0 -0
  138. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/mpalipay.js +0 -0
  139. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/mpother.js +0 -0
  140. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/mpwxs.js +0 -0
  141. package/{ui-uni/uni-swipe-action-item → ui-cv/cv-swipe-action-item}/uni-swipe-action-item.vue +0 -0
  142. package/{ui-uni/uni-swiper-dot → ui-cv/cv-swiper-dot}/uni-swiper-dot.vue +0 -0
  143. package/ui-cv/cv-switch/cv-switch.vue +5 -9
  144. package/{ui-uni/uni-table → ui-cv/cv-table}/uni-table.vue +0 -0
  145. package/{ui-uni/uni-tag → ui-cv/cv-tag}/uni-tag.vue +0 -0
  146. package/{ui-uni/uni-tbody → ui-cv/cv-tbody}/uni-tbody.vue +0 -0
  147. package/{ui-uni/uni-td → ui-cv/cv-td}/uni-td.vue +0 -0
  148. package/{ui-uni/uni-test → ui-cv/cv-test}/uni-test.vue +0 -0
  149. package/ui-cv/cv-textarea/cv-textarea.vue +56 -41
  150. package/{ui-uni/uni-th → ui-cv/cv-th}/filter-dropdown.vue +0 -0
  151. package/{ui-uni/uni-th → ui-cv/cv-th}/uni-th.vue +0 -0
  152. package/{ui-uni/uni-thead → ui-cv/cv-thead}/uni-thead.vue +0 -0
  153. package/{ui-uni/uni-title → ui-cv/cv-title}/uni-title.vue +0 -0
  154. package/{ui-uni/uni-tr → ui-cv/cv-tr}/table-checkbox.vue +0 -0
  155. package/{ui-uni/uni-tr → ui-cv/cv-tr}/uni-tr.vue +0 -0
  156. package/{ui-uni/uni-transition → ui-cv/cv-transition}/createAnimation.js +0 -0
  157. package/{ui-uni/uni-transition → ui-cv/cv-transition}/uni-transition.vue +0 -0
  158. package/ui-cv/cv-upload-avatar/cv-upload-avatar.vue +24 -22
  159. package/ui-cv/cv-upload-img/cv-upload-img.vue +1 -1
  160. package/ui-cv/mixins/mixins-input.js +20 -29
  161. package/ui-cv/mixins/mixins-picker.js +1 -13
  162. package/ui-uni/amap-wx/js/util.js +158 -166
  163. package/ui-uni/product.vue +52 -52
  164. package/ui-uni/u-charts/u-charts.js +1092 -743
  165. package/ui-cv/cv-checkbox/cv-checkbox.vue +0 -140
  166. package/ui-cv/cv-checkbox-tag/cv-checkbox-tag.vue +0 -164
  167. package/ui-cv/cv-nav-group/cv-nav-group.vue +0 -33
  168. package/ui-cv/cv-radio/cv-radio.vue +0 -111
  169. package/ui-cv/cv-radio-sex/cv-radio-sex.vue +0 -80
  170. package/ui-cv/cv-radio-tag/cv-radio-tag.vue +0 -133
  171. package/ui-cv/mixins/mixins-checkbox.js +0 -71
  172. package/ui-cv/mixins/mixins-common.js +0 -53
  173. package/ui-cv/mixins/mixins-radio.js +0 -84
  174. package/ui-uni/page-foot/page-foot.vue +0 -38
  175. package/ui-uni/page-head/page-head.vue +0 -16
  176. package/ui-uni/u-link/u-link.vue +0 -59
  177. package/ui-uni/uni-badge/uni-badge.vue +0 -250
  178. package/ui-uni/uni-drawer/uni-drawer.vue +0 -178
  179. package/ui-uni/uni-forms/uni-forms.vue +0 -467
  180. package/ui-uni/uni-forms/validate.js +0 -486
  181. package/ui-uni/uni-forms-item/uni-forms-item.vue +0 -500
  182. package/ui-uni/uni-grid/uni-grid.vue +0 -141
  183. package/ui-uni/uni-grid-item/uni-grid-item.vue +0 -123
  184. package/ui-uni/uni-group/uni-group.vue +0 -123
  185. package/ui-uni/uni-icons/icons.js +0 -132
  186. package/ui-uni/uni-icons/uni-icons.vue +0 -72
  187. package/ui-uni/uni-link/uni-link.vue +0 -117
  188. package/ui-uni/uni-load-more/uni-load-more.vue +0 -366
  189. package/ui-uni/uni-rate/uni-rate.vue +0 -357
  190. package/ui-uni/uni-row/uni-row.vue +0 -155
@@ -0,0 +1,470 @@
1
+ <template>
2
+ <view class="uni-forms" :class="{ 'uni-forms--top': !border }">
3
+ <form @submit.stop="submitForm" @reset="resetForm">
4
+ <slot></slot>
5
+ </form>
6
+ </view>
7
+ </template>
8
+
9
+ <script>
10
+ // #ifndef VUE3
11
+ import Vue from 'vue';
12
+ Vue.prototype.binddata = function (name, value, formName) {
13
+ if (formName) {
14
+ this.$refs[formName].setValue(name, value);
15
+ } else {
16
+ let formVm;
17
+ for (let i in this.$refs) {
18
+ const vm = this.$refs[i];
19
+ if (vm && vm.$options && vm.$options.name === 'uniForms') {
20
+ formVm = vm;
21
+ break;
22
+ }
23
+ }
24
+ if (!formVm) return console.error('当前 uni-froms 组件缺少 ref 属性');
25
+ formVm.setValue(name, value);
26
+ }
27
+ };
28
+ // #endif
29
+
30
+ import Validator from './validate.js';
31
+ /**
32
+ * Forms 表单
33
+ * @description 由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据
34
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=2773
35
+ * @property {Object} rules 表单校验规则
36
+ * @property {String} validateTrigger = [bind|submit] 校验触发器方式 默认 submit
37
+ * @value bind 发生变化时触发
38
+ * @value submit 提交时触发
39
+ * @property {String} labelPosition = [top|left] label 位置 默认 left
40
+ * @value top 顶部显示 label
41
+ * @value left 左侧显示 label
42
+ * @property {String} labelWidth label 宽度,默认 65px
43
+ * @property {String} labelAlign = [left|center|right] label 居中方式 默认 left
44
+ * @value left label 左侧显示
45
+ * @value center label 居中
46
+ * @value right label 右侧对齐
47
+ * @property {String} errShowType = [undertext|toast|modal] 校验错误信息提示方式
48
+ * @value undertext 错误信息在底部显示
49
+ * @value toast 错误信息toast显示
50
+ * @value modal 错误信息modal显示
51
+ * @event {Function} submit 提交时触发
52
+ */
53
+
54
+ export default {
55
+ name: 'cvFormBase',
56
+ components: {},
57
+ model: {
58
+ prop: 'modelValue',
59
+ event: 'update:modelValue'
60
+ },
61
+ emits: ['update:modelValue', 'input', 'reset', 'validate', 'submit'],
62
+ props: {
63
+ // 即将弃用
64
+ value: {
65
+ type: Object,
66
+ default() {
67
+ return {};
68
+ }
69
+ },
70
+ // 替换 value 属性
71
+ modelValue: {
72
+ type: Object,
73
+ default() {
74
+ return {};
75
+ }
76
+ },
77
+ // 表单校验规则
78
+ rules: {
79
+ type: Object,
80
+ default() {
81
+ return {};
82
+ }
83
+ },
84
+ // 校验触发器方式,默认 关闭
85
+ validateTrigger: {
86
+ type: String,
87
+ default: ''
88
+ },
89
+ // label 位置,可选值 top/left
90
+ labelPosition: {
91
+ type: String,
92
+ default: 'left'
93
+ },
94
+ // label 宽度,单位 px
95
+ labelWidth: {
96
+ type: [String, Number],
97
+ default: ''
98
+ },
99
+ // label 居中方式,可选值 left/center/right
100
+ labelAlign: {
101
+ type: String,
102
+ default: 'left'
103
+ },
104
+ errShowType: {
105
+ type: String,
106
+ default: 'undertext'
107
+ },
108
+ border: {
109
+ type: Boolean,
110
+ default: false
111
+ },
112
+ line: {
113
+ type: Boolean,
114
+ default: true
115
+ }
116
+ },
117
+ data() {
118
+ return {
119
+ formData: {}
120
+ };
121
+ },
122
+ computed: {
123
+ dataValue() {
124
+ if (JSON.stringify(this.modelValue) === '{}') {
125
+ return this.value;
126
+ } else {
127
+ return this.modelValue;
128
+ }
129
+ }
130
+ },
131
+ watch: {
132
+ rules(newVal) {
133
+ // 如果规则发生变化,要初始化组件
134
+ this.init(newVal);
135
+ },
136
+ labelPosition() {
137
+ this.childrens.forEach((vm) => {
138
+ vm.init();
139
+ });
140
+ }
141
+ },
142
+ created() {
143
+ // #ifdef VUE3
144
+ let getbinddata = getApp().$vm.$.appContext.config.globalProperties.binddata;
145
+ if (!getbinddata) {
146
+ getApp().$vm.$.appContext.config.globalProperties.binddata = function (name, value, formName) {
147
+ if (formName) {
148
+ this.$refs[formName].setValue(name, value);
149
+ } else {
150
+ let formVm;
151
+ for (let i in this.$refs) {
152
+ const vm = this.$refs[i];
153
+ if (vm && vm.$options && vm.$options.name === 'uniForms') {
154
+ formVm = vm;
155
+ break;
156
+ }
157
+ }
158
+ if (!formVm) return console.error('当前 uni-froms 组件缺少 ref 属性');
159
+ formVm.setValue(name, value);
160
+ }
161
+ };
162
+ }
163
+ // #endif
164
+
165
+ // 存放watch 监听数组
166
+ this.unwatchs = [];
167
+ // 存放子组件数组
168
+ this.childrens = [];
169
+ // 存放 easyInput 组件
170
+ this.inputChildrens = [];
171
+ // 存放 dataCheckbox 组件
172
+ this.checkboxChildrens = [];
173
+ // 存放规则
174
+ this.formRules = [];
175
+ this.init(this.rules);
176
+ },
177
+ // mounted() {
178
+ // this.init(this.rules)
179
+ // },
180
+ methods: {
181
+ init(formRules) {
182
+ // 判断是否有规则
183
+ if (Object.keys(formRules).length === 0) {
184
+ this.formData = this.dataValue;
185
+ return;
186
+ }
187
+ this.formRules = formRules;
188
+ this.validator = new Validator(formRules);
189
+ this.registerWatch();
190
+ },
191
+ // 监听 watch
192
+ registerWatch() {
193
+ // 取消监听,避免多次调用 init 重复执行 $watch
194
+ this.unwatchs.forEach((v) => v());
195
+ this.childrens.forEach((v) => {
196
+ v.init();
197
+ });
198
+ // watch 每个属性 ,需要知道具体那个属性发变化
199
+ Object.keys(this.dataValue).forEach((key) => {
200
+ let watch = this.$watch(
201
+ 'dataValue.' + key,
202
+ (value) => {
203
+ if (!value) return;
204
+ // 如果是对象 ,则平铺内容
205
+ if (value.toString() === '[object Object]') {
206
+ for (let i in value) {
207
+ let name = `${key}[${i}]`;
208
+ this.formData[name] = this._getValue(name, value[i]);
209
+ }
210
+ } else {
211
+ this.formData[key] = this._getValue(key, value);
212
+ }
213
+ },
214
+ {
215
+ deep: true,
216
+ immediate: true
217
+ }
218
+ );
219
+ this.unwatchs.push(watch);
220
+ });
221
+ },
222
+ /**
223
+ * 公开给用户使用
224
+ * 设置校验规则
225
+ * @param {Object} formRules
226
+ */
227
+ setRules(formRules) {
228
+ this.init(formRules);
229
+ },
230
+ /**
231
+ * 公开给用户使用
232
+ * 设置自定义表单组件 value 值
233
+ * @param {String} name 字段名称
234
+ * @param {String} value 字段值
235
+ */
236
+ setValue(name, value, callback) {
237
+ let example = this.childrens.find((child) => child.name === name);
238
+ if (!example) return null;
239
+ value = this._getValue(example.name, value);
240
+ this.formData[name] = value;
241
+ example.val = value;
242
+ this.$emit('input', Object.assign({}, this.value, this.formData));
243
+ this.$emit('update:modelValue', Object.assign({}, this.value, this.formData));
244
+ return example.triggerCheck(value, callback);
245
+ },
246
+
247
+ /**
248
+ * 表单重置
249
+ * @param {Object} event
250
+ */
251
+ resetForm(event) {
252
+ this.childrens.forEach((item) => {
253
+ item.errMsg = '';
254
+ const inputComp = this.inputChildrens.find((child) => child.rename === item.name);
255
+ if (inputComp) {
256
+ inputComp.errMsg = '';
257
+ inputComp.$emit('input', inputComp.multiple ? [] : '');
258
+ inputComp.$emit('update:modelValue', inputComp.multiple ? [] : '');
259
+ }
260
+ });
261
+
262
+ this.childrens.forEach((item) => {
263
+ if (item.name) {
264
+ this.formData[item.name] = this._getValue(item.name, '');
265
+ }
266
+ });
267
+
268
+ this.$emit('input', this.formData);
269
+ this.$emit('update:modelValue', this.formData);
270
+ this.$emit('reset', event);
271
+ },
272
+
273
+ /**
274
+ * 触发表单校验,通过 @validate 获取
275
+ * @param {Object} validate
276
+ */
277
+ validateCheck(validate) {
278
+ if (validate === null) validate = null;
279
+ this.$emit('validate', validate);
280
+ },
281
+ /**
282
+ * 校验所有或者部分表单
283
+ */
284
+ async validateAll(invalidFields, type, keepitem, callback) {
285
+ let childrens = [];
286
+ for (let i in invalidFields) {
287
+ const item = this.childrens.find((v) => v.name === i);
288
+ if (item) {
289
+ childrens.push(item);
290
+ }
291
+ }
292
+
293
+ if (!callback && typeof keepitem === 'function') {
294
+ callback = keepitem;
295
+ }
296
+
297
+ let promise;
298
+ if (!callback && typeof callback !== 'function' && Promise) {
299
+ promise = new Promise((resolve, reject) => {
300
+ callback = function (valid, invalidFields) {
301
+ !valid ? resolve(invalidFields) : reject(valid);
302
+ };
303
+ });
304
+ }
305
+
306
+ let results = [];
307
+ let newFormData = {};
308
+ if (this.validator) {
309
+ for (let key in childrens) {
310
+ const child = childrens[key];
311
+ let name = child.isArray ? child.arrayField : child.name;
312
+ if (child.isArray) {
313
+ if (child.name.indexOf('[') !== -1 && child.name.indexOf(']') !== -1) {
314
+ const fieldData = child.name.split('[');
315
+ const fieldName = fieldData[0];
316
+ const fieldValue = fieldData[1].replace(']', '');
317
+ if (!newFormData[fieldName]) {
318
+ newFormData[fieldName] = {};
319
+ }
320
+ newFormData[fieldName][fieldValue] = this._getValue(name, invalidFields[name]);
321
+ }
322
+ } else {
323
+ newFormData[name] = this._getValue(name, invalidFields[name]);
324
+ }
325
+ const result = await child.triggerCheck(invalidFields[name], true);
326
+ if (result) {
327
+ results.push(result);
328
+ if (this.errShowType === 'toast' || this.errShowType === 'modal') break;
329
+ }
330
+ }
331
+ } else {
332
+ newFormData = invalidFields;
333
+ }
334
+ if (Array.isArray(results)) {
335
+ if (results.length === 0) results = null;
336
+ }
337
+
338
+ if (Array.isArray(keepitem)) {
339
+ keepitem.forEach((v) => {
340
+ newFormData[v] = this.dataValue[v];
341
+ });
342
+ }
343
+
344
+ if (type === 'submit') {
345
+ this.$emit('submit', {
346
+ detail: {
347
+ value: newFormData,
348
+ errors: results
349
+ }
350
+ });
351
+ } else {
352
+ this.$emit('validate', results);
353
+ }
354
+
355
+ callback && typeof callback === 'function' && callback(results, newFormData);
356
+
357
+ if (promise && callback) {
358
+ return promise;
359
+ } else {
360
+ return null;
361
+ }
362
+ },
363
+ submitForm() {},
364
+ /**
365
+ * 外部调用方法
366
+ * 手动提交校验表单
367
+ * 对整个表单进行校验的方法,参数为一个回调函数。
368
+ */
369
+ submit(keepitem, callback, type) {
370
+ for (let i in this.dataValue) {
371
+ const itemData = this.childrens.find((v) => v.name === i);
372
+ if (itemData) {
373
+ if (this.formData[i] === undefined) {
374
+ this.formData[i] = this._getValue(i, this.dataValue[i]);
375
+ }
376
+ }
377
+ }
378
+ if (!type) {
379
+ console.warn('submit 方法即将废弃,请使用validate方法代替!');
380
+ }
381
+ return this.validateAll(this.formData, 'submit', keepitem, callback);
382
+ },
383
+
384
+ /**
385
+ * 外部调用方法
386
+ * 校验表单
387
+ * 对整个表单进行校验的方法,参数为一个回调函数。
388
+ */
389
+ validate(keepitem, callback) {
390
+ return this.submit(keepitem, callback, true);
391
+ },
392
+
393
+ /**
394
+ * 部分表单校验
395
+ * @param {Object} props
396
+ * @param {Object} cb
397
+ */
398
+ validateField(props, callback) {
399
+ props = [].concat(props);
400
+ let invalidFields = {};
401
+ this.childrens.forEach((item) => {
402
+ if (props.indexOf(item.name) !== -1) {
403
+ invalidFields = Object.assign({}, invalidFields, {
404
+ [item.name]: this.formData[item.name]
405
+ });
406
+ }
407
+ });
408
+ return this.validateAll(invalidFields, 'submit', [], callback);
409
+ },
410
+
411
+ /**
412
+ * 对整个表单进行重置,将所有字段值重置为初始值并移除校验结果
413
+ */
414
+ resetFields() {
415
+ this.resetForm();
416
+ },
417
+
418
+ /**
419
+ * 移除表单项的校验结果。传入待移除的表单项的 prop 属性或者 prop 组成的数组,如不传则移除整个表单的校验结果
420
+ */
421
+ clearValidate(props) {
422
+ props = [].concat(props);
423
+ this.childrens.forEach((item) => {
424
+ const inputComp = this.inputChildrens.find((child) => child.rename === item.name);
425
+ if (props.length === 0) {
426
+ item.errMsg = '';
427
+ if (inputComp) {
428
+ inputComp.errMsg = '';
429
+ }
430
+ } else {
431
+ if (props.indexOf(item.name) !== -1) {
432
+ item.errMsg = '';
433
+ if (inputComp) {
434
+ inputComp.errMsg = '';
435
+ }
436
+ }
437
+ }
438
+ });
439
+ },
440
+ /**
441
+ * 把 value 转换成指定的类型
442
+ * @param {Object} key
443
+ * @param {Object} value
444
+ */
445
+ _getValue(key, value) {
446
+ const rules = (this.formRules[key] && this.formRules[key].rules) || [];
447
+ const isRuleNum = rules.find((val) => val.format && this.type_filter(val.format));
448
+ const isRuleBool = rules.find((val) => (val.format && val.format === 'boolean') || val.format === 'bool');
449
+ // 输入值为 number
450
+ if (isRuleNum) {
451
+ value = isNaN(value) ? value : value === '' || value === null ? null : Number(value);
452
+ }
453
+ // 简单判断真假值
454
+ if (isRuleBool) {
455
+ value = !value ? false : true;
456
+ }
457
+ return value;
458
+ },
459
+ /**
460
+ * 过滤数字类型
461
+ * @param {Object} format
462
+ */
463
+ type_filter(format) {
464
+ return format === 'int' || format === 'double' || format === 'number' || format === 'timestamp';
465
+ }
466
+ }
467
+ };
468
+ </script>
469
+
470
+ <style scoped></style>