2017-05-05 32 views
1

私はまだReact Nativeに少し新人ですが、私はそれがほしいと思う方法でほとんど働いているアプリを持っています。私はApp.jsTabBarIOSコンポーネントを使用して、画面の下部にタブ付きナビゲーションを表示しています。あなたは、タブをタッチすると、状態の更新と関連するコンテンツが読み込まれて表示されます。反応ネイティブフラックスルーターで小道具を渡す

App.js

import React, { Component } from 'react'; 
import { TabBarIOS, Platform, Image } from 'react-native'; 

import IconII from 'react-native-vector-icons/Ionicons'; 
import IconMCI from 'react-native-vector-icons/MaterialCommunityIcons'; 

import Colors from './Colors'; 
import RouterItem1 from './routers/RouterItem1'; 
import RouterItem2 from './routers/RouterItem2'; 
import RouterHome from './routers/RouterHome'; 
import Settings from './components/Settings'; 

class FooterNav extends Component { 

    state = { 
    selectedTab: 'home', 
    }; 

    handleClick = (routeData) => { 
    console.log('This has received data', routeData); 
    this.setState({ selectedTab: routeData }); 
    console.log(this.state); 
    } 

    renderCurrentView() { 
    switch (this.state.selectedTab) { 
     case 'home': 
     return (
      <RouterHome handleClick={this.handleClick} /> 
     ); 
     case 'item2': 
     return (
      <RouterItem2 /> 
     ); 
     case 'item1': 
     return (
      <RouterItem1 /> 
     ); 
     case 'settings': 
     return (
      <Settings /> 
     ); 
     default: 
     return false; 
    } 
    } 

    render() { 
    return (
     <TabBarIOS 
     unselectedTintColor={Colors.third}  //Unselected labels 
     unselectedItemTintColor={Colors.third} //Unselected icons 
     tintColor={Colors.brandPrimary}  //Selected 
     barTintColor={Colors.light}   //Bar background 
     > 
     <IconII.TabBarItem 
      title="Home" 
      iconName="ios-home-outline" 
      selectedIconName="ios-home" 
      selected={this.state.selectedTab === 'home'} 
      receiveData={this.receiveData} 
      onPress={() => { 
      this.setState({ 
       selectedTab: 'home', 
      }); 
      }} 
     > 
      {this.renderCurrentView()} 
     </IconII.TabBarItem> 
     <TabBarIOS.Item 
      icon={require('./images/[email protected]')} 
      selectedIcon={require('./images/[email protected]')} 
      title="item2" 
      selected={this.state.selectedTab === 'item2'} 
      onPress={() => { 
      this.setState({ 
       selectedTab: 'item2', 
      }); 
      }} 
     > 
      {this.renderCurrentView()} 
     </TabBarIOS.Item> 
     <IconMCI.TabBarItem 
      title="item1" 
      iconName="cookie" 
      selectedIconName="cookie" 
      selected={this.state.selectedTab === 'item1'} 
      onPress={() => { 
      this.setState({ 
       selectedTab: 'item1', 
      }); 
      }} 
     > 
      {this.renderCurrentView()} 
     </IconMCI.TabBarItem> 
     <IconII.TabBarItem 
      title="More" 
      iconName="ios-more-outline" 
      selectedIconName="ios-more" 
      selected={this.state.selectedTab === 'settings'} 
      onPress={() => { 
      this.setState({ 
       selectedTab: 'settings', 
      }); 
      }} 
     > 
      {this.renderCurrentView()} 
     </IconII.TabBarItem> 
     </TabBarIOS> 
    ); 
    } 
} 

module.exports = FooterNav; 

react-native-router-fluxは素晴らしいプラグインです、それはルータに引っ張るいったん流れが正確です私はそれが欲しいものです。

RouterHome.js

import React from 'react'; 
import { Scene, Router } from 'react-native-router-flux'; 

import styles from '../Styles'; 
import { content } from '../content.js'; 

import AnotherScene from '../components/pages/AnotherScene'; 
import Home from '../components/Home'; 

