React Native - 使用 React Navigation 动态创建导航器

2024-02-17

我正在使用 React Native 构建一个移动应用程序,并使用 React Navigation 在我的应用程序中构建一个导航器。 React 导航为我提供了一种处理抽屉内嵌套选项卡栏的好方法,该抽屉也在 Stack Navigator 内。

问题是我需要指定组件,以便我可以将它们提供到选项卡栏中。假设我们必须从 API 中获取一些类别,但我们不知道数据中有多少类别。此外,我无法弄清楚,即使我尝试在启动时获取数据,导航器和 redux 配置也会在启动时进行,这意味着应用程序必须知道这些选项卡导航器中的组件。我无法弄清楚即使我从 API 获取了数据,我也无法弄清楚如何在停止应用程序配置的同时创建多个组件。

下面的代码只是演示了我如何实现选项卡栏。该代码在index.js 中工作,因为正如我之前提到的,应用程序必须了解导航器内的组件。

const TabStack = TabNavigator({
    Food: { screen: FoodStack},
    Drink : { screen: DrinkStack },
    HealthCare : { screen: SnackProducts },
    Snacks: { screen: SnackStack },
},
    {
        tabBarComponent : props => <CustomTabItems props={props}/>,
        tabBarPosition: 'top',
        animationEnabled : true,
        initialRouteName : 'Food',
        swipeEnabled: true,
        tabBarOptions : {
 
            scrollEnabled : true
        }
})

Thanks

这是根代码

import { AppRegistry } from 'react-native';
import React from 'react';

import { Text, Image, ScrollView, View, List, ListItem, TouchableWithoutFeedback } from 'react-native';
import { Icon, Avatar } from 'react-native-elements';

import { Provider, connect } from 'react-redux'
import thunkMiddleware from 'redux-thunk'
import { createStore, applyMiddleware, combineReducers } from 'redux';
import {
    addNavigationHelpers, StackNavigator,
    DrawerNavigator,
    DrawerItems,
    TabNavigator,
    TabView,
    TabBarTop,
    NavigationActions
} from 'react-navigation';

// importing starting screen 

import StartingContainer from './src/containers/StartingScreen/StartingContainer';

// Menu Containers
import MenuCredentials from './src/containers/MenuCredentials';

// Containers
import LoginContainer from './src/containers/LoginContainer';
import PhoneNumberValidation from './src/containers/SubLoginContainers/PhoneNumberValidation';
import MainOrderContainer from './src/containers/OrderContainers/MainOrderContainer';
import MainCartContainer from './src/containers/CartContainers/MainCartContainer';

// Components 
// Login Components
import SMSLogin from './src/containers/SubLoginContainers/SMSLogin';

// Profil Components
import Profil from './src/components/ProfileComponents/Profile';
import AdressComponent from './src/components/ProfileComponents/AdressComponent';
import SettingsComponent from './src/components/ProfileComponents/SettingsComponent';
import creditCardComponent from './src/components/ProfileComponents/creditCardComponent';
// Reducers
import initialReducer from './src/reducers/initialReducer';
import cartReducer from './src/reducers/cartReducer';
import starterReducer from './src/reducers/starterReducer';

// import tab bar containers

import FoodProducts from './src/containers/TabBarContainers/FoodProducts';
import HealthProducts from './src/containers/TabBarContainers/HealthProducts';
import SnackProducts from './src/containers/TabBarContainers/SnackProducts';

// Building Navigation
import MenuItem from './src/containers/MenuItemContainer/MenuItem';
import CustomTabItems from './src/containers/CustomTabItems';
import CustomSubTabItems from './src/containers/CustomSubTabItems';

import DrawerButton from './src/containers/DrawerButton';

// Tab Bar Navigation
const ChocolateStack = TabNavigator({
    Tadelle: { screen: MenuItem},
    Milka: { screen: MenuItem},
},
    {
        tabBarComponent : props => <CustomTabItems props={props}/>,
        tabBarPosition: 'top',
        animationEnabled : true,
        initialRouteName : 'Tadelle',
        swipeEnabled: true,
        tabBarOptions: {
            scrollEnabled: true
        },

})
const SnackStack = TabNavigator({
    Çikolatalar: { screen: MenuItem},
    Gofretler: { screen: MenuItem},
    Krakerler: { screen: MenuItem},
    Bisküviler: { screen: MenuItem},
    Kuruyemişler: { screen: MenuItem},
},
    {
        tabBarComponent : props => <CustomSubTabItems props={props}/>,
        tabBarPosition: 'top',
        animationEnabled : true,
        initialRouteName : 'Çikolatalar',
        swipeEnabled: true,
        tabBarOptions : {
            scrollEnabled : true
        }
})

