【问题标题】:Call data after refreshing the page (React Native Hooks)刷新页面后调用数据(React Native Hooks)
【发布时间】:2021-09-14 11:28:43
【问题描述】:

这是我的代码

const [getData, setGetData] = useState();
const [ref, setRef] = useState();

const initializeData = async() => {
  const userToken = await AsyncStorage.getItem('user_id');
  setGetData(JSON.parse(userToken));
}

useEffect(() => {
  return initializeData();
},[])

useEffect(() => {
  let interval;
  if(getData != null)
  {
    interval = setInterval(() => {
      setRef(firestore().collection('**********').where("SendersNo", "==", getData.number));
    }, 2000);
  }
  return () => clearInterval(interval);
},[getData])

useEffect(() => {

  if(ref != null)
  {
    return ref.onSnapshot(querySnapshot => {
      const list = [];
      querySnapshot.forEach(doc => {
          const {
              id,driverName,driverContactNumber,driverRating,driverPlateNumber,driverTrackingNumber,userPlaceName,
              destinationPlaceName,PaymentMethod,Fare
          } = doc.data();
          list.push({id: doc.id,driverName,driverContactNumber,driverRating,
            driverPlateNumber,driverTrackingNumber,userPlaceName,destinationPlaceName,PaymentMethod,Fare});
      });
      setUserBookingData(list);
      console.log("HEY!");
    });
  }
  
},[])

const CurrentTransaction = () => {
  if(ref == null)
  {
    return (
      <View>
        <Text>You don't have a Current Transaction</Text>
      </View>
    )
  }
  else
  {
    return userBookingData.map((element) => {
      return (
        <View key={element.id}>
             <View>
                 <Text>{element.name}</Text>
             </View>
        </View>
         )
        });
     }
}

所以目前我正在尝试的是,如果我的 Firestore 上有数据,它将在屏幕上更新,但在更新之前,我需要从 setGetData 获取数据,以便我可以查询它,但问题是是当我刷新整个模拟器/页面时,它没有获取数据,而只是一个空白页面。但是当我编辑并保存我的代码而不刷新页面/模拟器时,它可以获得数据。有人可以帮我做错什么。

编辑

如果我这样做

useEffect(() => {
  if(ref != null)
  {
    return ref.onSnapshot(querySnapshot => {
      const list = [];
      querySnapshot.forEach(doc => {
          const {
              id,driverName,driverContactNumber,driverRating,driverPlateNumber,driverTrackingNumber,userPlaceName,
              destinationPlaceName,PaymentMethod,Fare
          } = doc.data();
          list.push({id: doc.id,driverName,driverContactNumber,driverRating,
            driverPlateNumber,driverTrackingNumber,userPlaceName,destinationPlaceName,PaymentMethod,Fare});
      });
      setUserBookingData(list);
      console.log("HEY!");
    });
  }
  else
  {
    return null;
  }
},[ref])

它不断循环console.log('hey'),但它可以获取数据并显示它。但它会循环,所以很糟糕。

【问题讨论】:

  • ref 变量从哪里来?
  • @ucup 我编辑我的问题。这是一个状态
  • 哦,所以 ref 还不存在
  • 是的,我需要设置它才能在 firestore 中进行查询
  • 它无限循环的原因是因为你在 setRef 上设置了间隔。然后你把 [ref] 放在另一个 useeffect 上。所以每次更新 ref 的值时,第二个 useEffect 也会触发

标签: react-native react-hooks react-native-android


【解决方案1】:

我相信来自 firebase 实时数据库的快照是一个监听器,所以它不需要 setinterval


useEffect(() => {
  if(getData != null)
  {
    const ref = firestore().collection('**********').where("SendersNo", "==", getData.number);
    ref.onSnapshot(querySnapshot => {
      const list = [];
      querySnapshot.forEach(doc => {
          const {
              id,driverName,driverContactNumber,driverRating,driverPlateNumber,driverTrackingNumber,userPlaceName,
              destinationPlaceName,PaymentMethod,Fare
          } = doc.data();
          list.push({id: doc.id,driverName,driverContactNumber,driverRating,
            driverPlateNumber,driverTrackingNumber,userPlaceName,destinationPlaceName,PaymentMethod,Fare});
      });
      setUserBookingData(list);
      console.log("HEY!");
    });

  }
  return () => {
   //clear your ref listener here
  }
},[getData])

如果你放了一个return on use效果,它会在屏幕不再使用后被调用。

useEffect(()=>{
  //inside this will be called when the screen complete render
  const someListener = DeviceEventEmitter('listentosomething',()=>{
  //do something
  });
return ()=>{
 //inside this will be called after the screen no longer be used 
 //example go to other screen
someListener.remove();
}
},)

【讨论】:

  • 让我检查一下这个 DeviceEventEmitter。谢谢 ucup
  • 啊我现在明白了。上面的示例在没有依赖项的情况下将无法工作,并返回 useEffect
  • 请检查我的编辑问题。谢谢 ucup
  • 是因为间隔
猜你喜欢
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多