@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:
|
|
295
|
+
renderItem: stableItemRenderer,
|
|
261
296
|
getItemLayout: getItemLayout,
|
|
262
|
-
ListHeaderComponent:
|
|
263
|
-
renderSectionHeader:
|
|
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,
|
|
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:
|
|
421
|
+
renderItem: stableItemRenderer,
|
|
383
422
|
getItemLayout: getItemLayout,
|
|
384
|
-
ListHeaderComponent:
|
|
385
|
-
renderSectionHeader:
|
|
423
|
+
ListHeaderComponent: getStableListHeader(),
|
|
424
|
+
renderSectionHeader: stableSectionHeaderRenderer,
|
|
386
425
|
refreshControl: refresherEnabled
|
|
387
426
|
? React.createElement(RefreshControl, {
|
|
388
427
|
onRefresh: onRefresh,
|