@mpxjs/webpack-plugin 2.10.17-beta.8 → 2.10.17-beta.9

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.
@@ -1,4 +1,4 @@
1
- import React, { forwardRef, useRef, useState, useEffect, useMemo, createElement, useImperativeHandle } from 'react';
1
+ import React, { forwardRef, useRef, useState, useEffect, useMemo, createElement, useImperativeHandle, useCallback } from 'react';
2
2
  import { SectionList, RefreshControl } from 'react-native';
3
3
  import useInnerProps, { getCustomEvent } from './getInnerListeners';
4
4
  import { extendObject, useLayout, useTransformStyle } from './utils';
@@ -44,6 +44,41 @@ const RecycleView = forwardRef((props = {}, ref) => {
44
44
  const scrollViewRef = useRef(null);
45
45
  const indexMap = useRef({});
46
46
  const reverseIndexMap = useRef({});
47
+ // 缓存 getGeneric 的结果,避免每次都创建新的组件引用
48
+ const genericComponentsCache = useRef({});
49
+ const getCachedGeneric = useCallback((generichash, generickey) => {
50
+ if (!generichash || !generickey)
51
+ return null;
52
+ const cacheKey = `${generichash}_${generickey}`;
53
+ if (!genericComponentsCache.current[cacheKey]) {
54
+ genericComponentsCache.current[cacheKey] = getGeneric(generichash, generickey);
55
+ }
56
+ return genericComponentsCache.current[cacheKey];
57
+ }, []);
58
+ // 使用 ref 存储最新的 props,避免渲染函数引用变化导致组件重新挂载
59
+ const propsRef = useRef({ generichash, genericrecycleItem, genericsectionHeader, genericListHeader, listHeaderData, useListHeader });
60
+ propsRef.current = { generichash, genericrecycleItem, genericsectionHeader, genericListHeader, listHeaderData, useListHeader };
61
+ // 创建稳定的渲染函数引用,使用 getCachedGeneric 确保组件引用稳定
62
+ const stableItemRenderer = useCallback(({ item }) => {
63
+ const { generichash: hash, genericrecycleItem: key } = propsRef.current;
64
+ const ItemComponent = getCachedGeneric(hash, key);
65
+ return ItemComponent ? createElement(ItemComponent, { itemData: item }) : null;
66
+ }, [getCachedGeneric]);
67
+ const stableSectionHeaderRenderer = useCallback((sectionData) => {
68
+ if (!sectionData.section.hasSectionHeader)
69
+ return null;
70
+ const { generichash: hash, genericsectionHeader: key } = propsRef.current;
71
+ const SectionHeaderComponent = getCachedGeneric(hash, key);
72
+ return SectionHeaderComponent ? createElement(SectionHeaderComponent, { itemData: sectionData.section.headerData }) : null;
73
+ }, [getCachedGeneric]);
74
+ // 创建稳定的 ListHeader 渲染函数,与 section-header 和 item 的处理方式一致
75
+ const getStableListHeader = useCallback(() => {
76
+ const { generichash: hash, genericListHeader: key, listHeaderData: data, useListHeader: use } = propsRef.current;
77
+ if (!use || !hash || !key)
78
+ return null;
79
+ const ListHeaderComponent = getCachedGeneric(hash, key);
80
+ return ListHeaderComponent ? createElement(ListHeaderComponent, { listHeaderData: data }) : null;
81
+ }, [getCachedGeneric]);
47
82
  const { hasSelfPercent, setWidth, setHeight } = useTransformStyle(style, { enableVar, externalVarContext, parentFontSize, parentWidth, parentHeight });
48
83
  const { layoutRef, layoutStyle, layoutProps } = useLayout({ props, hasSelfPercent, setWidth, setHeight, nodeRef: scrollViewRef });
49
84
  useEffect(() => {
@@ -216,7 +251,7 @@ const RecycleView = forwardRef((props = {}, ref) => {
216
251
  itemLayouts: layouts,
217
252
  getItemLayout: (data, index) => layouts[index]
218
253
  };
219
- }, [convertedListData, useListHeader]);
254
+ }, [convertedListData, useListHeader, itemHeight.value, itemHeight.getter, sectionHeaderHeight.value, sectionHeaderHeight.getter, listHeaderHeight.value, listHeaderHeight.getter]);
220
255
  const scrollAdditionalProps = extendObject({
221
256
  alwaysBounceVertical: false,
222
257
  alwaysBounceHorizontal: false,
@@ -257,10 +292,10 @@ const RecycleView = forwardRef((props = {}, ref) => {
257
292
  return createElement(SectionList, extendObject({
258
293
  style: [{ height, width }, style, layoutStyle],
259
294
  sections: convertedListData,
260
- renderItem: getItemRenderer(generichash, genericrecycleItem),
295
+ renderItem: stableItemRenderer,
261
296
  getItemLayout: getItemLayout,
262
- ListHeaderComponent: useListHeader ? getListHeaderComponent(generichash, genericListHeader, listHeaderData) : null,
263
- renderSectionHeader: getSectionHeaderRenderer(generichash, genericsectionHeader),
297
+ ListHeaderComponent: getStableListHeader(),
298
+ renderSectionHeader: stableSectionHeaderRenderer,
264
299
  refreshControl: refresherEnabled
265
300
  ? React.createElement(RefreshControl, {
266
301
  onRefresh: onRefresh,
@@ -1,5 +1,5 @@
1
- import React, { forwardRef, useRef, useState, useEffect, useMemo, createElement, useImperativeHandle } from 'react'
2
- import { SectionList, FlatList, RefreshControl, NativeSyntheticEvent, NativeScrollEvent } from 'react-native'
1
+ import React, { forwardRef, useRef, useState, useEffect, useMemo, createElement, useImperativeHandle, useCallback } from 'react'
2
+ import { SectionList, RefreshControl, NativeSyntheticEvent, NativeScrollEvent } from 'react-native'
3
3
  import useInnerProps, { getCustomEvent } from './getInnerListeners'
4
4
  import { extendObject, useLayout, useTransformStyle } from './utils'
5
5
  interface ListItem {
@@ -135,6 +135,45 @@ const RecycleView = forwardRef<any, RecycleViewProps>((props = {}, ref) => {
135
135
 
136
136
  const reverseIndexMap = useRef<{ [key: string]: number }>({})
137
137
 
138
+ // 缓存 getGeneric 的结果,避免每次都创建新的组件引用
139
+ const genericComponentsCache = useRef<{ [key: string]: any }>({})
140
+ const getCachedGeneric = useCallback((generichash: string, generickey: string) => {
141
+ if (!generichash || !generickey) return null
142
+
143
+ const cacheKey = `${generichash}_${generickey}`
144
+ if (!genericComponentsCache.current[cacheKey]) {
145
+ genericComponentsCache.current[cacheKey] = getGeneric(generichash, generickey)
146
+ }
147
+ return genericComponentsCache.current[cacheKey]
148
+ }, [])
149
+
150
+ // 使用 ref 存储最新的 props,避免渲染函数引用变化导致组件重新挂载
151
+ const propsRef = useRef({ generichash, genericrecycleItem, genericsectionHeader, genericListHeader, listHeaderData, useListHeader })
152
+
153
+ propsRef.current = { generichash, genericrecycleItem, genericsectionHeader, genericListHeader, listHeaderData, useListHeader }
154
+
155
+ // 创建稳定的渲染函数引用,使用 getCachedGeneric 确保组件引用稳定
156
+ const stableItemRenderer = useCallback(({ item }: { item: any }) => {
157
+ const { generichash: hash, genericrecycleItem: key } = propsRef.current
158
+ const ItemComponent = getCachedGeneric(hash, key)
159
+ return ItemComponent ? createElement(ItemComponent, { itemData: item }) : null
160
+ }, [getCachedGeneric])
161
+
162
+ const stableSectionHeaderRenderer = useCallback((sectionData: { section: Section }) => {
163
+ if (!sectionData.section.hasSectionHeader) return null
164
+ const { generichash: hash, genericsectionHeader: key } = propsRef.current
165
+ const SectionHeaderComponent = getCachedGeneric(hash, key)
166
+ return SectionHeaderComponent ? createElement(SectionHeaderComponent, { itemData: sectionData.section.headerData }) : null
167
+ }, [getCachedGeneric])
168
+
169
+ // 创建稳定的 ListHeader 渲染函数,与 section-header 和 item 的处理方式一致
170
+ const getStableListHeader = useCallback(() => {
171
+ const { generichash: hash, genericListHeader: key, listHeaderData: data, useListHeader: use } = propsRef.current
172
+ if (!use || !hash || !key) return null
173
+ const ListHeaderComponent = getCachedGeneric(hash, key)
174
+ return ListHeaderComponent ? createElement(ListHeaderComponent, { listHeaderData: data }) : null
175
+ }, [getCachedGeneric])
176
+
138
177
  const {
139
178
  hasSelfPercent,
140
179
  setWidth,
@@ -327,7 +366,7 @@ const RecycleView = forwardRef<any, RecycleViewProps>((props = {}, ref) => {
327
366
  itemLayouts: layouts,
328
367
  getItemLayout: (data: any, index: number) => layouts[index]
329
368
  }
330
- }, [convertedListData, useListHeader])
369
+ }, [convertedListData, useListHeader, itemHeight.value, itemHeight.getter, sectionHeaderHeight.value, sectionHeaderHeight.getter, listHeaderHeight.value, listHeaderHeight.getter])
331
370
 
332
371
  const scrollAdditionalProps = extendObject(
333
372
  {
@@ -379,10 +418,10 @@ const RecycleView = forwardRef<any, RecycleViewProps>((props = {}, ref) => {
379
418
  {
380
419
  style: [{ height, width }, style, layoutStyle],
381
420
  sections: convertedListData,
382
- renderItem: getItemRenderer(generichash, genericrecycleItem),
421
+ renderItem: stableItemRenderer,
383
422
  getItemLayout: getItemLayout,
384
- ListHeaderComponent: useListHeader ? getListHeaderComponent(generichash, genericListHeader, listHeaderData) : null,
385
- renderSectionHeader: getSectionHeaderRenderer(generichash, genericsectionHeader),
423
+ ListHeaderComponent: getStableListHeader(),
424
+ renderSectionHeader: stableSectionHeaderRenderer,
386
425
  refreshControl: refresherEnabled
387
426
  ? React.createElement(RefreshControl, {
388
427
  onRefresh: onRefresh,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mpxjs/webpack-plugin",
3
- "version": "2.10.17-beta.8",
3
+ "version": "2.10.17-beta.9",
4
4
  "description": "mpx compile core",
5
5
  "keywords": [
6
6
  "mpx"