【问题标题】:Why React Navigation event "willFocus" not executing?为什么 React Navigation 事件“willFocus”没有执行?
【发布时间】:2019-06-25 16:00:11
【问题描述】:

我在 react native 应用程序中使用 react-navigation v2 创建了一些选项卡。我创建了调用 willFocus 的 componentDidMount 函数。第一次运行应用程序并且第一次选择了我想要的选项卡时,willFocus 没有执行。但是,当我转到不同的选项卡并返回该选项卡时,willFocus 将执行。 willFocus 第一次不执行而第二次正常工作的原因是什么?

所需的选项卡组件DidMount 函数

componentDidMount(){
    const {navigation} = this.props;
    navigation.addListener ('willFocus', async () =>{
      console.log("willFocus runs"
    });
}

标签导航器与其他导航器嵌套,但我只在下面显示标签导航器

TabNav: createBottomTabNavigator(
        {
            TAB1: Screen1,
            TAB2: Screen2,
            TAB3: Screen3,
            TAB4: Screen4,
            TAB5: Screen5,
            // Map: MapScreen
        },
        {
            initialRouteName: 'Bar',
            transitionConfig: NavigationConfig,
            navigationOptions: ({navigation})=>({
                tabBarIcon: ({focused, tintColor})=>{
                    const { routeName } = navigation.state;
                    let iconName, iconSize;
                    switch(routeName) {
                                case "TAB1":
                                    iconName = `icon1`;
                                    break;
                                case "TAB2":
                                    iconName = `icon2`;
                                    break;
                                case "TAB3":
                                    iconName = `icon3`;
                                    break;
                                case "TAB4":
                                    iconName = `icon4`;
                                    break;
                                case "TAB5":
                                    iconName = `icon5`;
                                    break;
                                default:
                                    break;
                                }
                    return <Icon name={iconName} color={tintColor} type="FontAwesome" />;
                },
            }),
            tabBarOptions: {
                activeTintColor: 'black',
                inactiveTintColor: 'grey',
                activeBackgroundColor: '#abaf9b',
                labelStyle: {
                    fontSize: 12,
                },
                // style for tabbar
                style: {
                    backgroundColor: '#ffffff',
                    height: 60,
                    justifyContent: 'space-around',
                    alignContent: 'center',
                    alignItems: 'center',
                },
                // style for tab
                tabStyle: {
                    paddingTop: 7,
                    paddingBottom: 7
                }
            },
        }
    ),

【问题讨论】:

    标签: react-native react-navigation


    【解决方案1】:

    我也遇到了这个问题,它被报告为 react-navigation 的错误。检查this 问题以获取详细信息。

    我有两个解决问题的建议。

    1. 尝试更新 react-navigation 并检查问题是否已解决
    2. 如果第一个解决方案不起作用,作为一种解决方法,我会调用函数两次,如果您想确保在应用程序的初始启动和屏幕更改时都调用该函数。

    PS:再次检查你的函数,确保两次调用该函数不会引起任何副作用

    componentDidMount(){
        console.log("willFocus runs") // calling it here to make sure it is logged at initial start
    
        const {navigation} = this.props;
        navigation.addListener ('willFocus', async () =>{
          console.log("willFocus runs") // calling it here to make sure it is logged at every time screen is focused after initial start
        });
    }
    

    【讨论】:

    • 目前我正在使用相同的方法,但缺点是如果有一个 api 调用,那么它会不必要地调用 2 次​​span>
    • "..navigation.addListener ('willFocus', async () =>{" ...这是我缺少的部分!我不得不使用“async “在听众中!非常感谢您
    【解决方案2】:

    我遇到了这个问题,因为我的标签导航器中有 lazy: true 导致了这个问题。我删除了它,现在它也可以在第一次点击时工作。

    【讨论】:

    • 您可以使用一些标记并使其更有条理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    相关资源
    最近更新 更多