const RouterHomeComponent =() => { 
    return (
    <Router 
     sceneStyle={styles.sceneStyle} 
     navigationBarStyle={styles.navBar} 
     titleStyle={styles.navBarTitle} 
     barButtonIconStyle={styles.barButtonIconStyle} 
    > 
     <Scene 
     key="Home" 
     component={Home} 
     title={content.heading} 
     hideNavBar 
     /> 
     <Scene 
     key="AnotherScene" 
     component={AnotherScene} 
     title='title' 
     hideNavBar={false} 
     /> 
    </Router> 
); 
}; 

export default RouterHomeComponent; 

ロードされているデフォルトのビューは<Home>モジュールです::私が持っている唯一の問題は、<RouterHome>モジュールである

Home.js

import React, { Component } from 'react'; 
import { Text, View, TouchableOpacity } from 'react-native'; 
import { Actions } from 'react-native-router-flux'; 

import styles from '../Styles'; 
import { content } from '../content.js'; 

class Home extends Component { 

    displayItem1 =() => { 
    this.props.handleClick('item1'); 
    } 
    displayItem2 =() => { 
    this.props.handleClick('item2'); 
    } 
    displayAnotherScene() { 
    Actions.AnotherScene(); 
    } 

    render() { 
    return (
     <View style={styles.viewWrapperHome}> 

     <Text style={styles.heading}>{content.greeting}</Text> 

     <TouchableOpacity onPress={this.displayItem1}> 
      <Text>First item</Text> 
     </TouchableOpacity> 
     <TouchableOpacity onPress={this.displayItem2}> 
      <Text>Second item</Text> 
     </TouchableOpacity> 
     <TouchableOpacity onPress={this.displayAnotherScene}> 
      <Text>Another scene</Text> 
     </TouchableOpacity> 

     </View> 
    ); 
    } 
} 

export default Home; 

私は、ユーザーが画面に表示された最初の2つのボタン(First item/Second item)をクリックすると、小道具はApp.jsに戻され、状態が変更され、シーンが更新されます。基本的には、フッターメニューを使用せずにナビゲートする代替方法です。

react-native-router-fluxモジュールを使用しないと動作しないことがわかりました。問題は、<Home>モジュールの他のページを処理する必要があるということです。

誰もが私のApp.jsにルータ経由で小道具を返すことができる方法を提案することはできますか?

+0

'react-native-router-flux'を使用しないでください。ライブラリは廃止予定のコードに基づいて作成され、コミュニティはゆっくりと' react-navigation'に移行します。今や、「反応ナビゲーション」は完全な解決策ではなく、コミュニティの注目を集めるでしょう。 – vonovak

答えて

4

さて、私は実際にこれを理解しました。それは完全に私の欠点であることが判明しました。小道具はRouterHomeに渡されていなかったので、彼らはいずれかの側を失った。新しいRouterHomeは次のようになります。

RouterHome.js

import React from 'react'; 
import { Scene, Router } from 'react-native-router-flux'; 

import styles from '../Styles'; 
import { content } from '../content.js'; 

import AnotherScene from '../components/pages/AnotherScene'; 
import Home from '../components/Home'; 

const RouterHomeComponent = (props) => {  <---Didn't add props 
    return (
    <Router 
     sceneStyle={styles.sceneStyle} 
     navigationBarStyle={styles.navBar} 
     titleStyle={styles.navBarTitle} 
     barButtonIconStyle={styles.barButtonIconStyle} 
    > 
     <Scene 
     key="Home" 
     component={Home} 
     title={content.heading} 
     hideNavBar 
     handleClick={props.handleClick}  <---Didn't pass props 
     /> 
     <Scene 
     key="AnotherScene" 
     component={AnotherScene} 
     title='title' 
     hideNavBar={false} 
     /> 
    </Router> 
); 
}; 

export default RouterHomeComponent; 

私は私が作った2つの変更をマークしました。うまくいけば、これは誰かを助けるでしょう! :)

関連する問題