Как добавить пользовательский компонент в панель вкладок createMaterialTopTabNavigator - PullRequest
0 голосов
/ 28 января 2019

Я использую createMaterialTopTabNavigator из react-navigation и пытаюсь настроить панель вкладок, добавив некоторые компоненты поверх нее.

Как вы можете видеть в ее руководстве здесь:

https://reactnavigation.org/docs/en/material-top-tab-navigator.html#docsNav

есть опция с именем tabBarComponent, которую можно пропустить, чтобы создать собственную панель вкладок.Тем не менее, он полностью переопределяет панель вкладок, а это не то, что мне нужно.

Я хотел бы добавить пользовательский компонент в верхней части панели вкладок, а затем иметь вкладки по умолчанию с надписями под ними.

Может кто-нибудь показать мне пример того, как добавить компонент на панель вкладок?

Например, приведенный ниже код заменяет вкладки текстом My Custom Component, но как мне их обоих?(пользовательские компоненты и вкладки)

const myNavigation = createMaterialTopTabNavigator({
  firstTab: FirstTabScreen,
  secondTab: SecondTabScreen,
  thirdTab: ThirdTabScreen,
},
{
  tabBarComponent: props => (
    <View><Text>My Custom Component</Text></View>
  )
});

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

Вы можете добавить свой собственный пользовательский компонент к существующей верхней панели вкладок следующим образом:

import { createMaterialTopTabNavigator, MaterialTopTabBar } from "react-navigation";

tabBarComponent: props => <SafeAreaView>
  <MyCustomHeader title='test' />
  <MaterialTopTabBar {...props} />
</SafeAreaView>
0 голосов
/ 07 июня 2019

Очень простой подход - использовать Fragment from реагировать.Это решает проблему.

import React, {Fragment} from 'react';

И возврат компонента может выглядеть следующим образом

return (
        <Fragment>
            <MyCustomHeader/>
            <MaterialTopTabBar/>
        </Fragment>

    )
0 голосов
/ 28 января 2019

Создать компонент панели вкладок не так сложно, ниже приведен минимизированный пример панели пользовательских вкладок, которую я создал для проекта, над которым я работаю.

Но на самом деле это не так уж и много, ваш компонент панели вкладок получает навигационную опору, которая содержит различные маршруты, которые вы настроили в createMaterialTopTabNavigator.Таким образом, вы просто переключаетесь между этими маршрутами и отображаете элемент панели вкладок для каждого из них.

CustomTabBar.jsx

export default class CustomTabBar extends React.Component {

  render() {

    const {navigation} = this.props;    
    const routes = navigation.state.routes;

    return (
      <SafeAreaView style={{backgroundColor: 'blue'}}>
        <View style={styles.container}>
          {routes.map((route, index) => {
            return (
              <View style={styles.tabBarItem}>
                <CustomTabBarIcon
                  key={route.key}
                  routeName=route.routeName
                  onPress={() => this.navigationHandler(index)}
                  focused={navigation.state.index === index}
                  index={index}
                />
          </View>
            );
          }
        </View>
      </SafeAreaView>
    );
  }

  navigationHandler = (routeName) => {
    this.props.navigation.navigate(routeName);
  }
}

const styles = StyleSheet.create({

  container: {
    flexDirection: 'row',
    alignContent: 'center',
    height: 56,
    width: '100%',
    paddingHorizontal: 16,
    backgroundColor: 'blue',
  },
  tabBarItem: {
    flex: 1,
    alignItems: 'center'
  }
});

CustomTabBarItem.jsx

class CustomTabBarIcon extends React.PureComponent {

  render() {

    const {index, focused, routeName} = this.props;
    let icon = '';

    switch (index) {
      case 0: 
        icon = 'a';
        break;

      case 1:
        icon : 'b';
        break;

      case 2:
        icon = 'c';
        break;

      default: 
        iconName = 'a';
    }

    return (
      <TouchableWithoutFeedback
        onPress={() => this.onSelect(routeName)}
      >
        <View style={[styles.container, focused ? styles.active : styles.inactive]}> 
          <View style={styles.icon}>
            <Icon name={icon} color='white' size={24}/>
          </View>
          <Text style={styles.textStyle}>{routeName}</Text>
        </View>
      </TouchableWithoutFeedback>
    );
  }

  onSelect = (routeName) => {    
    this.props.onPress(routeName);
  }
}

const styles = StyleSheet.create({

  container: {
    flex: 1,
    alignItems: 'center'
  },
  active: {
    borderTopWidth: 3,
    borderColor: 'white'
  },
  inactive: {
    borderTopWidth: 3,
    borderColor: 'blue'  
  },
  textStyle: {
    color: 'white',
    fontSize: 13
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...