const DrinkStack = TabNavigator({
    'Gazlı İçecekler': { screen: MenuItem},
    'Soğuk Çaylar': { screen: MenuItem},
    'Alkol': { screen: MenuItem},
    'Süt Ürünleri': { screen: MenuItem},
    'Spor İçecekleri': { screen: MenuItem},
},
    {
        tabBarComponent : props => <CustomSubTabItems props={props}/>,
        tabBarPosition: 'top',
        animationEnabled : true,
        initialRouteName : 'Alkol',
        swipeEnabled: true,
        tabBarOptions : {
            scrollEnabled : true
        }
})

const FoodStack = TabNavigator({
    Sandviç : { screen: MenuItem},
    Çorba: { screen: MenuItem},
},
    {
        tabBarComponent : props => <CustomSubTabItems props={props}/>,
        tabBarPosition: 'top',
        animationEnabled : true,
        initialRouteName : 'Sandviç',
        swipeEnabled: true,
        tabBarOptions : {
            scrollEnabled : true
        }
})


const TabStack = TabNavigator({
    Food: { screen: FoodStack},
    Drink : { screen: DrinkStack },
    Health : { screen: SnackProducts },
    Snacks: { screen: SnackStack },
},
    {
        tabBarComponent : props => <CustomTabItems props={props}/>,
        tabBarPosition: 'top',
        animationEnabled : true,
        initialRouteName : 'Food',
        swipeEnabled: true,
        tabBarOptions : {
            tabStyle : {
                width : 250
            },
            scrollEnabled : true
        }
})




// cart navigation will be drawernavigator and drawerItems will be custom !!
const CartNavigation = StackNavigator({
    Cart: {
        screen: MainCartContainer,
    }
},
    {
        headerMode: 'float',
        navigationOptions: ({ navigation }) => ({
            title: 'Sepet',
            headerLeft: <Icon
                name='arrow-back'
                color='#517fa4'
                onPress={() => navigation.navigate('drawerStack')}
            />,
            headerRight:
            <Icon
                name='payment'
                color='#517fa4'
                onPress={() => navigation.navigate('drawerStack')}
            />
        })

    }
)
const DrawerStack = DrawerNavigator({
    Sipariş: { screen: TabStack },
    Profil: { 
        screen: Profil ,
        navigationOptions : ({ navigation }) => ({
            title : 'Profilim',
        })
    },
    Adreslerim: {
        screen: AdressComponent,
        navigationOptions: ({ navigation }) => ({
            title: 'Teslimat Adreslerim'
        })
    },
    Ayarlar: { screen: SettingsComponent }
},
    {
        drawerPosition: 'left',
        headerMode : 'none',
        navigationOptions: ({ navigation }) => ({
            headerStyle: { backgroundColor: '#87CEFA' },
            headerRight: <Icon
            name='shopping-cart'
            color='#517fa4'
            onPress={() => navigation.navigate('cartStack')}
            />,
        }),
        contentOptions: {
            inactiveTintColor: 'white',
            activeTintColor: 'purple',
            style: {
                marginTop: 80,
                marginLeft: 25,
            }
        },
        contentComponent: props => <MenuCredentials {...props} />
})

const DrawerNavigation = StackNavigator({
    DrawerStack: {
        screen: DrawerStack
    }},
   {
       style : {
           leftDrawerWidth : 40
       },
       index : 0,
       navigationOptions : ({ navigation }) => ({
            headerStyle: { backgroundColor: '#87CEFA' },
            gesturesEnabled : false,
            headerRight : <Icon
            name='shopping-cart'
            color='#517fa4'
            onPress={() => navigation.navigate('cartStack')}
            />,
            headerLeft: <Icon
            name='menu'
            color='#517fa4'
            onPress={() => {
                console.log(navigation.state.routes[0]);
                navigation.navigate({
                    key : null,
                    index : 0,
                    action : [
                        navigation.navigate('DrawerToggle')
                    ]
                })
            }}
            />
       }),
       initialRouteParams : {
           name : 'Welcome'
       }
   } 
)

const LoginStack = StackNavigator({
    Login: {
        screen: LoginContainer,
        navigationOptions: ({ navigation }) => ({
            title: ' GİZLİ UYGULAMA ! '
        })
    },
    Ss: {
        screen: SMSLogin,
        navigationOptions: ({ navigation }) => ({
            title: ' SMS ONAYI '
        })
    },
    PhoneNumberValidation: {
        screen: PhoneNumberValidation,
        navigationOptions: ({ navigation }) => ({
            title: 'Kaydolma'
        })
    },
    },{
        headerMode : 'none',
        initialRouteName : 'Login'
})

