react-native - ReactNavigation & Redux:当 redux 状态改变时,所有屏幕都使用 StackNavigator 重新渲染
问题描述
我在 React Native 项目中使用 Redux 和 ReactNavigation。
在我的具体情况下,用户可以从一个 UserScreen 导航到另一个 UserScreen。
我想将前一个屏幕保留在堆栈中,以便用户可以导航回前一个屏幕。我this.props.navigation.push("UserScreen")
用来将新屏幕推送到堆栈上。
问题是当导航到第二个用户屏幕时,redux 存储发生变化,结果所有以前的用户屏幕都使用新的道具重新渲染。
当用户导航回前一个屏幕时,它将看到与新屏幕完全相同的屏幕,因为所有屏幕都已重新渲染。
我认为这是一个常见问题,因为大多数应用程序允许用户导航到具有不同数据集的同一屏幕。
解决方案
所以我正在考虑componentShouldUpdate
在所有 UserScreen 上使用并检查它的 activeScreen 是否会return true
阻止重新渲染并保持屏幕不变。
有没有人有更好的解决方案?有没有示例代码。
解决方案
有点晚了,但希望这能帮助其他有同样问题的人。这是我的解决方案。
- 导航到屏幕时,更新导航参数中的内容以告知屏幕已聚焦并禁用其余部分的聚焦状态。
- 在渲染之前在组件中检查焦点状态。
示例代码:
SideMenuNav.navigationOptions = ({ navigation }) => {
const { routeName } = navigation.state.routes[navigation.state.index];
navigation.state.routes.forEach((route, ind) => {
if (!route.params) route.params = {}
if (ind === navigation.state.index) route.params.isFocused = true
else route.params.isFocused = false
})
更多信息请访问:
https://reactnavigation.org/docs/en/redux-integration.html
https://medium.com/async-la/a-stately-guide-to-react-navigation-with-redux-1f90c872f96e
推荐阅读
- java - ZonedDateTime 不显示通过 DateTimeFormatter 预期的时区
- ruby-on-rails - Ruby on Rails 无法更新 pg 数据库表值
- excel - VBA Excel 模块 - 保存为 pdf 并发送
- java - 如何根据另一个文件的列替换excel文件的列
- java - ViewBinding 在 android studio 4.1.2 上不起作用?
- vim - vim urxvt ttymouse HOME 和 END
- c++ - SFML 窗口不响应输入
- c# - 使用 Selenium,查找列表项并单击它
- angular - 来自其他来源的角度显示图像
- java - 如何设计像主题中的图像一样的时间循环倒计时