javascript - 订单未在第一次渲染时显示,但当我按 Ctrl+S(保存)时,订单会显示
问题描述
import React, {useEffect} from 'react';
import {View, Text, StyleSheet, FlatList, TouchableOpacity} from 'react-native';
import Card from '../components/Card';
import {useState} from 'react';
import {useIsFocused} from '@react-navigation/native';
import AsyncStorage from '@react-native-async-storage/async-storage';
const Orders = ({route, navigation}) => {
const [userID, setUserID] = useState('');
const [orders, setOrders] = useState([]);
const isFocused = useIsFocused();
async function getData() {
try {
const value = await AsyncStorage.getItem('UserID');
if (value !== null) {
console.log('USERID is ' + value);
setUserID(value);
}
} catch (e) {}
}
function fetchOrders() {
fetch(
'https://somewebsite/product/GetOrdersByUserID?userid=' +
//'1249b39a-ded0-4522-a263-f905ac30e5a3',
userID,
)
.then(response => response.json())
.then(responseJson => {
setOrders(responseJson);
})
.catch(error => {
console.error(error);
});
}
getData();
useEffect(() => {
//getData();
fetchOrders();
console.log('UserID inside useffect:: ' + userID);
console.log('inside useEffect');
}, [isFocused]);
return (
<View>
<View style={styles.container}>
<FlatList
scrollEnabled={true}
data={orders}
renderItem={({item}) => (
<TouchableOpacity
onPress={() => {
navigation.navigate('OrderDetails', {
orderID: item.id,
});
}}>
<View style={styles.viewPP}>
<Card style={styles.cardPP}>
<Text style={styles.text}>Order ID:{item.id}</Text>
<Text style={styles.text}>Total: ₹{item.total}</Text>
<Text style={styles.text}>Placed: {item.placed}</Text>
<Text style={styles.text}>Status: Delivered</Text>
</Card>
</View>
</TouchableOpacity>
)}></FlatList>
</View>
</View>
);
};
const styles = StyleSheet.create({
container: {
padding: 10,
},
text: {
fontWeight: 'bold',
alignContent: 'center',
},
cardPP: {
margin: 10,
},
});
export default Orders;
我的问题是我在第一次渲染时没有获得用户 ID,但是当我按 Ctrl+S(保存操作)时,我能够获得用户 ID,因此会显示订单。我的问题是我无法在第一次渲染时获取用户 ID。我已经尝试过 console.log(UserID) 并且第一次是空白的,如上所述。当我将 UserID 直接作为 1249b39a-ded0-4522-a263-f905ac30e5a3 放入 fetchOrders() 中的 'https://somewebsite/product/GetOrdersByUserID?userid=' 时,订单在第一次渲染时显示没有任何问题。请帮帮我。
解决方案
状态更新不是同步的。就像你调用 setUserId 一样,它不会同步设置状态,让你立即使用它。它在内部通过 React 进行异步管理。如果你遵循你的承诺并传递参数等,那就更好了。如果我错过了什么,请告诉我
const Orders = ({route, navigation}) => {
const [userID, setUserID] = useState('');
const [orders, setOrders] = useState([]);
const isFocused = useIsFocused();
async function getData() {
try {
const value = await AsyncStorage.getItem('UserID');
if (value !== null) {
console.log('USERID is ' + value);
setUserID(value);
return value;
}
throw new ReferenceError("UserID is null");
} catch (e) {
return '';
}
}
function fetchOrders(userId) {
fetch(
'https://somewebsite/product/GetOrdersByUserID?userid=' +
//'1249b39a-ded0-4522-a263-f905ac30e5a3',
userID,
)
.then(response => response.json())
.then(responseJson => {
setOrders(responseJson);
})
.catch(error => {
console.error(error);
});
}
useEffect(() => {
getData()
.then((v) => fetchOrders(v));
}, [isFocused]);
推荐阅读
- mfc - 在 MFC 应用程序中调整大小的 PNG 图像的显示问题
- c++ - 定期清理地图
- kubernetes-helm - 在 k8s 集群中通过入口公开服务时找不到 404 页面
- javascript - 显示 am4charts.XYChart 中的所有工具提示
- node.js - 使用 node.js 通过 Lambda 将图像上传到 Cloudinary
- couchbase - 更改 couchbase 的日志文件位置
- typing - Microsoft Teams 应用程序,键入指示器持续时间
- rest - 所有父母的组合孩子的 RESTful 命名约定
- php - 根据 WooCommerce 年度订单数更改用户角色
- html - CSS - 无论设备的屏幕大小如何,都将元素定位在同一位置