[英]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.