uview-plus 3.4.38 → 3.4.40

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/changelog.md CHANGED
@@ -1,9 +1,18 @@
1
+ ## 3.4.40(2025-06-06)
2
+ fix: 升级二维码 canvas -> canvas2 感谢@yjr
3
+
4
+ ## 3.4.39(2025-05-31)
5
+ fix: 修改步骤条微信小程序下的布局 感谢@jiaruiyan
6
+
7
+ fix: u-tabs在屏幕尺寸发生变化时滑块位置没有发生变化 感谢@aqzhft
8
+
9
+ fix: 鸿蒙平台不支持plus.runtime.openWeb 感谢@aqzhft
10
+
1
11
  ## 3.4.38(2025-05-30)
2
12
  fix: 修复picker-data快捷组件缺少index
3
13
 
4
14
  fix: 修复picker组件双向绑定初始化及取消后复原再次打开后的当前项目
5
15
 
6
-
7
16
  ## 3.4.37(2025-05-29)
8
17
  feat: modal支持设置动画时间
9
18
 
@@ -365,6 +365,9 @@ export default {
365
365
  // #ifdef APP-PLUS
366
366
  plus.runtime.openWeb(href)
367
367
  // #endif
368
+ // #ifdef APP-HARMONY
369
+ plus.runtime.openURL(href)
370
+ // #endif
368
371
  }
