Я новичок в hooks
и недавно начал использовать хуки в моих проектах React Native.
Я создаю простое приложение todo, используя AsyncStorage
. Сначала я инициализирую исходное состояние data
и setData
, используя useState
hook:
const [data, setData] = useState([]);
Есть две textInput
и кнопка отправки, которые я использую для сохранения данных в AsyncStorage. Вот функция saveData
:
const saveData = async () => {
const arrData = [{ name: 'vikrant', phone: 123456 }]; // [{ name, phone}] from the textInput
const storedData = await AsyncStorage.getItem('user');
const storedDataParsed = JSON.parse(storedData);
let newData = [];
if (storedData === null) {
// save
await AsyncStorage.setItem('user', JSON.stringify(arrData));
} else {
newData = [...storedDataParsed, user];
await AsyncStorage.setItem('user', JSON.stringify(newData));
}
setName('');
setPhone('');
Keyboard.dismiss();
};
Теперь я использую useEffect
, чтобы получить данные из AsyncStorage и установить их в состояние data
. Я использую данные для рендеринга текста на экране.
useEffect(() => {
retrieveData();
}, [data]);
const retrieveData = async () => {
try {
const valueString = await AsyncStorage.getItem('user');
const value = JSON.parse(valueString);
setData(value);
} catch (error) {
console.log(error);
}
};
Я использую [data]
в useEffect, так как я хочу перерисовывать свой компонент каждый раз, когда меняются данные, т.е. каждый раз, когда я сохраняю данные в AsyncStorage. Но это вызывает бесконечное l oop, так как setData
заставляет useEffect работать бесконечно.
Если я удаляю data
из []
, это не l oop, но мои данные в рендере один шаг позади. Поэтому всякий раз, когда я сохраняю данные, отображаются не текущие данные, а предыдущие.
Любое объяснение того, что я делаю здесь неправильно и как я могу это исправить?
Спасибо.