如何使用 StackNavigator 创建动态路由

Posted

技术标签:

【中文标题】如何使用 StackNavigator 创建动态路由【英文标题】:How to create dynamic routes using StackNavigator 【发布时间】:2018-09-19 14:44:44 【问题描述】:

我正在尝试学习如何在 react-native 上使用 React Navigation,并偶然发现了这篇文章:https://hackernoon.com/getting-started-with-react-navigation-the-navigation-solution-for-react-native-ea3f4bd786a4。它解释了如何创建具有固定路线的 3 级导航。我的问题是,当某些路线应该是动态的时,您如何创建 3 级或更多级别的导航。屏幕结构如下所示:

Physics
    |- Physics 101
         |- Chapter 1
         |- Chapter 2    
         |- Chapter 3
    |- Physics 201
         |- Chapter 1
         |- Chapter 2
         |- Chapter 3
         |- Chapter 4
         |- Chapter 5
    |- Physics 305
         |- Chapter 1
         |- Chapter 2
         |- Chapter 3
         |- Chapter 4
         |- Chapter 5
         |- Chapter 6
         |- Chapter 7
         |- Chapter 8

所以看看那个结构,物理将是包含 3 个固定导航项的主屏幕,当您单击一个时,它将带您到另一个具有更多导航项的屏幕。需要注意的一点是,当您在主屏幕上时,您不会知道每个项目有多少子导航项目,直到您点击一个。

例如,如果您点击物理 101,您将被带到一个屏幕,其中包含 3 条路线,每条路线都将显示该章的内容。点击 Physics 305 将带您进入包含 8 个导航项等的屏幕。

当您在选择一个项目之前不知道需要创建多少条路线/导航项目时,我不太确定如何在那里使用 StackNavigator。

帮助?

更新 这是我现在拥有的代码,它有助于列出Subject,然后点击它会显示所有Units,但我仍然不确定如何创建一个新屏幕,然后列出所有章节单元,其中每个单元的章节数不同。

// router.js
export const SubjectStack = StackNavigator(
  Subjects: 
    screen: Subjects,
    navigationOptions: 
      title: 'Subjects',
    
  ,
  Units: 
    screen: Units,
    navigationOptions: ( navigation ) => (
      title: `$navigation.state.params.title.toUpperCase()`
    )
  
);

export const Root = TabNavigator(
  Subjects: 
    screen: SubjectStack,
    navigationOptions: 
      tabBarLabel: 'Subjects',
      tabBarIcon: ( tintColor ) => <Icon name="list" size=35 color=tintColor />,
    
  ,
  New: 
    screen: New,
    navigationOptions: 
      tabBarLabel: 'Add New Subject',
      tabBarIcon: ( tintColor ) => <Icon name="plus" size=35 color=tintColor />
    
  
);



// Subjects.js
import React,  Component  from 'react';
import 
  Text,
  View,
  ScrollView,
  StatusBar
 from 'react-native';
import  List, ListItem  from 'react-native-elements';
import  units  from '../../config/data';

class Subjects extends Component 
  onLearnMore = (trip) => 
    this.props.navigation.navigate('Units', ...unit);
  ;

  render() 
    return (
      <ScrollView>
        <StatusBar barStyle="dark-content" />
        <List>
           units.map(unit => (
            <ListItem
                key=unit.id
                title=unit.title
                onPress=() => this.onLearnMore(unit)
              />
          ))
        </List>
      </ScrollView>
    );
  


export default Subjects;

【问题讨论】:

通过查看您的结构,我假设章节路由将在 contentstyles 中具有 change 和一些次要功能,因此为它们制作组件和将它们推送到您的堆栈中。这将提高您的效率。 我可以创建一个组件来获取每个章节的数据并相应地格式化它们,我现在遇到的问题是我不知道如何添加另一个可能有 3 个章节的堆栈/一个导航项目,另一个导航项目 10,等等。 【参考方案1】:

你需要的路由结构是

StackNavigator(
   Subject, // physics
   Unit, // Physics 101 , Physics 201 , ..
   Chapter, // Chapter 1, ..
)

您需要传递的数据各不相同,而您需要的方式是在某些操作上从一个跳到另一个。您不需要动态路由,您的内容必须是动态的。

【讨论】:

我添加了到目前为止我所拥有的代码示例,但仍然不确定如何获得列出的章节 哦,是的,我明白了!

以上是关于如何使用 StackNavigator 创建动态路由的主要内容,如果未能解决你的问题,请参考以下文章

StackNavigator 标题未在最简单的示例中显示

StackNavigator 不能嵌套多个级别?

动态尿路感染稳定吗?

StackNavigator中的StackNavigator中的StackNavigator,TabNavigator切换到错误的选项卡

从嵌套的 StackNavigator 中隐藏 TabBar 的反应导航屏幕

在 React Native 中使用 StackNavigator 时添加默认字体