369
372
  } else {
370
373
  // 跳转页面
@@ -433,7 +433,12 @@ export default {
433
433
  } else if (href.includes('://')) {
434
434
  // 打开外链
435
435
  if (this.copyLink) {
436
- plus.runtime.openWeb(href)
436
+ // #ifdef APP-PLUS
437
+ plus.runtime.openWeb(href)
438
+ // #endif
439
+ // #ifdef APP-HARMONY
440
+ plus.runtime.openURL(href)
441
+ // #endif
437
442
  }
438
443
  } else {
439
444
  uni.navigateTo({
@@ -1036,7 +1036,11 @@ let QRCode = {};
1036
1036
  usingComponents: opt.usingComponents,
1037
1037
  showLoading: opt.showLoading,
1038
1038
  loadingText: opt.loadingText,
1039
+ that: opt.that
1039
1040
  };
1041
+
1042
+ let canvas = null;
1043
+
1040
1044
  if (typeof opt === 'string') { // 只编码ASCII字符串
1041
1045
  opt = {
1042
1046
  text: opt
@@ -1083,8 +1087,25 @@ let QRCode = {};
1083
1087
  }
1084
1088
  return options.foreground;
1085
1089
  }
1090
+
1091
+ let getCanvas = async (id) => {
1092
+ return new Promise((resolve, reject)=>{
1093
+ try {
1094
+ const query = uni.createSelectorQuery().in(this.options.that);
1095
+ query.select(`#${id}`)
1096
+ .fields({ node: true, size: true })
1097
+ .exec((res) => {
1098
+ resolve(res[0].node)
1099
+ })
1100
+ }
1101
+ catch (e) {
1102
+ console.error("createCanvasContextFail",e)
1103
+ }
1104
+
1105
+ })
1106
+ }
1086
1107
  // 创建canvas
1087
- let createCanvas = function (options) {
1108
+ let createCanvas = async function (options) {
1088
1109
  if(options.showLoading){
1089
1110
  uni.showLoading({
1090
1111
  title: options.loadingText,
@@ -1094,8 +1115,17 @@ let QRCode = {};
1094
1115
  var ctx = '';
1095
1116
  if (options.nvueContext) {
1096
1117
  ctx = options.nvueContext;
1097
- } else {
1098
- ctx = uni.createCanvasContext(options.canvasId, options.context);
1118
+ }
1119
+ else {
1120
+ // 获取canvas node节点
1121
+ canvas = await getCanvas(options.canvasId);
1122
+ // #ifdef MP
1123
+ // 不清楚是小程序的bug还是什么原因,canvas的node节点宽高和设置的宽高不一致 重新设置下
1124
+ canvas.width = options.size;
1125
+ canvas.height = options.size;
1126
+ // #endif
1127
+
1128
+ ctx = canvas.getContext('2d');
1099
1129
  }
1100
1130
  var count = qrCodeAlg.getModuleCount();
1101
1131
  var ratioSize = options.size;
@@ -1107,14 +1137,18 @@ let QRCode = {};
1107
1137
  for (var row = 0; row < count; row++) {
1108
1138
  for (var col = 0; col < count; col++) {
1109
1139
  var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW));
1110
- var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW));
1140
+ var h = (Math.ceil((row + 1) * tileH) - Math.floor(row * tileH));
1111
1141
  var foreground = getForeGround({
1112
1142
  row: row,
1113
1143
  col: col,
1114
1144
  count: count,
1115
1145
  options: options
1116
1146
  });
1117
- ctx.setFillStyle(qrCodeAlg.modules[row][col] ? foreground : options.background);
1147
+ if (options.nvueContext) {
1148
+ ctx.setFillStyle(qrCodeAlg.modules[row][col] ? foreground : options.background);
1149
+ } else {
1150
+ ctx.fillStyle = qrCodeAlg.modules[row][col] ? foreground : options.background;
1151
+ }
1118
1152
  ctx.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
1119
1153
  }
1120
1154
  }
@@ -1122,12 +1156,33 @@ let QRCode = {};
1122
1156
  var x = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
1123
1157
  var y = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
1124
1158
  drawRoundedRect(ctx, x, y, ratioImgSize, ratioImgSize, 2, 6, true, true)
1125
- ctx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
1159
+ if (options.nvueContext) {
1160
+ ctx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
1161
+ }
1162
+ else {
1163
+ // #ifdef H5
1164
+ const img = new Image();
1165
+ // #endif
1166
+ // #ifndef H5
1167
+ const img = canvas.createImage();
1168
+ // #endif
1169
+ img.onload = () => {
1170
+ ctx.drawImage(img, x, y, ratioImgSize, ratioImgSize);
1171
+ };
1172
+ img.src = options.image;
1173
+ }
1126
1174
  // 画圆角矩形
1127
1175
  function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, stroke) {
1128
- ctxi.setLineWidth(lineWidth);
1129
- ctxi.setFillStyle(options.background);
1130
- ctxi.setStrokeStyle(options.background);
1176
+ if (options.nvueContext) {
1177
+ ctxi.setLineWidth(lineWidth);
1178
+ ctxi.setFillStyle(options.background);
1179
+ ctxi.setStrokeStyle(options.background);
1180
+ }
1181
+ else {
1182
+ ctxi.lineWidth = lineWidth;
1183
+ ctxi.fillStyle = options.background;
1184
+ ctxi.strokeStyle = options.background;
1185
+ }
1131
1186
  ctxi.beginPath(); // draw top and top right corner
1132
1187
  ctxi.moveTo(x + r, y);
1133
1188
  ctxi.lineTo(x + width, y); // move to top-right corner
@@ -1152,57 +1207,64 @@ let QRCode = {};
1152
1207
  }
1153
1208
  }
1154
1209
  setTimeout(() => {
1155
- ctx.draw(true, () => {
1156
- // 保存到临时区域
1157
- setTimeout(() => {
1158
- if (options.nvueContext) {
1159
- ctx.toTempFilePath(
1160
- 0,
1161
- 0,
1162
- options.width,
1163
- options.height,
1164
- options.width,
1165
- options.height,
1166
- "",
1167
- 1,
1168
- function(res) {
1169
- if (options.cbResult) {
1170
- options.cbResult(res.tempFilePath)
1171
- }
1172
- }
1173
- );
1174
- } else {
1175
- uni.canvasToTempFilePath({
1176
- width: options.width,
1177
- height: options.height,
1178
- destWidth: options.width,
1179
- destHeight: options.height,
1180
- canvasId: options.canvasId,
1181
- quality: Number(1),
1182
- success: function (res) {
1183
- if (options.cbResult) {
1184
- // 由于官方还没有统一此接口的输出字段,所以先判定下 支付宝为 res.apFilePath
1185
- if (!empty(res.tempFilePath)) {
1186
- options.cbResult(res.tempFilePath)
1187
- } else if (!empty(res.apFilePath)) {
1188
- options.cbResult(res.apFilePath)
1189
- } else {
1210
+ // canvas2 绘制是自动的不需要手动绘制
1211
+ if(options.nvueContext){
1212
+ ctx.draw(true, () => {
1213
+ // 保存到临时区域
1214
+ setTimeout(() => {
1215
+ if (options.nvueContext) {
1216
+ ctx.toTempFilePath(
1217
+ 0,
1218
+ 0,
1219
+ options.width,
1220
+ options.height,
1221
+ options.width,
1222
+ options.height,
1223
+ "",
1224
+ 1,
1225
+ function(res) {
1226
+ if (options.cbResult) {
1190
1227
  options.cbResult(res.tempFilePath)
1191
1228
  }
1192
1229
  }
1193
- },
1194
- fail: function (res) {
1195
- if (options.cbResult) {
1196
- options.cbResult(res)
1197
- }
1198
- },
1199
- complete: function () {
1200
- uni.hideLoading();
1201
- },
1202
- }, options.context);
1203
- }
1204
- }, options.text.length + 100);
1205
- });
1230
+ );
1231
+ } else {
1232
+ uni.canvasToTempFilePath({
1233
+ width: options.width,
1234
+ height: options.height,
1235
+ destWidth: options.width,
1236
+ destHeight: options.height,
1237
+ canvasId: options.canvasId,
1238
+ quality: Number(1),
1239
+ success: function (res) {
1240
+ if (options.cbResult) {
1241
+ // 由于官方还没有统一此接口的输出字段,所以先判定下 支付宝为 res.apFilePath
1242
+ if (!empty(res.tempFilePath)) {
1243
+ options.cbResult(res.tempFilePath)
1244
+ } else if (!empty(res.apFilePath)) {
1245
+ options.cbResult(res.apFilePath)
1246
+ } else {
1247
+ options.cbResult(res.tempFilePath)
1248
+ }
1249
+ }
1250
+ },
1251
+ fail: function (res) {
1252
+ if (options.cbResult) {
1253
+ options.cbResult(res)
1254
+ }
1255
+ },
1256
+ complete: function () {
1257
+ uni.hideLoading();
1258
+ },
1259
+ }, options.context);
1260
+ }
1261
+ }, options.text.length + 100);
1262
+ });
1263
+ }
1264
+ else{
1265
+ options.cbResult("")
1266
+ }
1267
+
1206
1268
  }, options.usingComponents ? 0 : 150);
1207
1269
  }
1208
1270
  createCanvas(this.options);
@@ -2,8 +2,12 @@
2
2
  <view class="u-qrcode" @longpress="longpress">
3
3
  <view class="u-qrcode__content" @click="preview">
4
4
  <!-- #ifndef APP-NVUE -->
5
- <canvas class="u-qrcode__canvas"
6
- :id="cid" :canvas-id="cid" :style="{ width: size + unit, height: size + unit }" />
5
+ <canvas
6
+ class="u-qrcode__canvas"
7
+ :id="cid"
8
+ :canvas-id="cid"
9
+ type="2d"
10
+ :style="{ width: size + unit, height: size + unit }" />
7
11
  <!-- #endif -->
8
12
  <!-- #ifdef APP-NVUE -->
9
13
  <gcanvas class="u-qrcode__canvas" ref="gcanvess"
@@ -14,11 +18,8 @@
14
18
  :style="{ width: size + unit, height: size + unit }">
15
19
  <up-loading-icon vertical :text="loadingText" textSize="14px"></up-loading-icon>
16
20
  </view>
17
- <!-- <image v-show="show" :src="result" :style="{ width: size + unit, height: size + unit }" /> -->
18
21
  </view>
19
- <!-- <up-action-sheet :actions="list" cancelText="取消"
20
- v-model:show="popupShow" @select="selectClick">
21
- </up-action-sheet> -->
22
+
22
23
  </view>
23
24
  </template>
24
25
 
@@ -120,7 +121,7 @@ export default {
120
121
  canvasObj: {}
121
122
  }
122
123
  },
123
- mounted: function () {
124
+ mounted(){
124
125
  // #ifdef APP-NVUE
125
126
  /*获取元素引用*/
126
127
  this.ganvas = this.$refs["gcanvess"]
@@ -135,7 +136,9 @@ export default {
135
136
  if (this.loadMake) {
136
137
  if (!this._empty(this.val)) {
137
138
  setTimeout(() => {
138
- this._makeCode()
139
+ setTimeout(()=>{
140
+ this._makeCode()
141
+ })
139
142
  }, 0);
140
143
  }
141
144
  }
@@ -162,6 +165,7 @@ export default {
162
165
  correctLevel: that.lv, // 容错级别
163
166
  image: that.icon, // 二维码图标
164
167
  imageSize: that.iconSize,// 二维码图标大小
168
+ that,
165
169
  cbResult: function (res) { // 生成二维码的回调
166
170
  that._result(res)
167
171
  },
@@ -250,7 +254,7 @@ export default {
250
254
  rt = false
251
255
  }
252
256
  return rt
253
- }
257
+ },
254
258
  },
255
259
  watch: {
256
260
  size: function (n, o) {
@@ -21,7 +21,7 @@
21
21
  * @property {String} activeColor 激活状态颜色 (默认 '#3c9cff' )
22
22
  * @property {String} inactiveColor 未激活状态颜色 (默认 '#969799' )
23
23
  * @property {String} activeIcon 激活状态的图标
24
- * @property {String} inactiveIcon 未激活状态图标
24
+ * @property {String} inactiveIcon 未激活状态图标
25
25
  * @property {Boolean} dot 是否显示点类型 (默认 false )
26
26
  * @example <u-steps current="0"><u-steps-item title="已出库" desc="10:35" ></u-steps-item></u-steps>
27
27
  */
@@ -85,6 +85,11 @@
85
85
  display: grid;
86
86
  grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
87
87
  /* #endif */
88
+
89
+ //微信小程序优化的比抖音的好 因此微信小程序使用flex布局
90
+ /* #ifdef MP-WEIXIN */
91
+ display: flex !important;
92
+ /* #endif */
88
93
  }
89
94
  }
90
95
  </style>
@@ -178,7 +178,14 @@
178
178
  },
179
179
  async mounted() {
180
180
  this.init()
181
+ this.windowResizeCallback = (res) => {
182
+ this.init()
183
+ }
184
+ uni.onWindowResize(this.windowResizeCallback)
181
185
  },
186
+ beforeUnmount() {
187
+ uni.offWindowResize(this.windowResizeCallback)
188
+ },
182
189
  emits: ['click', 'longPress', 'change', 'update:current'],
183
190
  methods: {
184
191
  addStyle,
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "id": "uview-plus",
3
3
  "name": "uview-plus",
4
4
  "displayName": "零云®uview-plus3.0重磅发布,全面的Vue3鸿蒙移动组件库。",
5
- "version": "3.4.38",
5
+ "version": "3.4.40",
6
6
  "description": "零云®uview-plus已兼容vue3,全面的组件和便捷的工具会让您信手拈来,如鱼得水。",
7
7
  "keywords": [
8
8
  "uview",