2017-09-25 43 views
0

私はあるコンポーネントから別のコンポーネントに値を渡すのに苦労しています。私は、タブナビゲータを使用して、ここで私のアプリの設定だよreact-native tab navigator search boxネイティブ・パス・プロップを別のコンポーネントに反応させる

index.js(タブの設定をレンダリング)

ルータそれは部分的に解決された前の質問から問題の続きです。 JS

searchHeader.js

tab1.js

タブ2.js

などのタブが、私は、タブの名前を取得しています変更されindex.jsで

。それをsearchHeader.jsに渡して、プレースホルダテキストを更新したいと思います。

searchHeader.jsは直接の子ではなくindex.jsにインポートされません。どのように値を渡すのですか?あなたはおそらくsetParamsメソッドを使用してnavigation propとしてそれを渡すことができ

index.js

import React, { Component } from 'react'; 
import { Root, Tabs } from './config/router'; 
import { Alert,View } from 'react-native'; 

class App extends Component { 


constructor(props) { 
super(props); 
this.state = { 
searchText: '', 
} 
} 

_getCurrentRouteName(navState) { 

if (navState.hasOwnProperty('index')) { 
    this._getCurrentRouteName(navState.routes[navState.index]) 
} else { 
    if (navState.routeName==='One') { 
     this.setState({searchText:'Search One'}) 
    } 
    if (navState.routeName==='Two') { 
     this.setState({searchText:'Search Two'}) 
    } 
    if (navState.routeName==='Three') { 

     this.setState({searchText:'Search Three'}) 
    } 
    if (navState.routeName==='Four') { 
     this.setState({searchText:'Search Four'}) 
    } 
} 

} 
render() { 
return ( 
    <Root onNavigationStateChange={(prevState, newState) => { 
     this._getCurrentRouteName(newState) 
    }} /> 

    ) 


    } 
} 

export default App; 

router.js

...  

export const Root = StackNavigator({ 
Tabs: { 
screen: Tabs, 
navigationOptions: { 
header: <SearchHeader data={'Test'} /> 
    } 
    }, 
}, { 
    mode: 'modal', 
}); 

searchHeader.js

import React, { Component } from 'react'; 
import { View,Text,Dimensions,Alert } from 'react-native'; 
import { SearchBar } from 'react-native-elements'; 

class SearchHeader extends Component { 

    constructor(props) { 
super(props); 
    this.state = { 
    placeholder: "Search One" 
    } 

} 


render() { 
    return (
<SearchBar 
    noIcon 
    containerStyle={{backgroundColor:'#fff'}} 
    inputStyle={{backgroundColor:'#e3e3e3',}} 
    lightTheme = {true} 
    round = {true} 
    placeholder={data} 
    placeholderTextColor = '#000' 
/> 
); 
} 

}; 

export default SearchHeader; 
+0

コード例が役に立ちます。 – jdv

+0

コードが追加されました –

+0

Mobx(https://mobx.js.org)やReduxなどの状態管理ライブラリを使用できます。アプリが単純ならば、Reduxは残忍かもしれません。 –

答えて

0

代替、あなたのアプリケーションの範囲に応じて、そのよう再来やMobXなどの状態ライブラリを見てだろう - それは、小さなアプリケーションの場合は、Reduxを使用することができるため、それはやり過ぎ

+0

ええ、私はsetParamsを試しましたが、この例でどのように役立つかを示すことができれば、正しい方法でそれをやっているのかどうかは分かりません。私はreduxを見てきましたが、私が取り組んでいるもののためにそれが必要なのかどうかはわかりません。 –

+0

ここで、MobXを使ったシンプルなストアをセットアップしました。これはすべて正常に機能しています。私が持っている問題は、私はまだ同じ状況にあるということです。タブをレンダリングするルートクラスはプロバイダであり、ストアは使用できないためストアを編集することはできません。これは、現在のタブの名前を取得する必要がある場所です。これがどのように機能するのか理解するのに苦労している。 –

0

だ、あなたはこの構造は働くかもしれ

+0

そうですね、私はredux –

0

...そして、あなたのコンポーネントがそのストアに接続し、選択された減速機(S)と派遣アクションとその小道具をバインドすることができ、

を共有プロパティと値を置くことができる店舗を持っています。

class Home extends Component { 
    func(val) { 
     this.setState({value: val}); 
    } 
    render() { 
     return (
      <View> 
       <Two func={(val) => this.func(val)} /> 
      </View> 
     ) 
    } 
} 

class Two extends Component { 
    render() { 
     return (
      <View> 
       <Button title="set" onPress={() => this.props.func('data')} /> 
      </View> 
     ) 
    } 
} 
+0

を見ていました。親が子をレンダリングしているにもかかわらず、子コンポーネントに小道具を渡す通常の方法ですが、それは私の構造ではありません。 –

関連する問題