react-native 渲染速度比从 firebase 加载数据要快得多

Posted

技术标签:

【中文标题】react-native 渲染速度比从 firebase 加载数据要快得多【英文标题】:react-native renders much faster than it can load data from firebase 【发布时间】:2021-05-19 03:54:10 【问题描述】:

我正在开发一个应用程序,人们可以选择商店并将其保存到他们的个人资料中。我正在使用 google firebase 身份验证来处理登录的用户。当用户访问个人资料屏幕时,它将从 firebase 加载数据。显示名称和选定的商店。

我有本地加载(硬编码)的所有商店的平面列表,它是人们选择和取消选择的商店列表。如果选中,该项目的背景将变为另一种颜色,表明它已被选中。从 firebase 加载时,如果选择了此商店中的任何一个,则必须更改背景。

  const selectStore = (index) => 
    const data = [...stores];
    data[index].selected = !data[index].selected;
    store(data);
  ;

当他们第二次访问屏幕时,它会从 firebase 加载数据并将其显示给用户。问题是屏幕在渲染来自firebase的所有数据之前加载得更快,它会显示名称和所有内容,但是当它到达选定的商店时,它加载页面的速度比渲染数据的速度快,因此显示只是一个商店列表,即使你选择了一些,如果我刷新屏幕,那么这次它会显示当前选择的商店。我想确保在加载设置为 true 之前它有一些时间来正确加载所有数据。

我使用以下方法获取当前用户的登录信息:

useEffect(() => 
    setLoading(true);
    var user = firebase.auth().currentUser;
    if (user) 
      fetchUser(user.uid);
     else 
      // No user is signed in.
      alert("if you see this message something has gone wrong!");
    
  , []);

然后我在 firebase 中创建了一个集合,用于保存其中的一些用户数据,包括选定的商店,它是一个数组:

  const fetchUser = async (userId) => 
    const userRef = db.collection("users").doc(userId);
    const doc = await userRef.get();
    if (!doc.exists) 
      console.log("No such user!");
     else 
      if (doc.data().fname.length === 0) 
        setUseFirstName("");
        setUseLastName("");
        setShopList([]);
       else 
        setUseFirstName(doc.data().fname);
        setUseLastName(doc.data().lname);
        setShopList(doc.data().supermarks);
        for (let i = 0; i < shopList.length; i++) 
          let index = shopList[i].id;
          selectStore(index - 1);
        
      
      setLoading(false);
    
  ;

当我想显示信息时,如果加载为真,它将显示加载指示器,然后它只会发布名字和姓氏,它不会选择商店。我怎样才能做到这一点?我的问题够清楚了吗?

【问题讨论】:

【参考方案1】:

我不是 100% 清楚你在问什么,但是使用加载标志来呈现加载指示器看起来像这样:

  if(loading) 
    return (
      <View>
        <ActivityIndicator animating=true/>
        <Text>Loading your data...</Text>
      </View>
    )
   else 
    return (
      [Rest of your code here]
    )
  

【讨论】:

【参考方案2】:

您应该使用 ActivityIndicator 来显示加载图标,直到您从 firebase 收到数据。

https://reactnative.dev/docs/activityindicator

【讨论】:

以上是关于react-native 渲染速度比从 firebase 加载数据要快得多的主要内容,如果未能解决你的问题,请参考以下文章

firebase react-native:通过电话身份验证将匿名用户转换为永久用户

Django 缓存

React-native,动态渲染按钮点击

React-Native:如何在 Airbnb 地图上渲染来自 firebase 的标记列表?

ScrollView 在 react-native 中渲染没有数据的更新组件?

如何在 react-native 中重新渲染组件?