我有一个 React Native 应用程序,其中有一个名为 TasksScreen 的屏幕:
export default function TasksScreen() {
const [loading, setLoading] = useState<boolean>(true);
const colorScheme = useColorScheme() ?? "light";
const theme = colorScheme === "dark" ? darkTheme : lightTheme;
const themeColors = colorStyles[colorScheme];
const onLoadingChanged = (loading: boolean) => setLoading(loading);
if (loading) {
return (
<View style={theme.loaderContainer}>
<ActivityIndicator size="large" color={themeColors.primary} />
</View>
);
}
const selectTask = (task: TaskEntity) => {
router.push(`/task/${task.id}`);
};
return (
<SafeAreaView style={theme.container}>
<View
style={{
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center",
padding: 16,
backgroundColor: themeColors.background,
}}
>
<Text type="subtitle">Tasks:</Text>
<TouchableOpacity style={theme.buttonPrimary} onPress={() => router.push('/task/create')}>
<Text style={theme.buttonTextPrimary}>Create new task</Text>
</TouchableOpacity>
</View>
<TaskList key="TabsTasklist" setLoading={onLoadingChanged} selectTask={selectTask} />
</SafeAreaView>
);
}
它又使用这个名为 TaskList 的子组件:
const TaskList = ({
setLoading,
selectTask,
}: {
setLoading: (loading: boolean) => void;
selectTask: (task: TaskEntity) => void;
}) => {
const [tasks, setTasks] = useState<TaskEntity[]>([]);
const colorScheme = useColorScheme() ?? "light";
const theme = colorScheme === "dark" ? darkTheme : lightTheme;
const themeColors = colorStyles[colorScheme];
useEffect(() => {
console.log("Fetching tasks!");
const loadTasks = async () => {
try {
const fetchedTasks = await getAllTasks();
if (fetchedTasks.length === 0) {
Alert.alert("Error", "Failed to fetch tasks.");
}
console.log("Tasks fetched: ", fetchedTasks);
setTasks(fetchedTasks);
setLoading(false);
} catch (error) {
Alert.alert("Error", "Failed to fetch tasks. Reason: " + error);
}
};
loadTasks();
});
return (
<FlatList
data={tasks}
keyExtractor={(item) => item.id}
renderItem={({ item }) => (
<TaskListCell entity={item} onPress={selectTask} />
)}
contentContainerStyle={theme.listContainer}
ListEmptyComponent={
<Text style={theme.emptyText}>No task available!</Text>
}
/>
);
};
问题是,useEffect
根本没有调用获取数据的代码。但是,当我将状态loading/setLoading
从 TasksScreen 移至 TaskList(即从父级移至子级)时,它工作正常。有人能告诉我这里出了什么问题吗?
谢谢。