reactjs - 如何在不改变状态的情况下重新渲染组件
问题描述
我有一个首先获取数据的组件。然后我操纵数据,但在我改变屏幕并返回之前它不会改变值。在这里,我根据使用 redux 获取的类别和医生更改数据。但转换后的数据仍然是空的,直到我第二次返回页面。谢谢你的帮助
import React, { useState, useEffect, useCallback } from "react";
import {
View,
Text,
StyleSheet,
ActivityIndicator,
FlatList,
Dimensions,
} from "react-native";
import { useSelector, useDispatch } from "react-redux";
import Colors from "../../constants/Colors";
import * as DoctorsActions from "../../store/actions/Doctors";
const { height } = Dimensions.get("window");
const ConcultationMainScreen = (props) => {
const dispatch = useDispatch();
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState("");
const categories = useSelector((state) => state.categories.categories);
const doctors = useSelector((state) => state.doctors.doctors);
const loadAllDoctors = useCallback(async () => {
try {
await dispatch(DoctorsActions.getDoctors());
} catch (err) {
setError(err);
console.log(error);
}
}, [dispatch, setError]);
useEffect(() => {
setIsLoading(true);
loadAllDoctors().then(() => {
setIsLoading(false);
});
}, [dispatch, loadAllDoctors]);
if (isLoading) {
return (
<View style={styles.centered}>
<ActivityIndicator size="large" color={Colors.blue} />
</View>
);
}
let transformedData = [];
for (const cat in categories) {
let doctorsOfCategory = [];
for (const doc in doctors) {
if (doctors[doc].categories[0] === categories[cat].name) {
doctorsOfCategory.push({
doctorName: doctors[doc].name,
});
} else {
continue;
}
}
transformedData.push({
categoryName: categories[cat].name,
doctorsOfCategory: doctorsOfCategory,
});
}
console.log(transformedData);
const renderConsultCategories = (ItemData) => {
return (
<View style={styles.item}>
<View style={styles.titleContainer}>
<Text>
گفتگو و مشاوره با متخصصین <Text>{ItemData.item.categoryName}</Text>
</Text>
</View>
</View>
);
};
return (
<View style={styles.screen}>
<FlatList
data={transformedData}
keyExtractor={(item) => item.categoryName}
renderItem={renderConsultCategories}
/>
</View>
);
};
export const screenOptions = (navData) => {
return {
headerTitle: "صفحه مشاوره",
headerTitleAlign: "center",
};
};
const styles = StyleSheet.create({
screen: {
flex: 1,
},
centered: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
item: {
flexDirection: "row-reverse",
width: "100%",
height: height / 8,
marginVertical: 10,
borderBottomWidth: 1,
},
});
export default ConcultationMainScreen;
解决方案
用于this.forceUpdate()
在不调用 setState() 的情况下重新渲染。
推荐阅读
- swift - 无法解决一对多关系
- ios - 在 react-native 网络错误上使用 Axios 时出错
- android - 带有 ViewPager 偏移的 Android 动画
- c# - 获取注册为“每个请求”的对象的新(单独)实例
- python - 如何在不使用后端函数的情况下在 keras 中编写自定义函数?
- django - 如何使用 CBV 将 PermissionDenied Redirect 提升到另一个页面?
- javascript - javascript箭头函数()=>()是什么意思?
- node.js - Dialogflow 网络钩子(Google 上的操作)。我是否应该使用 RichResponse?
- java - 我可以访问在另一个类的静态方法中声明的静态变量吗
- swift - 计算 World Origin 和 ARCamera 之间的 Y 轴角度