我正在开发一个带有底部标签导航器的react-native / redux应用程序,类似于https://reactnavigation.org/docs/en/tab-based-navigation.html#customizing-the-appearance上的示例。我的所有屏幕都连接到Redux存储并显示共享数据,但是我希望这些屏幕中的至少一个可以忽略存储中的当前数据,而是每次导航到该数据时都要重新初始化(而不是继续显示数据处于最后保留的状态)。
屏幕具有执行此操作的方法,但是我无法弄清楚在第一次渲染屏幕后如何调用它(例如,从 constructor 或 componentDidMount() 方法)。我无法从 render()方法调用它,因为这会导致“在现有状态转换期间无法更新”错误。
我需要导航器以某种方式导致每次按下Home图标时都会调用我的 HomeScreen.initializeData()方法,但是我该怎么做?
HomeScreen.js :
initializeData() {
this.props.resetData(initialValue);
}
const initialValue = ...
( resetData()是一个分派函数,用于重新初始化Redux存储)。
答案 0 :(得分:1)
从render()更新状态将创建一个无限循环。另外,您不希望每次重新渲染组件时都运行状态更新,仅当按下选项卡按钮时。这告诉我,进行状态更新的适当位置是选项卡按钮上的一些onPress函数。
因此,现在的问题取决于如何在选项卡按钮上实现一些onPress函数。我相信这个回答这个问题: Is there an onPress for TabNavigator tab in react-navigation?
答案 1 :(得分:0)
所以我找到了一个答案,它比预期的要复杂一些:正如Vinicius指出的那样,我需要使用tabBarOnPress导航选项,但我还需要使该调度选项可以使用我的调度功能。>
为此,我发现我需要将对调度函数的引用(可以作为屏幕的属性使用)传递给导航选项,因此我使用了导航参数来做到这一点,这就是我要做的最终以:
HomeScreen.js :
componentDidMount() {
initializeData(this.props);
this.props.navigation.setParams({ homeProps: this.props });
}
export const initializeData = (homeProps) => {
homeProps.resetData(initialValue);
};
const initialValue = ...
AppNavigator.js :
tabBarOnPress: ({navigation, defaultHandler}) => {
const routeName = navigation.state.routeName;
if (navigation.state.params === undefined) {
// no params available
} else if (routeName === 'Home') {
let homeProps = navigation.getParam('homeProps', null);
initializeData(homeProps);
} else if (routeName === ...
...
}
defaultHandler();
}
注意: