@dolphinweex/weex-harmony 0.1.76 → 0.1.77

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": "@dolphinweex/weex-harmony",
3
- "version": "0.1.76",
3
+ "version": "0.1.77",
4
4
  "description": "weex harmony adapter",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -40,6 +40,9 @@ export default {
40
40
  height: '0px',
41
41
  _resizeObserver: null,
42
42
  _heightCheckTimer: null,
43
+ _weexRoot: null,
44
+ _useChildrenTotalHeight: false,
45
+ _parentElement: null, // 符合条件的父级元素
43
46
  };
44
47
  },
45
48
  components: {
@@ -124,6 +127,16 @@ export default {
124
127
  return null;
125
128
  };
126
129
  this._wrapperEl = findWrapperFromParent(); // 保存容器引用
130
+
131
+ // 直接获取父级元素,如果 hmcomponentindex 属性存在且值为 midea-common-weex-view,则保存引用
132
+ const parentEl = this.$el;
133
+ if (parentEl) {
134
+ const hmComponentIndex = parentEl.getAttribute('hmcomponentindex');
135
+ if (hmComponentIndex === 'midea-common-weex-view') {
136
+ this._parentElement = parentEl;
137
+ }
138
+ }
139
+
127
140
  // 优化手势处理性能
128
141
  this._rafId = null;
129
142
  this._pendingGesture = null;
@@ -167,6 +180,40 @@ export default {
167
180
  }
168
181
  },
169
182
 
183
+ // 计算 weex-root 所有子元素的高度总和
184
+ calculateWeexRootChildrenHeight(weexRoot) {
185
+ if (!weexRoot || !weexRoot.children || weexRoot.children.length === 0) {
186
+ return 0;
187
+ }
188
+
189
+ let totalHeight = 0;
190
+ const children = Array.from(weexRoot.children);
191
+
192
+ // 方法1: 计算所有子元素的 bottom 位置的最大值,减去第一个子元素的 top 位置
193
+ if (children.length > 0) {
194
+ const firstChildRect = children[0].getBoundingClientRect();
195
+ const rootRect = weexRoot.getBoundingClientRect();
196
+ let maxBottom = firstChildRect.bottom;
197
+
198
+ children.forEach((child) => {
199
+ const rect = child.getBoundingClientRect();
200
+ maxBottom = Math.max(maxBottom, rect.bottom);
201
+ });
202
+
203
+ totalHeight = maxBottom - rootRect.top;
204
+ }
205
+
206
+ // 如果方法1计算出的高度为0或太小,则累加所有子元素的高度
207
+ if (totalHeight <= 0) {
208
+ children.forEach((child) => {
209
+ const childHeight = child.offsetHeight || child.clientHeight || child.scrollHeight || 0;
210
+ totalHeight += childHeight;
211
+ });
212
+ }
213
+
214
+ return totalHeight;
215
+ },
216
+
170
217
  // 监听 iframe 内 .weex-root 第一个子元素或 .weex-scroller-inner 的高度
171
218
  startWeexRootHeightMonitoring() {
172
219
  // 尝试多次查找元素(因为 iframe 内容可能还在加载)
@@ -189,8 +236,9 @@ export default {
189
236
  const iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
190
237
  let targetElement = null;
191
238
  let elementDesc = '';
239
+ let useChildrenTotalHeight = false; // 标记是否使用子元素总高度
192
240
 
193
- // 查找 .weex-root 的第一个子元素
241
+ // 查找 .weex-root
194
242
  const weexRoot = iframeDocument.querySelector('.weex-root');
195
243
  const weexRootFirstChild = (weexRoot && weexRoot.children.length > 0) ? weexRoot.children[0] : null;
196
244
 
@@ -199,20 +247,29 @@ export default {
199
247
 
200
248
  // 如果两个都找到了,比较高度,谁大用谁
201
249
  if (weexRootFirstChild && weexScrollerInner) {
202
- const rootHeight = weexRootFirstChild.offsetHeight || weexRootFirstChild.clientHeight || 0;
250
+ // 计算 weex-root 所有子元素的总高度
251
+ const rootChildrenTotalHeight = this.calculateWeexRootChildrenHeight(weexRoot);
252
+ const rootFirstChildHeight = weexRootFirstChild.offsetHeight || weexRootFirstChild.clientHeight || 0;
253
+ // 使用子元素总高度和第一个子元素高度的较大值
254
+ const rootHeight = Math.max(rootChildrenTotalHeight, rootFirstChildHeight);
203
255
  const scrollerHeight = weexScrollerInner.offsetHeight || weexScrollerInner.clientHeight || 0;
204
256
 
205
257
  if (rootHeight >= scrollerHeight) {
206
258
  targetElement = weexRootFirstChild;
207
- elementDesc = `.weex-root 的第一个子元素 (高度: ${rootHeight}px)`;
259
+ useChildrenTotalHeight = rootChildrenTotalHeight > rootFirstChildHeight;
260
+ elementDesc = useChildrenTotalHeight
261
+ ? `.weex-root 的所有子元素总高度 (${rootChildrenTotalHeight}px)`
262
+ : `.weex-root 的第一个子元素 (高度: ${rootHeight}px)`;
208
263
  } else {
209
264
  targetElement = weexScrollerInner;
210
265
  elementDesc = `.weex-scroller-inner (高度: ${scrollerHeight}px)`;
211
266
  }
212
267
  } else if (weexRootFirstChild) {
213
- // 只找到 .weex-root 的第一个子元素
268
+ // 只找到 .weex-root 的第一个子元素,使用所有子元素的总高度
214
269
  targetElement = weexRootFirstChild;
215
- elementDesc = '.weex-root 的第一个子元素';
270
+ useChildrenTotalHeight = true;
271
+ const rootChildrenTotalHeight = this.calculateWeexRootChildrenHeight(weexRoot);
272
+ elementDesc = `.weex-root 的所有子元素总高度 (${rootChildrenTotalHeight}px)`;
216
273
  } else if (weexScrollerInner) {
217
274
  // 只找到 .weex-scroller-inner
218
275
  targetElement = weexScrollerInner;
@@ -223,6 +280,10 @@ export default {
223
280
  if (targetElement) {
224
281
  console.log(`找到 ${elementDesc},开始监听高度变化`, targetElement);
225
282
 
283
+ // 保存 weexRoot 引用和是否使用子元素总高度的标记
284
+ this._weexRoot = weexRoot;
285
+ this._useChildrenTotalHeight = useChildrenTotalHeight;
286
+
226
287
  // 清除定时器,找到了就不再尝试
227
288
  clearInterval(this._heightCheckTimer);
228
289
 
@@ -230,10 +291,24 @@ export default {
230
291
  this.updateIframeHeightFromElement(targetElement);
231
292
 
232
293
  // 使用 ResizeObserver 监听元素高度变化
233
- this._resizeObserver = new ResizeObserver(() => {
234
- this.updateIframeHeightFromElement(targetElement);
235
- });
236
- this._resizeObserver.observe(targetElement);
294
+ // 如果使用子元素总高度,需要监听 weexRoot 的所有子元素
295
+ if (useChildrenTotalHeight && weexRoot) {
296
+ // 监听 weexRoot 本身的变化
297
+ this._resizeObserver = new ResizeObserver(() => {
298
+ this.updateIframeHeightFromElement(targetElement);
299
+ });
300
+ this._resizeObserver.observe(weexRoot);
301
+
302
+ // 同时监听所有子元素的变化
303
+ Array.from(weexRoot.children).forEach((child) => {
304
+ this._resizeObserver.observe(child);
305
+ });
306
+ } else {
307
+ this._resizeObserver = new ResizeObserver(() => {
308
+ this.updateIframeHeightFromElement(targetElement);
309
+ });
310
+ this._resizeObserver.observe(targetElement);
311
+ }
237
312
 
238
313
  } else if (attempts >= maxAttempts) {
239
314
  clearInterval(this._heightCheckTimer);
@@ -252,8 +327,17 @@ export default {
252
327
  updateIframeHeightFromElement(element) {
253
328
  if (!element) return;
254
329
 
255
- // 获取元素的实际高度
256
- const elementHeight = element.offsetHeight || element.clientHeight || element.scrollHeight;
330
+ let elementHeight = 0;
331
+
332
+ // 如果标记了使用子元素总高度,且 weexRoot 存在,计算所有子元素的总高度
333
+ if (this._useChildrenTotalHeight && this._weexRoot) {
334
+ elementHeight = this.calculateWeexRootChildrenHeight(this._weexRoot);
335
+ }
336
+
337
+ // 如果子元素总高度为0或未使用,则使用元素本身的高度
338
+ if (elementHeight <= 0) {
339
+ elementHeight = element.offsetHeight || element.clientHeight || element.scrollHeight;
340
+ }
257
341
 
258
342
  if (elementHeight > 0) {
259
343
  // 限制最大高度,防止死循环
@@ -289,7 +373,13 @@ export default {
289
373
  if (this.height !== newHeight) {
290
374
  this.height = newHeight;
291
375
  console.log(`iframe 高度已更新: ${finalHeight}px -> ${newHeight} (embedId: ${this.embedId}, max: ${maxHeight}px)`);
376
+ // 如果父级元素存在且符合条件,也给父级元素设置高度
377
+ if (this._parentElement) {
378
+ this._parentElement.style.height = `${finalHeight}px`;
379
+ }
292
380
  }
381
+
382
+
293
383
  }
294
384
  },
295
385
  handleGestureBubble(gestureData) {
@@ -349,6 +439,10 @@ export default {
349
439
  this._heightCheckTimer = null;
350
440
  }
351
441
 
442
+ // 清理引用
443
+ this._weexRoot = null;
444
+ this._useChildrenTotalHeight = false;
445
+
352
446
  // 清理RAF避免内存泄漏
353
447
  if (this._rafId) {
354
448
  cancelAnimationFrame(this._rafId);
@@ -56,17 +56,13 @@
56
56
  >
57
57
  {{ item.label }}
58
58
  </div>
59
- <button
60
- class="edit-btn"
59
+ <img
61
60
  @click.stop.prevent="() => onEditClick(item, index)"
62
- >
63
- <img
64
- class="edit-icon"
65
- :src="'data:image/png;base64,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'"
66
- :style="{ width: scalePx(data.editBtnSize, 24) + 'px', height: scalePx(data.editBtnSize, 24) + 'px' }"
67
- alt="编辑"
68
- />
69
- </button>
61
+ class="edit-icon"
62
+ :src="'data:image/png;base64,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'"
63
+ :style="{ width: scalePx(data.editBtnSize, 12) + 'px', height: scalePx(data.editBtnSize, 12) + 'px' }"
64
+ alt="编辑"
65
+ />
70
66
  </div>
71
67
  </div>
72
68
  </div>
@@ -463,7 +459,6 @@
463
459
  font-weight:300
464
460
  }
465
461
  .label {
466
- width: 100%;
467
462
  text-align: center;
468
463
  white-space: nowrap;
469
464
  overflow: hidden;
@@ -473,15 +468,11 @@
473
468
  width: 100%;
474
469
  display: flex;
475
470
  align-items: center;
471
+ flex-direction: row;
472
+ justify-content: center;
476
473
  gap: 8px;
477
474
  }
478
- .edit-btn {
479
- margin-left: auto;
480
- padding: 4px 8px;
481
- border: none;
482
- border-radius: 4px;
483
- background: #f5f5f5;
484
- color: #333;
475
+ .edit-icon {
485
476
  }
486
477
  .drag-clone {
487
478
  box-sizing: border-box;