React Native 我无法使用 AsyncStorage 存储数组

React Native I can not store an array with AsyncStorage

我是 React Native 的新手,我正在尝试在 ReactNative 中使用 AsyncStorage 存储和获取数组。

我有两个问题。

首先,不知道为什么,当我存储数据时,它只在第二次起作用,但我首先调用了useState的集合。

const handleAddTask = () => {
    Keyboard.dismiss();
    setTaskItems([...taskItems, task]);
    storeData(taskItems);
  };

其次,如何调用getData函数获取所有数据并显示出来?在 ReactNative 中是否有类似 .onInit、.onInitialize... 的东西?这是我的完整代码

const [task, setTask] = useState();
const [taskItems, setTaskItems] = useState([]);

  const handleAddTask = () => {
    Keyboard.dismiss();
    setTaskItems([...taskItems, task]);
    storeData(taskItems);
  };

  const completeTask = (index) => {
    var itemsCopy = [...taskItems];
    itemsCopy.splice(index, 1);
    setTaskItems(itemsCopy);
    storeData(taskItems);
  }

  const storeData = async (value) => {
    try {
      await AsyncStorage.setItem('@tasks', JSON.stringify(value))
      console.log('store', JSON.stringify(taskItems));
    } catch (e) {
      console.log('error');
    }
  }

  const getData = async () => {
    try {
      const value = await AsyncStorage.getItem('@tasks')
      if(value !== null) {
        console.log('get', JSON.parse(value));
      } 
    } catch(e) {
      console.log('error get');
    }
  }

即使您在将新数据保存到本地存储之前更新状态 setTaskItems([...taskItems, task])storeData(taskItems) 也会在状态更新和保存旧状态数据之前执行。

重构 handleAddTask 如下。

  const handleAddTask = () => {
   Keyboard.dismiss();

const newTaskItems = [...taskItems, task]
    setTaskItems(newTaskItems);
    storeData(newTaskItems);
  };

在 React 中更新状态不是很直观。它不是异步的,也不能等待。然而,它也没有立即完成 - 它被放入一个队列中,React 根据自己的规范进行优化。

这就是为什么 BYIRINGIRO Emmanuel 的答案是正确的,并且是在函数内部使用状态的最简单方法。如果你有一个状态更新,你需要传递到多个地方,将它设置为你函数中的一个变量,然后使用它。

如果您需要对组件内部的状态更新做出反应,请使用 useEffect 挂钩,并将状态变量添加到其依赖项数组中。只要状态变量发生变化,useEffect 中的函数就会 运行。