Условно отрендерить TabNavigators - PullRequest
0 голосов
/ 10 января 2019

У меня есть требование, при котором я должен отображать вкладки по условию и должен поддерживать один компонент поиска в верхней части экрана, который является общим для содержимого всех 3 вкладок. Вы можете проверить этот снимок экрана, чтобы получить лучшее представление. Ввод текста будет отправлен на все вкладки с помощью screenProps, чтобы они могли соответствующим образом фильтроваться.

В компоненте экрана render () У меня есть это,

return (
            <SafeAreaView style={{ flex: 1, backgroundColor: 'white' }}>

                <View style={{ flex: 1, backgroundColor: 'white' }}>

                    {this.getStatusBar()}

                    <CustomSearchBar
                        onChangeText={this.setSearchPhrase}
                        onSubmitEditing={this.onSearchPress}
                        placeholder={I18n.t('searchEntities')} />

                    {this.getTabs()}

                </View>

            </SafeAreaView>
        );

Вот как я отображаю вкладки условно,

getTabs = () => {
        const { entityType } = this.props.parentEntity;

        if (entityType === appConstants.entityTypeEstate) {
            return (
                <EstateDrillDownTabs
                    screenProps={screenProps}
                    navigation={this.props.navigation} />);
        } else if (entityType === appConstants.entityTypeBuilding) {
            return (
                <BuildingDrillDownTabs
                    screenProps={screenProps}
                    navigation={this.props.navigation} />);
        } else if (entityType === appConstants.entityTypeRoom) {
            return (
                <RoomDrillDownTabs
                    screenProps={screenProps}
                    navigation={this.props.navigation} />);
        } else {
            if (__DEV__) console.error(`ERROR!`);
        }
    };

И, конечно, это означает, что у меня создано 3 навигатора вкладок.

const EstateDrillDownTabs = createMaterialTopTabNavigator({
    Building: {
        screen: BuildingTab,
    },
    Site: {
        screen: SiteTab,
    },
    TechConst: {
        screen: TechConstTab,
    }
}, { ... });

const BuildingDrillDownTabs = createMaterialTopTabNavigator({
    Section: {
        screen: SectionTab,
    },
    Room: {
        screen: RoomTab,
    },
    Object: {
        screen: ObjectTab,
    }
}, { ... });

const RoomDrillDownTabs = createMaterialTopTabNavigator({
    Object: {
        screen: ObjectTab,
    }
}, { ... });

Моя проблема возникла при переходе с v1 на v3, где я должен предоставить Class.router.

Согласно руководству здесь Я выставляю это, как показано ниже.

static router = {
        ...EstateDrillDownTabs.router,
        getStateForAction: (action, lastState) => {
            return EstateDrillDownTabs.router.getStateForAction(action, lastState);
        },
    };

Это работает нормально, как и ожидалось, когда условие для EstateDrillDownTabs выполнено, но другие вещи явно ломаются. Как я могу установить статический маршрутизатор условно или как-то иначе настроить маршрутизатор в соответствии с моими требованиями?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...