【问题标题】:Routing with React Navigation in React Native在 React Native 中使用 React Navigation 进行路由
【发布时间】:2017-11-07 17:22:28
【问题描述】:

我正在使用 React Native 创建一个应用程序,并且我正在使用 React Navigation。在主页中,我有一系列服务。我希望能够根据服务的索引路由到应用程序中的不同屏幕。这是代码的sn-p。我怎么做?

import React, { Component } from 'react'
import {
  StyleSheet,
  Text,
  TextInput,
  View,
  TouchableHighlight,
  ActivityIndicator,
  AppRegistry,
  Image
} from 'react-native';
import { StackNavigator } from 'react-navigation';
import { addNavigationHelpers } from 'react-navigation';
import SelectMultiple from './SelectMultiple';
import PackingPage from './PackingPage';

const services = 
['Packing Items in Boxes for Shipping and Moving', 
'Unpacking Boxes', 
'Wrap Furniture for Moving and Shipping',
'Wrap Machinery',
'Loading / Lumper Services',
'Unloading / Lumper Services',
'Custom Crating for Boxes, Furniture and Machinery',
'Palletizing Services for Boxes, Furniture and Machinery',
'Shipping / Moving Service to 2nd location',
'Heat Shrink wrapping',
'Shipping Food in AC trucks',
'Shipping Food in Non AC Truck',
'Shipping Cars']

class PackingApp extends Component{

  static navigationOptions = {
    title: '',
  };

  state = { selectedServices: [] }

  onSelectionsChange = (selectedServices) => {
    this.setState({ selectedServices })
  }

到目前为止,我还有一个用于堆栈导航器的 sn-p 代码,它有两个屏幕。我想根据其索引为每个服务添加一个屏幕。我试过用 if/else 来做这件事,但我无法让它工作。

const PackingNav = StackNavigator({
  Home: { screen: HomePage },
  PackingPage: { screen: PackingPage },
}, 
{
  headerMode: "none"
});

【问题讨论】:

  • 您的服务数组只是一个字符串数组。您需要为每个屏幕(或服务)创建一个组件,然后将其添加到 StackNavigator,就像您刚刚为其他两个屏幕所做的那样。
  • 是的,每个屏幕都有一个组件。每个服务应该对应一个屏幕。如何使用服务元素的索引来路由到其对应的屏幕?

标签: javascript arrays react-native react-jsx react-navigation


【解决方案1】:

没有自动方式将 React Navigation 中的屏幕连接到您的服务阵列,您需要手动完成:

const services = [
   { key:'SomeUniqueIdentifier', name:'Packing Items in Boxes for Shipping and Moving' },
   { key:'AnotherUniqueIdentifier', name:'Unpacking Boxes' },
   ...
];

const PackingNav = StackNavigator({
   Home: { screen:HomePageComponent },
   SomeUniqueIdentifier: { screen:PackingPageComponent },
   AnotherUniqueIdentifier: { screen:UnpackingPageComponent },
   ...
});

然后在您的HomePageComponent(或您链接到服务的任何组件)中,您可以执行以下操作:

render() {
   const { navigate } = this.props.navigation;
   let menu = [];
   services.forEach(service => {
      menu.push(<Button
         onPress={() => navigate(service.key)}
         title={service.name}
      />);
   });
   return (
      <View>
         {menu}
      </View>
   );
}

【讨论】:

  • 太棒了!我还有两个问题。我希望能够选择多个选项,并且一旦选择了不同颜色的选项。例如,如果选择了打包选项,则一旦按下页面按钮上的下一步按钮,该选项将改变颜色并路由到打包页面。但是,如果同时选择了打包和解包选项,则选项将路由到单个页面,该页面将打包页面堆叠在解包页面的顶部。如果选择了更多选项,它应该做同样的事情。我该怎么做呢?
  • 所选选项的开/关状态是您在 React Navigation 之外管理的。一种方法是在组件上有一个selectedOptions state 属性,每当切换选项时更新该属性(并根据选项是否在该selectedOptions state 属性中应用样式),然后在最后,当点击时,调用 React Navigations navigate() 并将 selectedOptions 列表作为参数传递(参见 reactnavigation.org/docs/navigators/navigation-actions),该参数可用于决定在该页面上呈现哪些组件。
猜你喜欢
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多