首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setState UI不更新UI

setState UI不更新UI
EN

Stack Overflow用户
提问于 2022-05-13 09:14:16
回答 1查看 45关注 0票数 1

我试图在UseEffect中获取多个端点,并根据结果在UI上显示数据(化身、用户名等)

问题是,在fetch()调用useEffect中接收到的数据实际上返回了正确的数据,但是当试图在UI代码中访问它时,它将不会出现。

正如您在我的代码中所看到的,我有isLoading状态,但我觉得then操作并没有真正等到响应出现。加载屏幕将显示0.5秒,但当正常屏幕弹出,用户名,化身等是空的。

那么,我如何使UI等待直到useEffect完全加载了数据,然后显示它呢?

UserProfile.tsx

代码语言:javascript
复制
  React.useEffect(() => {
    AsyncStorage.getItem(LOGGED_IN_USER).then((userSteamID) =>
      fetch(USER_PROFILE + userSteamID)
        .then((response) => response.json())
        .then((json) => json.steamId)
        .then((steamId) => {
          fetch(USER_INVENTORY + steamId)
            .then((response) => response.json())
            .then((json) => {
              console.log(json);
              setProfileInfo(json);
              setSteamID(json.steamId);
              setInventoryValue(json.value);
            })
            .catch((err) => alert(err))
            .finally(() => setLoading(false));
        })
    );
  }, []);

之后试着使用它:

代码语言:javascript
复制
  if (loading) {
    return (
      <View
        style={{
          height: "100%",
          justifyContent: "center",
          backgroundColor: Colors.dark.background,
        }}
      >
        <ActivityIndicator
          size="large"
          style={{ backgroundColor: Colors.dark.background }}
        />
        <Text
          style={{
            color: Colors.dark.text,
            marginTop: 10,
            alignSelf: "center",
          }}
        >
          retrieving userdata...
        </Text>
      </View>
    );
  } else {
    return (
      <Text>{inventoryValue}</Text> // avatar, etc. wont work as well
)

我从LoginScreen.tsx导航到它的方式如下:

代码语言:javascript
复制
  onPress={async () => {
          let result = await startAuth();
          if (result.type == "success") {
            setLoggedInUser(result.steamID);
            console.log("ID: " + result.steamID);
            navigation.navigate("UserProfile");
          }
EN

回答 1

Stack Overflow用户

发布于 2022-05-13 11:15:43

创造承诺链

代码语言:javascript
复制
React.useEffect(() => {
  AsyncStorage.getItem(LOGGED_IN_USER).then((userSteamID) =>
    fetch(USER_PROFILE + userSteamID)
      .then((response) => response.json())
      .then((json) => json.steamId)
      .then((steamId) => fetch(USER_INVENTORY + steamId))
      .then((response) => response.json())
      .then((json) => {
        setProfileInfo(json);

        // This can be avoided, already available in profileInfo
        setSteamID(json.steamId); 
        setInventoryValue(json.value);       
      })
      .catch((err) => alert(err))
      .finally(() => setLoading(false))
  );
}, []);

带异步/等待

代码语言:javascript
复制
React.useEffect(() => {
  const init = async () => {
    try {
      const userSteamID = await AsyncStorage.getItem(LOGGED_IN_USER);
      const { steamId } = await fetch(USER_PROFILE + userSteamID).then((r) =>
        r.json()
      );
      const json = await fetch(USER_INVENTORY + steamId).then((r) => r.json());
      setProfileInfo(json);

      // This can be avoided, already available in profileInfo
      setSteamID(json.steamId);
      setInventoryValue(json.value);
    } catch (error) {
      alert(error);
    } finally {
      setLoading(false);
    }
  };
  init();
}, []);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72227151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档