// IMPORTANT NOTE ***!!!
// CARRY drawerStack to the PrimaryNavigator !!
// CHANGE LoginContainer so that it will navigate to the drawerStack
// NOT FROM ACTION BUT FROM COMPONENT INSIDE COMPONENTWILLUPDATE
// BY CHANGING isAuth variable in initialReducer !!

const PrimaryNavigator = StackNavigator({
    loginStack: {
        screen: LoginStack
    },
    cartStack: {
        screen: CartNavigation
    },
    drawerStack: {
        screen:  DrawerNavigation
    },
    starter : {
        screen : StartingContainer
    }
},
    {
        headerMode: 'none',
        title: 'Main',
        initialRouteName : 'starter'
    }
)

const navReducer = (state, action) => {
    const nextState = PrimaryNavigator.router.getStateForAction(action, state);
    // Simply return the original `state` if `nextState` is null or undefined.
    return nextState || state;
};

// combining Reducers
const AppReducer = combineReducers({
    initialR: initialReducer,
    cartR: cartReducer,
    starterR : starterReducer,
    nav: navReducer
})

// Creating redux store

const store = createStore(
    AppReducer,
    applyMiddleware(thunkMiddleware)
)

// Navigation initilizator to App
class App extends React.Component {
    render() {
        return (
            <PrimaryNavigator navigation={addNavigationHelpers({
                dispatch: this.props.dispatch,
                state: this.props.nav
            })}
            />
        )
    }
}
const mapStateToProps = (state) => ({
    nav: state.nav
})

const AppWithNavigationState = connect(mapStateToProps)(App);

class brilliantApp extends React.Component{
    render(){
        return(
            <Provider store={store}>
            < AppWithNavigationState />
        </Provider>
        )        
    }
}

AppRegistry.registerComponent('brilliantApp', () => brilliantApp);

您的 TabStack 文件:

const CATEGORIES = {
  "Food": { screen: FoodStack },
  // ...
}

export default (screenNames) => {
  const screens = screenNames.reduce((total, name) => ({...total, [name]: CATEGORIES[name]}), {})
  const TabStack = TabNavigator(screens,
    {
        tabBarComponent : props => <CustomTabItems props={props}/>,
        tabBarPosition: 'top',
        animationEnabled : true,
        initialRouteName : 'Food',
        swipeEnabled: true,
        tabBarOptions : {

            scrollEnabled : true
        }
  })
  return TabStack
}

您的根文件:

import getTabStack from './TabStack'


class Root extends Component {

    state = {
      categoriesNames: null
    }

    componentWillMount() {
      // assuming result is ["Food", "Drink", ... ]
      Api.fetchCategories().then((result) => {
        this.setState({ categoriesNames: result })
      })
    }

    render() {
      const { categoriesNames } = this.state
      if (!categoriesNames) {
        return <SplashScreen />
      }
      const TabStack = getTabStack(categoriesNames)
      return (
        <Provider store={store} >
          <TabStack />
        </Provider>
      );
    }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Native - 使用 React Navigation 动态创建导航器 的相关文章

随机推荐

  • 将嵌入的视频资源作为流播放

    EDIT 我改变了我的问题以更好地澄清问题 如何使用字节数组 取自嵌入式资源 播放视频DirectShow Net http directshownet sourceforge net about html图书馆 由于我要阻止用户访问视频文
  • CSS Transform Math - 计算倾斜引起的div高度

    我很难弄清楚如何计算因倾斜而导致的 div 容器的额外高度 我正在屏蔽容器内的图像并使用plugin http christianvarga com 2011 05 jquery resize image to parent contain
  • 使用标识符列表格式化 CREATE TABLE 查询

    我想用 Python 编写一个脚本 从 CSV 创建 PostgreSQL 表 而不是使用psycopg2 copy from我想要更个性化 更灵活的东西 显然 我将读取 CSV 文件的第一行并从中获取列名称列表 然后我想将此列表转换为您在
  • apache tomcat 9.x 无法与 eclipse 和 Java 10.0.1 一起使用

    我已经安装了 apache tomcat 9 0 7在我的 Windows 机器上并具有以下环境配置 回显 JAVA HOME C 程序文件 Java jdk 10 0 1 回显 JRE HOME C 程序文件 Java jre 10 0
  • 我可以让节点在数字字符串中输出逗号而不引入 i18n 吗?

