@gmcb/uv-ui 0.2.27 → 0.3.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 (135) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +21 -0
  3. package/README.md +95 -141
  4. package/docs/api/configs/color.md +52 -0
  5. package/docs/api/index.md +77 -0
  6. package/docs/api/mixins/mpShare.md +95 -0
  7. package/docs/api/request/apiManage.md +88 -0
  8. package/docs/api/request/http.md +451 -0
  9. package/docs/api/utils/colorSwitch.md +78 -0
  10. package/docs/api/utils/debounce.md +104 -0
  11. package/docs/api/utils/fastUse.md +246 -0
  12. package/docs/api/utils/getRect.md +238 -0
  13. package/docs/api/utils/guid.md +41 -0
  14. package/docs/api/utils/index.md +55 -0
  15. package/docs/api/utils/intro.md +25 -0
  16. package/docs/api/utils/object.md +171 -0
  17. package/docs/api/utils/queryParams.md +68 -0
  18. package/docs/api/utils/random.md +23 -0
  19. package/docs/api/utils/randomArray.md +28 -0
  20. package/docs/api/utils/route.md +121 -0
  21. package/docs/api/utils/test.md +237 -0
  22. package/docs/api/utils/time.md +81 -0
  23. package/docs/api/utils/trim.md +24 -0
  24. package/docs/components/actionSheet.md +236 -0
  25. package/docs/components/addQQGroup.md +5 -0
  26. package/docs/components/album.md +91 -0
  27. package/docs/components/alert.md +83 -0
  28. package/docs/components/avatar.md +152 -0
  29. package/docs/components/backTop.md +181 -0
  30. package/docs/components/badge.md +117 -0
  31. package/docs/components/button.md +196 -0
  32. package/docs/components/calendar.md +398 -0
  33. package/docs/components/calendars.md +294 -0
  34. package/docs/components/cell.md +185 -0
  35. package/docs/components/checkbox.md +281 -0
  36. package/docs/components/circleProgress.md +5 -0
  37. package/docs/components/code.md +162 -0
  38. package/docs/components/codeInput.md +175 -0
  39. package/docs/components/collapse.md +250 -0
  40. package/docs/components/color.md +324 -0
  41. package/docs/components/common.md +126 -0
  42. package/docs/components/countDown.md +166 -0
  43. package/docs/components/countTo.md +140 -0
  44. package/docs/components/datetimePicker.md +283 -0
  45. package/docs/components/diff1.x.md +190 -0
  46. package/docs/components/divider.md +88 -0
  47. package/docs/components/downloadSetting.md +54 -0
  48. package/docs/components/dropDown.md +375 -0
  49. package/docs/components/empty.md +99 -0
  50. package/docs/components/feature.md +261 -0
  51. package/docs/components/form.md +736 -0
  52. package/docs/components/gap.md +49 -0
  53. package/docs/components/grid.md +225 -0
  54. package/docs/components/icon.md +101 -0
  55. package/docs/components/image.md +182 -0
  56. package/docs/components/index.md +110 -0
  57. package/docs/components/indexList.md +133 -0
  58. package/docs/components/input.md +250 -0
  59. package/docs/components/install.md +59 -0
  60. package/docs/components/intro.md +32 -0
  61. package/docs/components/keyboard.md +226 -0
  62. package/docs/components/layout.md +310 -0
  63. package/docs/components/line.md +85 -0
  64. package/docs/components/lineProgress.md +141 -0
  65. package/docs/components/link.md +89 -0
  66. package/docs/components/list.md +223 -0
  67. package/docs/components/loadMore.md +140 -0
  68. package/docs/components/loadingIcon.md +144 -0
  69. package/docs/components/loadingPage.md +92 -0
  70. package/docs/components/modal.md +230 -0
  71. package/docs/components/more.md +13 -0
  72. package/docs/components/navbar.md +192 -0
  73. package/docs/components/noNetwork.md +116 -0
  74. package/docs/components/noticeBar.md +131 -0
  75. package/docs/components/notify.md +204 -0
  76. package/docs/components/npmSetting.md +64 -0
  77. package/docs/components/numberBox.md +257 -0
  78. package/docs/components/nvue.md +170 -0
  79. package/docs/components/overlay.md +117 -0
  80. package/docs/components/parse.md +204 -0
  81. package/docs/components/pickColor.md +112 -0
  82. package/docs/components/picker.md +357 -0
  83. package/docs/components/popup.md +221 -0
  84. package/docs/components/problem.md +300 -0
  85. package/docs/components/qrcode.md +169 -0
  86. package/docs/components/quickstart.md +33 -0
  87. package/docs/components/radio.md +256 -0
  88. package/docs/components/rate.md +128 -0
  89. package/docs/components/read.md +163 -0
  90. package/docs/components/readMore.md +227 -0
  91. package/docs/components/resource.md +17 -0
  92. package/docs/components/scrollList.md +218 -0
  93. package/docs/components/search.md +160 -0
  94. package/docs/components/setting.md +111 -0
  95. package/docs/components/settingDesc.md +66 -0
  96. package/docs/components/skeleton.md +105 -0
  97. package/docs/components/skeletons.md +323 -0
  98. package/docs/components/slider.md +157 -0
  99. package/docs/components/steps.md +189 -0
  100. package/docs/components/sticky.md +76 -0
  101. package/docs/components/subsection.md +183 -0
  102. package/docs/components/swipeAction.md +279 -0
  103. package/docs/components/swiper.md +352 -0
  104. package/docs/components/switch.md +216 -0
  105. package/docs/components/tabbar.md +263 -0
  106. package/docs/components/table.md +5 -0
  107. package/docs/components/tabs.md +364 -0
  108. package/docs/components/tag.md +227 -0
  109. package/docs/components/testPic.md +20 -0
  110. package/docs/components/text.md +157 -0
  111. package/docs/components/textarea.md +121 -0
  112. package/docs/components/toast.md +124 -0
  113. package/docs/components/tooltip.md +98 -0
  114. package/docs/components/transition.md +404 -0
  115. package/docs/components/upload.md +253 -0
  116. package/docs/components/vtabs.md +332 -0
  117. package/docs/components/vueUse.md +45 -0
  118. package/docs/components/vuexDetail.md +103 -0
  119. package/docs/components/waterfall.md +651 -0
  120. package/docs/faq/index.md +53 -0
  121. package/docs/guide/codeHint.md +44 -0
  122. package/docs/guide/customIcon.md +168 -0
  123. package/docs/guide/demo.md +92 -0
  124. package/docs/guide/design.md +56 -0
  125. package/docs/guide/globalVariable.md +239 -0
  126. package/docs/guide/i18n.md +194 -0
  127. package/docs/guide/index.md +28 -0
  128. package/docs/guide/note.md +74 -0
  129. package/docs/guide/safeAreaInset.md +64 -0
  130. package/docs/guide/theme.md +67 -0
  131. package/docs/index.md +88 -0
  132. package/libs/config/config.js +0 -10
  133. package/libs/css/color.scss +15 -14
  134. package/package.json +7 -2
  135. package/theme.scss +2 -1
