繁体   English   中英

React - 组件渲染后更改的值

[英]React - Value changed after Component Rendering

我一直在开发一个与食物相关的 React Native 应用程序,对于登录,我想分离为普通用户和餐厅返回的堆栈。

我遇到的问题是restaurantUserChecker的返回值与第二个UseEffect得到的不同。 console.log('1', doc.exists)为真,因此应该返回真。 但是console.log('2', val)是 false ,这会导致所有用户获得相同的堆栈。

  async function restaurantUserChecker(){
  const check = firestore().collection('restaurantUsers').doc(auth().currentUser.uid); 

    await (check.get()).then((doc) => {
    if (doc.exists) {
      console.log('1', doc.exists);
      return true;
    }
  }).catch((error) => console.log(error));

  return false;
}

  function MyStack() {

  const [restaurantUser, setRestaurantUser] = useState(false);

  useEffect(() => {
    console.log(auth().currentUser.uid);
    restaurantUserChecker().then((val) => {
      console.log('2', val);
      setRestaurantUser(val);
    }).catch((error) => console.log(error));
  }, []);

  if(restaurantUser){
    return <RestaurantHomeStack/>
  }

  return <DrawerNavigator />;
}

export default function App() {
  return (
    <SafeAreaProvider>
      <NavigationContainer>
        <MyStack/>
      </NavigationContainer>
    </SafeAreaProvider>
  );
}

我将不胜感激各种帮助,因为我在这个问题上已经挣扎了好几个小时。

您的 function restaurantUserChecker必须返回 Promise。

async function restaurantUserChecker() {
    return new Promise(async (resolve, reject) => {
        const check = firestore()
        .collection("restaurantUsers")
        .doc(auth().currentUser.uid);

    await check
        .get()
        .then((doc) => {
            if (doc.exists) {
                console.log("1", doc.exists);
                resolve(true);
            }
        })
        .catch((error) =>{ console.log(error); reject(error)});

    resolve(false);
    });
}

正如其他答案所暗示的,您不需要从restaurantUserChecker返回 promise。 then允许在async function 上调用。 restaurantUserChecker的以下更改也应按您的预期执行。

async function restaurantUserChecker(){
  const check = firestore()
        .collection("restaurantUsers")
        .doc(auth().currentUser.uid);

  try {
     var doc = await check.get();
     if (doc.exists) {
        console.log('1', doc.exists);
        return true;
     }
  } catch(error) {
       console.log(error);
  }
  return false;
}

您的两个答案都有效,现在我了解导致问题的原因。 如果允许我在这里引用蝙蝠侠的话,你们是我们不配但需要的英雄。 非常感谢你们!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM