javascript - 如何在本机反应中使用后退按钮重新渲染组件?
问题描述
如果我从主屏幕转到产品详细信息屏幕,然后再到购物车屏幕,则状态更新工作正常,但如果我添加商品或删除商品,然后导航回产品详细信息或主屏幕,则状态不会更新,为什么会这样?请参阅下面的视频链接:https ://drive.google.com/file/d/1AjrFMAXBs9Gzc5Onbm1uf-eW9gFfHxMU/view?usp=sharing
我正在使用 redux,但即使 redux 存储状态已更新,它仍然不会呈现具有更新状态的组件,为什么会这样?
我正在考虑使用反应导航事件,但我收到错误,为什么会这样?如何解决问题?这是redux问题还是反应导航问题?导航回前一个屏幕时组件是否会重新渲染?
如果我刷新模拟器屏幕,那么状态会更新并正确显示,为什么会发生这种情况?
我想在重新聚焦但出现错误时重新渲染 Home 组件。为什么这样?
截屏:
代码:
主页.js:
import React, {useState, useEffect} from 'react';
import {
StyleSheet,
ScrollView,
View,
Text,
StatusBar,
Image,
TouchableOpacity,
Button
} from 'react-native';
import Product from '../product/product';
import { useFocusEffect } from '@react-navigation/native';
import axios from 'axios';
export const Home = (props) => {
const [categories, setCategories] = useState([]);
useFocusEffect(
React.useCallback(() => {
const unsubscribe = FetchCategoryData();
return () => unsubscribe();
}, [])
);
const FetchCategoryData = () => {
axios.get(`http://localhost:5000/api/categories`)
.then(res => {
console.log("All categories: ", res.data.data);
setCategories([...res.data.data]);
console.log("useeffect categories",categories)
})
.catch(error => console.log("Error: ", error))
}
return(
<ScrollView style={styles.root}>
<View style={{marginTop: 15, marginLeft: 15, marginBottom: 15}}>
<ScrollView horizontal={true} style={styles.container}>
<TouchableOpacity>
<View style={{marginRight: 15}}>
<Image source={require('../../assets/img/fruits.jpg')} style={{width: 325, height: 200, borderRadius: 10}}/>
</View>
</TouchableOpacity>
<TouchableOpacity>
<View style={{marginRight: 15}}>
<Image source={require('../../assets/img/grocery.jpg')} style={{width: 325, height: 200, borderRadius: 10}}/>
</View>
</TouchableOpacity>
<TouchableOpacity>
<View style={{marginRight: 15}}>
<Image source={require('../../assets/img/fruits.jpg')} style={{width: 325, height: 200, borderRadius: 10}}/>
</View>
</TouchableOpacity>
</ScrollView>
</View>
{categories && categories.length > 0 ? categories.map(val => <CategoryList key={val._id} category={val.name} navigation={props.navigation}/>) : null}
</ScrollView>
)
}
解决方案
查看reactnavigation.org/docs/function-after-focusing-screen。
简而言之,使用
const isFocused = useIsFocused();
在您的组件中的某处,将强制重新渲染,每次窗口聚焦或不聚焦。
推荐阅读
- c# - 如何将batch_normalization从python转换为c#
- python - 如何删除csv python中的空单元格?
- mysql - 从mysql中具有多个表的重复数据中获取单个唯一行
- c# - Selenium C#:从同名的多个 div 中获取文本
- angular - CanDeactivateGuard 重定向到主页
- python - 为什么会这样说:“TypeError:__call__() 缺少 1 个必需的位置参数:'inputs'”
- bash - cat、echo 和进程替换
- python-3.x - Python 到 Mysql 的连接
- javascript - React - ul li 列表上的键盘导航
- c# - WebClient.DownloadData 方法使应用程序崩溃