You may want to wrap useEffect and make it ignore the first change.
const useEffectIgnoringFirstChange = (fn, deps) => { const [changeCount, setChangeCount]firstCallRef = useStateuseRef(0true); useEffect(() => { setChangeCountif (pfirstCallRef.current) =>{ p++) firstCallRef.current = false; if (changeCount<1) return; }; fn() }, deps); } const useStore = () => { const [logs, setLogs] = useState([]) useEffect(() => { AsyncStorage.getItem("logs").then((newLogs) => setLogs(newLogs)); }, []) useEffectIgnoringFirstChange(() => { //Don't want to setItem on initial load or when `logs` was just loaded. AsyncStorage.setItem("logs", JSON.stringify(logs)); }, [logs]) const addLog = (newText) => { setLogs(logs => [ {text: newText, createdAt: new Date().getTime()}, ...logs, ]); } return { logs, addLog, //...many other functions that update logs } }