@@ -0,0 +1,332 @@
1
+ ## Vtabs 垂直选项卡 <to-api/>
2
+
3
+ <demo-model url="/pages/componentsD/vtabs/vtabs"></demo-model>
4
+
5
+ ::: tip ✈
6
+
7
+ **组件名:uv-vtabs**
8
+
9
+ [点击下载&安装](https://ext.dcloud.net.cn/plugin?name=uv-vtabs)
10
+
11
+ :::
12
+
13
+ 该组件主要用于分类选择,开箱即用,简单配置参数即可使用,左右自动进行联动,不用自己再去做复杂的计算,组件内部已经完成相关计算。联动和不联动两种可选方式,联动-左右均可滚动,不联动-右边区域只会在选中时显示。
14
+
15
+ ### 平台兼容性
16
+
17
+ |App(vue)|App(nvue)|H5|小程序|VUE2|VUE3|
18
+ |:-:|:-:|:-:|:-:|:-:|:-:|
19
+ |√|√|√|√|√|√|
20
+
21
+ ### 使用案例1-联动
22
+
23
+ - 通过设置`chain=true`开启联动,联动即是:右边区域展示全部内容,并且滚动时左边选项自动定位选中项。
24
+ - 该用法需要配合`uv-vtabs-item`使用,且需要将内容部分循环渲染,这样才能达到联动效果,具体使用参考下方案例。
25
+ - 如果头部有内容,必须传`hdHeight`参数,否则会导致联动时计算不准确;头部没有内容不需要传该参数,默认为0。
26
+
27
+ ```vue
28
+ <template>
29
+ <view class="content">
30
+ <view style="height: 100rpx;background: #ecf5ff;color: #909193;display: flex;justify-content: center;text-align: center;">
31
+ <text style="font-size: 28rpx;">欢迎使用多功能组件uv-vtabs,这是头部内容,有头部内容必须传hdHeight参数</text>
32
+ </view>
33
+ <uv-vtabs
34
+ :chain="chain"
35
+ :list="list"
36
+ :height="height"
37
+ hdHeight="100rpx"
38
+ @change="change">
39
+ <template v-for="(item,index) in list" :key="index">
40
+ <uv-vtabs-item :index="index">
41
+ <view class="item"
42
+ v-for="(item2,index2) in item.childrens"
43
+ :key="index2">
44
+ <view class="item-title">
45
+ <text class="text">{{item2.name}}</text>
46
+ </view>
47
+ <view class="item-content">
48
+ <text class="text">{{item2.desc}}</text>
49
+ </view>
50
+ </view>
51
+ <view
52
+ class="gap"
53
+ v-if="index<list.length-1">
54
+ <uv-gap bg-color="#f1f1f1" height="4"></uv-gap>
55
+ </view>
56
+ </uv-vtabs-item>
57
+ </template>
58
+ <uv-gap bg-color="#fff" height="600"></uv-gap>
59
+ </uv-vtabs>
60
+ </view>
61
+ </template>
62
+
63
+ <script setup>
64
+ import { ref, computed } from "vue";
65
+ import { onReady } from "@dcloudio/uni-app";
66
+ const getList = [{
67
+ name: 'uv-ui简介',
68
+ childrens: [{
69
+ name: 'uv-ui简介',
70
+ desc: '1. uv-ui最初是在uview2.x的基础上进行改进优化,支持vue3等优化,最重要的是支持单独导入直接使用,无需在main.js中进行配置。\n\n2. uv-ui来源于社区,也回归到社区,正是有一群热爱uni-app生态的同学推着它前行,而我们也一如既往的承诺,uv-ui永久开源,永远免费。但是会在下载处进行广告配置,作为开发团队的研发费用的部分来源,所以希望大家理解。'
71
+ }]
72
+ }, {
73
+ name: 'uv-ui特点',
74
+ childrens: [{
75
+ name: '全端兼容',
76
+ desc: 'uv-ui 支持 App(vue)、App(nvue)、H5、小程序和 Vue 3,支持 nvue 原生渲染。uv-ui 的组件都是多端自适应的,底层会抹平很多小程序平台的差异或 bug。'
77
+ }, {
78
+ name: '集成工具',
79
+ desc: '@gmcb/uv-ui 包集成了网络请求 HTTP 及常用工具函数,无需自己再去寻找,并且直接挂载在uni上面,方便使用,只需要在mian.js中引入即可,更多工具请参考:https://www.uvui.cn/api/request/http.html。使用方式请参考:https://www.uvui.cn/components/setting.html。'
80
+ }, {
81
+ name: '主题扩展',
82
+ desc: '@gmcb/uv-ui 包中的 theme.scss 为主题文件,直接在uni.scss中引入主题即可,可以根据自己的需求进行扩展。下面也有说明具体使用方式。使用方法请参考:https://www.uvui.cn/components/setting.html'
83
+ }]
84
+ }, {
85
+ name: '更新日志',
86
+ badge: {
87
+ show: true,
88
+ value: 5
89
+ },
90
+ childrens: [{
91
+ name: '更新日志',
92
+ desc: 'uv-ui的重大更新在更新日志中都有所说明,如果在开发的过程中遇到文档不完善,可以提供给我们,我们会持续完善,非常感谢大家的支持。更新日志:https://www.uvui.cn/components/changelog.html'
93
+ }]
94
+ }, {
95
+ name: '设计规范',
96
+ childrens: [{
97
+ name: '设计规范',
98
+ desc: '为了约束合成更多优秀的组件和模板,打造优质的体验,我们拟定了一些UI界面设计和建议。同时部分之间会有依赖,这是为了减少代码冗余的同时提高开发效率,模块化是我们的基础。如果大家有好的建议,可以提出进行改进。'
99
+ }]
100
+ }, {
101
+ name: '交流反馈',
102
+ childrens: [{
103
+ name: '交流反馈',
104
+ desc: 'uv-ui为采用MIT许可证的开源项目,使用完全免费。欢迎加QQ群交流反馈,一起学习,共同进步。QQ群: 549833913'
105
+ }]
106
+ }];
107
+ const list = ref([]);
108
+ const chain = ref(true);
109
+ const height = computed(() => {
110
+ return uni.getSystemInfoSync().windowHeight - uni.upx2px(100);
111
+ });
112
+ function change(index) {
113
+ console.log('选项改变:', index);
114
+ }
115
+ onReady(() => {
116
+ // 模拟接口请求数据
117
+ uni.showLoading({
118
+ title: '加载中'
119
+ });
120
+ setTimeout(() => {
121
+ list.value = getList;
122
+ uni.hideLoading();
123
+ }, 500);
124
+ });
125
+
126
+ </script>
127
+ <style scoped lang="scss">
128
+ .header {
129
+ padding: 30rpx;
130
+ font-size: 30rpx;
131
+ color: #333;
132
+ }
133
+ .item {
134
+ padding: 10rpx 20rpx;
135
+ &-title {
136
+ .text {
137
+ font-weight: 700;
138
+ font-size: 32rpx;
139
+ color: #111;
140
+ }
141
+ }
142
+ &-content {
143
+ padding: 20rpx 0;
144
+ .text {
145
+ line-height: 48rpx;
146
+ font-size: 30rpx;
147
+ color: #111;
148
+ /* #ifndef APP-NVUE */
149
+ word-break: break-all;
150
+ /* #endif */
151
+ }
152
+ }
153
+ }
154
+ .gap {
155
+ padding: 0 30rpx;
156
+ }
157
+ </style>
158
+ ```
159
+
160
+ ### 使用案例2-不联动
161
+
162
+ - 通过设置`chain=false`关闭联动,联动即是:右边区域展示全部内容,并且滚动时左边选项自动定位选中项。
163
+ - 该用法需要配合`uv-vtabs-item`使用,需要手动处理右边渲染的数据,具体使用参考下方案例。
164
+
165
+ ```vue
166
+ <template>
167
+ <view class="content">
168
+ <uv-vtabs
169
+ :chain="chain"
170
+ :list="list"
171
+ :barItemBadgeStyle="{right:'20px',top:'12px'}"
172
+ @change="change">
173
+ <uv-vtabs-item>
174
+ <view
175
+ class="item"
176
+ v-for="(item2,index2) in list2"
177
+ :key="index2">
178
+ <view class="item-title">
179
+ <text class="text">{{item2.name}}</text>
180
+ </view>
181
+ <view class="item-content">
182
+ <text class="text">{{item2.desc}}</text>
183
+ </view>
184
+ </view>
185
+ </uv-vtabs-item>
186
+ </uv-vtabs>
187
+ </view>
188
+ </template>
189
+
190
+ <script setup>
191
+ import { ref, computed } from "vue";
192
+ import { onReady } from "@dcloudio/uni-app";
193
+ const getList = [{
194
+ name: 'uv-ui简介',
195
+ childrens: [{
196
+ name: 'uv-ui简介',
197
+ desc: '1. uv-ui最初是在uview2.x的基础上进行改进优化,支持vue3等优化,最重要的是支持单独导入直接使用,无需在main.js中进行配置。\n\n2. uv-ui来源于社区,也回归到社区,正是有一群热爱uni-app生态的同学推着它前行,而我们也一如既往的承诺,uv-ui永久开源,永远免费。但是会在下载处进行广告配置,作为开发团队的研发费用的部分来源,所以希望大家理解。'
198
+ }]
199
+ }, {
200
+ name: 'uv-ui特点',
201
+ childrens: [{
202
+ name: '全端兼容',
203
+ desc: 'uv-ui 支持 App(vue)、App(nvue)、H5、小程序和 Vue 3,支持 nvue 原生渲染。uv-ui 的组件都是多端自适应的,底层会抹平很多小程序平台的差异或 bug。'
204
+ }, {
205
+ name: '集成工具',
206
+ desc: '@gmcb/uv-ui 包集成了网络请求 HTTP 及常用工具函数,无需自己再去寻找,并且直接挂载在uni上面,方便使用,只需要在mian.js中引入即可,更多工具请参考:https://www.uvui.cn/api/request/http.html。使用方式请参考:https://www.uvui.cn/components/setting.html。'
207
+ }, {
208
+ name: '主题扩展',
209
+ desc: '@gmcb/uv-ui 包中的 theme.scss 为主题文件,直接在uni.scss中引入主题即可,可以根据自己的需求进行扩展。下面也有说明具体使用方式。使用方法请参考:https://www.uvui.cn/components/setting.html'
210
+ }]
211
+ }, {
212
+ name: '更新日志',
213
+ badge: {
214
+ isDot: true
215
+ },
216
+ childrens: [{
217
+ name: '更新日志',
218
+ desc: 'uv-ui的重大更新在更新日志中都有所说明,如果在开发的过程中遇到文档不完善,可以提供给我们,我们会持续完善,非常感谢大家的支持。更新日志:https://www.uvui.cn/components/changelog.html'
219
+ }]
220
+ }, {
221
+ name: '设计规范',
222
+ childrens: [{
223
+ name: '设计规范',
224
+ desc: '为了约束合成更多优秀的组件和模板,打造优质的体验,我们拟定了一些UI界面设计和建议。同时部分之间会有依赖,这是为了减少代码冗余的同时提高开发效率,模块化是我们的基础。如果大家有好的建议,可以提出进行改进。'
225
+ }]
226
+ }, {
227
+ name: '交流反馈',
228
+ childrens: [{
229
+ name: '交流反馈',
230
+ desc: 'uv-ui为采用MIT许可证的开源项目,使用完全免费。欢迎加QQ群交流反馈,一起学习,共同进步。QQ群: 549833913'
231
+ }]
232
+ }];
233
+ const list = ref([]);
234
+ const chain = ref(false);
235
+ const value = ref(0);
236
+ const list2 = computed(() => {
237
+ const _list = list.value[value.value]?.childrens;
238
+ return _list ? _list : [];
239
+ });
240
+ function change(index) {
241
+ console.log('选项改变:', index);
242
+ value.value = index;
243
+ }
244
+ onReady(() => {
245
+ // 模拟接口请求数据
246
+ uni.showLoading({
247
+ title: '加载中'
248
+ });
249
+ setTimeout(() => {
250
+ list.value = getList;
251
+ uni.hideLoading();
252
+ }, 200);
253
+ });
254
+
255
+ </script>
256
+ <style scoped
257
+ lang="scss">
258
+ .header {
259
+ padding: 30rpx;
260
+ font-size: 30rpx;
261
+ color: #333;
262
+ }
263
+ .item {
264
+ padding: 10rpx 20rpx;
265
+ &-title {
266
+ .text {
267
+ font-weight: 700;
268
+ font-size: 32rpx;
269
+ color: #111;
270
+ }
271
+ }
272
+ &-content {
273
+ padding: 20rpx 0;
274
+ .text {
275
+ line-height: 48rpx;
276
+ font-size: 30rpx;
277
+ color: #111;
278
+ /* #ifndef APP-NVUE */
279
+ word-break: break-all;
280
+ /* #endif */
281
+ }
282
+ }
283
+ }
284
+ .gap {
285
+ padding: 0 30rpx;
286
+ }
287
+ </style>
288
+ ```
289
+
290
+ ### 完整示例
291
+
292
+ ::: tip 完整示例下载地址
293
+
294
+ [https://ext.dcloud.net.cn/plugin?name=uv-ui](https://ext.dcloud.net.cn/plugin?name=uv-ui)
295
+
296
+ :::
297
+
298
+ ### API
299
+ ---
300
+
301
+ ### Vtabs Props
302
+
303
+ | 参数 | 说明 | 类型 | 默认值 | 可选值 |
304
+ | :- | :- | :- | :- | :- |
305
+ | list | 选项数组,元素为对象,如`[{name:'uv-ui简介'}]`。元素对象中可设置徽标显示,如`[{name:'更新日志', badge: {isDot: true}}]`,设置更多参数参考[uv-badge](/components/badge.html)组件。 | Array | [] | - |
306
+ | keyName | 从list元素对象中读取的键名 | String | name | - |
307
+ | current | 当前选中项,从0开始 | Number | 0 | - |
308
+ | hdHeight `1.0.4` | 头部内容的高度,头部有内容必传,否则会有联动误差 | Number &#124; String | 0 | - |
309
+ | chain | 是否开启联动,开启后右边区域可以滑动查看内容。注意:`chain=true`时`VtabsItem`的`index`属性必传,见下方。 | Boolean | true | true &#124; false |
310
+ | height | 整个列表的高度,默认auto或空则为屏幕高度 | Number|String | 屏幕高度`sys().windowHeight` | - |
311
+ | barWidth | 左边选项区域的宽度 | Number|String | 180rpx | - |
312
+ | barScrollable | 左边选项区域是否允许滚动 | Boolean | true | true &#124; false |
313
+ | barBgColor | 左边选项区域的背景颜色 | String | $uv-bg-color | - |
314
+ | barStyle | 左边选项区域的自定义样式 | Object | - | - |
315
+ | barItemStyle | 左边选项区域「每个」选项的自定义样式 | Object | - | - |
316
+ | barItemActiveStyle | 左边选项区域「选中」选项的自定义样式 | Object | - | - |
317
+ | barItemActiveLineStyle | 左边选项区域「选中选项竖线条」的自定义样式,如设置竖条颜色,需设置背景色:`:bar-item-active-line-style="{background: '#2878FF'}"` | Object | - | - |
318
+ | barItemBadgeStyle | 左边选项区域选中选项徽标的自定义样式,**主要用于调整徽标位置**,案例见上面 [使用案例2-不联动](/components/vtabs.html#使用案例2-不联动) | Object | - | - |
319
+ | contentStyle | 右边区域自定义样式 | Object | - | - |
320
+
321
+ ### VtabsItem Props
322
+
323
+ | 参数 | 说明 | 类型 | 默认值 | 可选值 |
324
+ | :- | :- | :- | :- | :- |
325
+ | index | 内容区索引值,`chain=true`开启时必传,具体传值详情在示例中查看 | Number &#124; String | 0 | - |
326
+
327
+ ### Vtabs Events
328
+
329
+ |事件名 |说明 |回调参数 |
330
+ |:- |:- |:- |
331
+ | @change | 选择改变时触发 | 选项索引值 |
332
+ | @scrolltolower `1.0.4` | 内容滚动到底部触发 | 选项索引值 |
@@ -0,0 +1,45 @@
1
+ ## 简要介绍 app.use 的原理
2
+
3
+ uv-ui 会努力做好框架的内容,同时我们也希望您能学习到一些更深入的知识。
4
+
5
+ 在 uni-app Vue 3 项目中,插件通常在 `createApp()` 中通过 `app.use()` 注册:
6
+
7
+ ```js
8
+ import App from './App';
9
+ import { createSSRApp } from 'vue';
10
+ import uvUI from '@gmcb/uv-ui';
11
+
12
+ export function createApp() {
13
+ const app = createSSRApp(App);
14
+ app.use(uvUI);
15
+ return { app };
16
+ }
17
+ ```
18
+
19
+ 这里我们把 `uvUI` 传递给了 `app.use()`。Vue 3 会检查插件对象是否提供 `install` 方法,如果有,就调用它,并把当前应用实例 `app` 作为第一个参数传入。简化后的逻辑可以理解为:
20
+
21
+ ```js
22
+ app.use = function (plugin, ...options) {
23
+ if (typeof plugin.install === 'function') {
24
+ plugin.install(app, ...options);
25
+ } else if (typeof plugin === 'function') {
26
+ plugin(app, ...options);
27
+ }
28
+
29
+ return app;
30
+ }
31
+ ```
32
+
33
+ 有了上面的分析,我们知道 uv-ui 内部会定义一个 `install` 方法。Vue 3 插件通常会在这个方法里注册全局能力:
34
+
35
+ ```js
36
+ const install = app => {
37
+ app.config.globalProperties.$uv = uni.$uv;
38
+ };
39
+
40
+ export default {
41
+ install
42
+ };
43
+ ```
44
+
45
+ 注册后,项目中可以优先通过 `uni.$uv.xxx` 使用工具能力;在组件实例内,也可以通过实例代理访问 `$uv`。
@@ -0,0 +1,103 @@
1
+ ## Vue 3 中简化 Vuex 写法的基本原理
2
+
3
+ `vuex` 传统写法简单,但是也很繁琐:
4
+
5
+ 1. 我们需要在`vuex`中定义`state`和`mutations`
6
+ 2. 我们需要在每个用到 `vuex` 变量的地方,都引入 `useStore`,再通过 `computed` 暴露给模板
7
+ 3. 修改`vuex`变量的时候,还需要通过`commit`提交
8
+ 4. 由于`vuex`变量是保存在运行内存中的,刷新浏览器`vuex`变量会消失,还需要通过其他手段实现变量的存续
9
+
10
+ - 针对上面的第1点,我们写了一个统一的`mutations`,用于更新所有的`state`变量,这样可以免去每个变量都要写一个对应的`mutations`步骤,同时在
11
+ 这个统一的`mutations`中,根据配置判断是否在变量更新的时候,把它存进本地`Local Storage`,这样H5刷新或者APP下次启动,就会自动把这些变量赋值给
12
+ `state`
13
+
14
+ 具体实现如下(当然,这可能不是最优的写法)
15
+
16
+ ```js
17
+ // store/index.js
18
+
19
+ import { createStore } from 'vuex';
20
+ import { getProperty, setProperty } from '@gmcb/uv-ui/libs/function/index.js';
21
+
22
+ function saveLifeData(key, value) {
23
+ uni.setStorageSync(key, value);
24
+ }
25
+
26
+ const store = createStore({
27
+ state: {
28
+ user: {
29
+ name: ''
30
+ },
31
+ version: ''
32
+ },
33
+ mutations: {
34
+ uvStore(state, payload) {
35
+ setProperty(state, payload.name, payload.value);
36
+ const saveKey = payload.name.split('.')[0];
37
+ saveLifeData(saveKey, getProperty(state, saveKey));
38
+ }
39
+ }
40
+ });
41
+
42
+ export default store;
43
+ ```
44
+
45
+ - 针对上面第二点,Vue 3 推荐封装组合式函数,在需要的页面中显式引入。这样依赖关系更清晰,也不会把状态注入到所有页面。
46
+
47
+ ```js
48
+ // composables/useUvStore.js
49
+ import { computed } from 'vue';
50
+ import { useStore } from 'vuex';
51
+
52
+ export function useUvStore(keys = []) {
53
+ const store = useStore();
54
+ const state = {};
55
+
56
+ keys.forEach(key => {
57
+ state[key] = computed(() => store.state[key]);
58
+ });
59
+
60
+ function uvStore(name, value) {
61
+ store.commit('uvStore', {
62
+ name,
63
+ value
64
+ });
65
+ }
66
+
67
+ return {
68
+ ...state,
69
+ uvStore
70
+ };
71
+ }
72
+ ```
73
+
74
+
75
+ - 针对上面的第3点,因为我们通过统一的`mutations`的去更新`state`,自然就需要一个统一方法去触发`mutations`,用以替代原来的`commit`方法,
76
+ 可以在页面中通过组合式函数统一调用:
77
+
78
+ ```vue
79
+ <template>
80
+ <view>
81
+ <view>{{ user.name }}</view>
82
+ <uv-button @click="updateName">修改姓名</uv-button>
83
+ </view>
84
+ </template>
85
+
86
+ <script setup>
87
+ import { useUvStore } from '@/composables/useUvStore.js';
88
+
89
+ const { user, uvStore } = useUvStore(['user']);
90
+
91
+ function updateName() {
92
+ uvStore('user.name', '史诗');
93
+ }
94
+ </script>
95
+ ```
96
+
97
+ 当我们要修改某一个 `state` 值的时候,就调用 `uvStore('name', value)`。如果项目规模较大,也可以直接使用 Pinia,避免继续扩展 Vuex 的全局写法。
98
+
99
+ - 针对第4点,其实已经在第1点中解决了。
100
+
101
+ 上面的做法,只是抛砖引玉的做了一个思路的解析,如果您有更好的思路,也可以和我们分享。
102
+
103
+ 说明:确保您是新项目的情况下,或者您对这个实现方法很清楚,才使用这个方法。