如何从存储中更新 React Native 功能组件状态

Posted

技术标签:

【中文标题】如何从存储中更新 React Native 功能组件状态【英文标题】:How to Update React Native Functional Component State from Storage 【发布时间】:2021-12-24 05:51:14 【问题描述】:

我有这个组件正在尝试使用从存储中加载的对象来设置其状态:

import React from "react";
import  ReactElement  from "react-native/node_modules/@types/react";
import  useState  from "react";
import  Text, View  from "react-native";
import MyClass from "./MyClass";
import AsyncStorage from "@react-native-async-storage/async-storage";

export default function FunCompWithState(): ReactElement 
  const [myClass, setMyClass] = useState<MyClass>(new MyClass());

  const promised = loadFromStorage();

  // I've also try calling this in a useEffect()
  promised.then(c => setMyClass(c));

  return (
    <View>
      <Text>myClass.getTitle()</Text>
      <Text>myClass.getValue()</Text>
    </View>
  );


async function loadFromStorage(): Promise<MyClass | null> 
  const jsonValue = await AsyncStorage.getItem("@main.myClass");
  console.log(jsonValue);
  if (jsonValue != null) 
    return Promise.resolve(JSON.parse(jsonValue));
  
  return Promise.resolve(null);

在我的测试中,这是我得到的:

import * as React from "react";
import  act, render  from "@testing-library/react-native";
import FunCompWithState from "../FunCompWithState";
import MyClass from "../MyClass";
import AsyncStorage from "@react-native-async-storage/async-storage";

async function setup() 
    const storedClass = new MyClass();
    storedClass.setTitle("Stored Class");
    storedClass.setValue(8);
    await AsyncStorage.setItem("@main.myClass", JSON.stringify(storedClass));


it("Render FunCompWithState", () => 
  act(() => 
      setup();
  );

  const  debug  = render(<FunCompWithState />);
  debug();
);

当我运行测试时,我放置在loadFromStorage 函数中的console.log(jsonValue) 输出正确的值:"title":"Stored Class","value":8。但是,渲染的组件似乎没有正确的值:

    <View>
      <Text>

      </Text>
      <Text>
        1
      </Text>
    </View>

我希望看到这个:

    <View>
      <Text>
        Stored Class
      </Text>
      <Text>
        8
      </Text>
    </View>

那么我怎样才能在渲染组件中获得正确的值呢?这是我更新组件状态的问题,还是我测试组件的问题?

【问题讨论】:

【参考方案1】:

为什么要在这里使用promise? 看起来应该更复杂。如果您的 getAsyncItem 不为 null ,您就不能在函数中使用 setState 吗?

  async function loadFromStorage() 
    const jsonValue = await AsyncStorage.getItem("@main.myClass");
    console.log(jsonValue);
    if (jsonValue != null) 
      setMyClass(JSON.parse(jsonValue));
    
  

【讨论】:

嗯。我可以尝试这样的事情。事实上,我已经对我的代码进行了一些抽象,我实际上希望有一个调用AsyncStorage 的通用函数,并在多个组件中使用该通用函数,而不是在我的代码库中的多个位置调用AsyncStorage。但是,我可以将 setter 传递给我的函数,而不是从我的函数中检索对象。如果这是标准做法,我会试一试。 这似乎对我不起作用。为什么它应该工作对我来说是有道理的,但不幸的是它不是。 好吧,如果你有一个状态并且你想避免重复,你可以制作一个自定义钩子并从你的组件中调用它。 是的,这基本上就是我正在做的。

以上是关于如何从存储中更新 React Native 功能组件状态的主要内容,如果未能解决你的问题,请参考以下文章

从本机代码存储时,React Native AsyncStorage 无法查看来自 javascript 的更新数据

如何在 React Native 中访问、更新和保存数组索引?

react native - 如何在元组数组中使用 React Hooks?

将原生 iOS 应用的数据迁移到 React Native 应用的异步存储

我如何在 react-native 聊天应用程序中使用 GraphQl 订阅从 GraphQl 查询中获取实时更新

从 React到React Native