I have an array of objects that I display using FlatList .
In my parent component, I have a state isModalDeleteVisible
and a button that allows to change this state .
When I press the button (= that I change the state), the whole FlatList is rendering again (I see it at console.log()
which is redisplayed).
I understood that a change of state rerend the whole component; I also know that useCallback()
helps prevent this by memorizing a function . But in this specific situation I cannot prevent the re-rendering of FlatList
IndexScreen.js
:
...
const IndexScreen = () => {
const [isModalDeleteVisible, setModalDeleteVisible] = useState(false)
const onDelete = useCallback(
() => setModalDeleteVisible(!isModalDeleteVisible),
[isModalDeleteVisible]
)
const listRenderItem = ({ item, index }) => {
return (
<Children
item={item}
index={index}
/>
)
}
return (
<Template>
<Button
onPress={onDelete}
/>
<FlatList
data={dataList}
renderItem={listRenderItem}
keyExtractor={(item) => item.id}
/>
</Template>
)
}
export default IndexScreen
Children.js
:
...
const Children = ({ item }) => {
console.log(item.id)
return (
...
)
}
export default Children
CodePudding user response:
onDelete
callback should not get any dependencies and use the last state
const onDelete = useCallback(
() => setModalDeleteVisible(prev=>!prev),
[]
)
Not seeing any other reason for the whole return
to be rerendered beside Button
rerender accords onDelete
CodePudding user response:
In your case useCallback
only memoizes the function, which does nothing at preventing rendering FlatList
.
If you want to prevent FlatList
rerendering as long as its props don't change, then you should use React.memo()
for that.