我试图找出尽可能多的方法来优化 flatlist,因为我的 flatlist 组件抱怨我的 flatlist 项目需要太长时间来呈现(我已经在使用 removeClippedSubviews、windowSize、maxToRenderPerBatch、React.memo 等)。
用 useCallback 包装渲染函数是个好主意吗?
例如,假设我最初具有表单中的函数组件:
const FlatListItem = ({ color1, color2, color3, color4 }) => {
function renderViewWithColorLogic(color) {
// do some computationally heavy process
// ...
return <View>{/* some components */}</View>;
}
return (
<View>
{renderViewWithColorLogic(color1)}
{renderViewWithColorLogic(color2)}
{renderViewWithColorLogic(color3)}
{renderViewWithColorLogic(color4)}
</View>
);
};
如果我使用 useCallback 将渲染函数包装为:
const FlatListItem = ({ color1, color2, color3, color4 }) => {
function _renderViewWithColorLogic(color) {
// do some computationally heavy process
// ...
return <View>{/* some components */}</View>;
}
const renderViewWithColorLogic1 = useCallback(()=>_renderViewWithColorLogic(color1), [color1])
const renderViewWithColorLogic2 = useCallback(()=>_renderViewWithColorLogic(color2), [color2])
const renderViewWithColorLogic3 = useCallback(()=>_renderViewWithColorLogic(color3), [color3])
const renderViewWithColorLogic4 = useCallback(()=>_renderViewWithColorLogic(color4), [color4])
return (
<View>
{renderViewWithColorLogic1()}
{renderViewWithColorLogic2()}
{renderViewWithColorLogic3()}
{renderViewWithColorLogic4()}
</View>
);
};
它会增强 flatlist 的性能吗?任何其他优化 flatlist 的建议也将不胜感激。
就安德烈斯所说,我认为通过一些计算实现平面列表项组件的更好方法如下:
const FlatListItem = ({ color1, color2, color3, color4 }) => (
const viewWithColorLogic1 = useMemo(()=>_renderViewWithColorLogic(color1), [color1]);
const viewWithColorLogic2 = useMemo(()=>_renderViewWithColorLogic(color2), [color2]);
const viewWithColorLogic3 = useMemo(()=>_renderViewWithColorLogic(color3), [color3]);
const viewWithColorLogic4 = useMemo(()=>_renderViewWithColorLogic(color4), [color4]);
return (
<View>
{viewWithColorLogic1}
{viewWithColorLogic2}
{viewWithColorLogic3}
{viewWithColorLogic4}
</View>
);
);
function renderViewWithColorLogic(color) {
// do some computationally heavy process
// ...
return <View>{/* some components */}</View>;
}