import React, { useState, useMemo } from 'react';
import { View, Text, Button, FlatList, StyleSheet } from 'react-native';
const NumberItem = React.memo(({ value }) => {
console.log('Rendering item:', value);
return <Text style={styles.item}>{value}</Text>;
});
export default function MemoDemoScreen() {
const [numbers, setNumbers] = useState([1, 2, 3]);
const sum = useMemo(() => {
console.log('Calculating sum');
return numbers.reduce((acc, val) => acc + val, 0);
}, [numbers]);
const addRandomNumber = () => {
const randomNum = Math.floor(Math.random() * 100) + 1;
setNumbers(prev => [...prev, randomNum]);
};
return (
<View style={styles.container}>
<Text style={styles.title}>Numbers:</Text>
<FlatList
data={numbers}
keyExtractor={(item, index) => index.toString()}
renderItem={({ item }) => <NumberItem value={item} />}
/>
<Text style={styles.sum}>Sum: {sum}</Text>
<Button title="Add Random Number" onPress={addRandomNumber} />
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 20 },
title: { fontSize: 20, marginBottom: 10 },
item: { fontSize: 18, paddingVertical: 4 },
sum: { fontSize: 18, marginVertical: 20 }
});We wrapped the NumberItem component with React.memo so it only re-renders when its value prop changes. This avoids unnecessary re-renders when the sum changes.
The sum is calculated using useMemo which caches the result and only recalculates when the numbers array changes. This improves performance by skipping sum calculation on unrelated renders.
The addRandomNumber function adds a new random number to the list, triggering a re-render and recalculation of the sum.
This example shows how React.memo and useMemo help optimize React Native apps by reducing unnecessary work.