Как сохранить значения отдельных состояний с помощью React Native

#javascript #reactjs #react-native #asyncstorage #persist

Вопрос:

У меня есть кнопка в моем родном приложении react, которая переключает значение состояния с true на false:

 const [isLearned, setIsLearned] = useState(false);

addRemoveCardToLearned = () => {
  setIsLearned(!isLearned);
};
 

Эту кнопку можно использовать на нескольких картах в приложении, поэтому каждая карта всегда будет иметь свое собственное состояние isLearned , либо истинное, либо ложное. Что мне нужно сделать, так это сохранить значение состояния каждой отдельной карты после обновления страницы. Я пробовал использовать AsyncStorage с помощью крючка useEffect:

 useEffect(() => {
  AsyncStorage.setItem('isLearned', JSON.stringify(isLearned));
}, [isLearned]);

useEffect(() => {
  const storeIsLearned = Boolean(AsyncStorage.getItem('isLearned'));
  setIsLearned(storeIsLearned);
}, []);
 

Но что это делает, так это изменяет значение состояния всех карт сразу. Я также попытался вставить функцию получения в код для моей кнопки:

 addRemoveCardToLearned = () => {
  setIsLearned(!isLearned);

  AsyncStorage.getItem('isLearned').then((isLearned) => {
    console.log(isLearned);
  });
};
 

Но это просто записывает каждую запись как true .

Поскольку каждая карта будет иметь разное значение состояния, есть ли способ сохранить каждую из них по отдельности?

Ответ №1:

Асинхронное хранилище является глобальным, поэтому оно обновляет все карты, потому что все карты ссылаются на одну пару валиев с выученным ключом в асинхронном хранилище. Добавление уникального кода в каждое асинхронное хранилище при сохранении состояния может решить проблему.

 <FirstComponent uniqueCode='001' />
<FirstComponent uniqueCode='002' />
 

префикс uniqueCode prop к имени ключа при сохранении данных в асинхронном хранилище, а также при чтении из асинхронного хранилища.

 useEffect(() => {   AsyncStorage.setItem(`${props.uniqueCode}_isLearned`, 
JSON.stringify(isLearned)); }, [isLearned]);

useEffect(() => {   const storeIsLearned = 
Boolean(AsyncStorage.getItem(`${props.uniqueCode}_isLearned`));   
setIsLearned(storeIsLearned); }, []);