    并不是说添加一个需求有什么大不了的 而是节点文档建议您不需要它 http nodemanual org latest js doc Number html Number toLocaleString from the docs var nu
  • Docker 在 Windows 上添加网络驱动器作为卷

    我正在尝试将网络驱动器安装为卷 这是我正在尝试的命令 docker run v NetworkDirectory Folder data alpine ls data 我在 Windows 上运行此命令 数据目录为空 如何将此网络目录作为卷
  • 关于 MVVM 模式和 GUI 中 XAML 动态加载的混淆

    嗯 这个问题与 MVVM 模式相关 我可以在这个论坛上快速得到答案 所以我想询问并消除我对该模式的困惑 我对 MVVM 方法还很陌生 我欣赏这种模式并了解其背后的原理 也许我没有对这个模式进行太多的研究 这就是为什么会有一些困惑 如果有一种
  • 检测java中的回车键

    我尝试使用扫描仪获取用户输入 如果用户按 Enter 键 则继续执行下一个输入语句 但它一次打印全部 public class MainRDS public static void main String args Scanner in n
  • Spring Boot oauth2:如何设置授权请求中的资源参数以使adfs满意?

    我正在尝试设置一个 Spring Boot 应用程序 该应用程序使用 oauth2 和 Active Directory 联合身份验证服务作为身份验证提供程序 我从这里的教程开始 https spring io guides tutoria
  • 以强类型方式获取属性的 [DisplayName] 属性

    再会 我有这样的方法来获得 DisplayName 属性的属性值 直接附加或使用 MetadataType 属性 我在极少数情况下需要使用它 DisplayName 在控制器代码中 public static class MetaDataH
  • 在 DirectPipelineRunner 上使用自定义 DataFlow 无界源

    我正在编写一个从 Kafka 0 8 读取的自定义 DataFlow 无界数据源 我想使用 DirectPipelineRunner 在本地运行它 但是 我得到以下堆栈跟踪 Exception in thread main java lan
  • htmlunit 在运行项目后总是给出多个 javascript 异常

    我正在开发一个项目 该项目检查导入的电子邮件列表 以查看用户是否在雅虎上注册 当我单击 开始 按钮时 它应该转到 yahoo 邮件注册页面并检查此导入的 txt 文件中的每封电子邮件 我依赖 htmlunit 库 但它总是给出异常 尽管禁用
  • GORM 中的多个一对多关系

    我有一个struct定义在GO像这样 package models StoryStatus indicates the current state of the story type StoryStatus string const Pro
  • Ioc/DI - 为什么我必须引用应用程序入口点中的所有层/组件?

    与这个问题相关 EF4 为什么启用延迟加载时必须启用代理创建 https stackoverflow com questions 9500642 ef4 mvc3 with windsor castle ioc di navigation
  • 在React中使用父组件中的按钮提交表单

    所以我必须在模态中实现一个表单 正如你所看到的 模态中的按钮不是表单中的按钮 我将表单创建为模式的子组件 如何使用父组件中的按钮提交表单 我在用React 语义 UI https react semantic ui com collecti
  • HKDF 是在 Java 密码体系结构中实现的吗?

    在我正在写的应用程序中我需要做HKDF https en m wikipedia org wiki HKDF从一个密码派生出两个不同的密钥 在搜索有关如何使用 Java 的示例时 我发现了以下两个 https github com Whis
  • Java:notify() 与 notifyAll() 重头再来

    如果一副护目镜 之间的差异notify and notifyAll 然后会弹出很多解释 抛开javadoc段落 这一切都归结为被唤醒的等待线程的数量 一notify 和所有在notifyAll 然而 如果我确实理解这些方法之间的区别的话 总
  • Android 通过按钮打开菜单

    有没有办法让按钮调用子菜单 我目前有一个菜单 如果他们选择其中一个选项 则会打开一个子菜单 但是我希望能够从 Button 小部件而不是 Menu 对象启动子菜单 Thanks 我不一定推荐这样做 但我能够以编程方式调用子菜单 首先 在 o
  • 我需要route53将域绑定到ec2吗?

    大家好 我是 AWS 世界的新手 1 我有一些第三方 不是亚马逊 购买和注册的域名 我在其中设置 DNS 值 2 我有 EC2 微型实例 在面板中我可以找到公共 DNS 和公共 IP 3 我还有route53服务 A记录绑定到2 中的IP
  • React Native - 使用 React Navigation 动态创建导航器

    我正在使用 React Native 构建一个移动应用程序 并使用 React Navigation 在我的应用程序中构建一个导航器 React 导航为我提供了一种处理抽屉内嵌套选项卡栏的好方法 该抽屉也在 Stack Navigator