2016-10-12 11 views
5

次のコードでは、Router/NavigationProviderが提供するすべてのコンポーネントにデータベース変数をpropsとして渡す最も良い方法は何ですか?ExNavigation:すべてのルータコンポーネントに小道具を渡す方法は?

import { 
    createRouter, 
    NavigationProvider, 
    StackNavigation, 
} from '@exponent/ex-navigation' 

const Router = createRouter(() => ({ 
    jobs:() => Jobs, 
    sample:() => Sample 
})) 

render() { 
    const database = this.openDatabase() 
    <NavigationProvider router={Router}> 
     <StackNavigation initialRoute={Router.getRoute('home')} /> 
    </NavigationProvider> 
} 

ありがとう!

+0

これをやり方で解決しましたか?私は[ex-navigationコンポーネント](https://github.com/exponent/ex-navigation)で同じことを達成しようとしています。いくつかのスニペットを分かち合うことができたら助けになるでしょう。 –

+0

この例では、受け入れられた答えが私のために解決しました。単にファイル(services/database.js)を作成し、必要に応じてdbインスタンスをインポートしてください。 – cmrichards

+0

@chrichards:ありがとう! –

答えて

-2

データベース接続をエクスポートし、使用するコンポーネントにインポートする新しいjavascriptファイルを作成する必要があります。

データベース接続をコンポーネントの小道具として与える上位コンポーネントを作成することもできます。 ExNavigationに組み込まれているwithNavigation、またはReduxのReactバインディングに付属のconnectに似ています。

しかし、HOCは少し進んだ話題です(ただし、把握するのは難しくありません)。ここではHOCがない例です。

サービス/ database.js

// Open database connection here and export it like any other module. 
// The following is pseudo code to illustrate example 

import { database } from 'database' 
export default database.connect() 

routes.js

import Jobs from './containers/Jobs' 
import Sample from './containers/Sample' 
import { createRouter } from '@exponent/ex-navigation' 

const Router = createRouter(() => ({ 
    jobs:() => Jobs, 
    sample:() => Sample 
})) 

export default Router 

App.js

import React from 'react' 
import { 
    NavigationProvider, 
    StackNavigation, 
} from '@exponent/ex-navigation' 

const App =() => (
    <NavigationProvider router={Router}> 
    <StackNavigation initialRoute={Router.getRoute('home')} /> 
    </NavigationProvider> 
) 

export default App 

容器/ Jobs.js

import React, { Component } from 'react' 

// Import database connection in every container component you wish to use it 
import databaseConnection from '../services/database' 

export default class Jobs extends Component { 
    state = { 
    jobs: [] 
    } 

    componentDidMount() { 
    databaseConnection 
     .get('jobs') 
     .then(jobs => this.setState({ jobs })) 
    } 

    render() { 
    return (
     {this.state.jobs.map(job => 
     // Render jobs 
    )} 
    ) 
    } 
} 
+1

ありがとう。私はHOCに精通しており、どのように恩恵を受けることができるのですかあなたは正しいですし、あなたの例はそれを行う最も簡単な方法です。私は他のルータで使用したようなpassPropsオプションをいくつか見逃してしまったのだろうかと思っただけです。 – cmrichards

+1

あなたの例では、あなたは小道具として渡されていません、子コンポーネントから 'databaseConnection'にアクセスしています。 'App'コンポーネントからどのように渡しますか? –

+0

ええ、これは本当に答えではありません。あなたが小道具として通過したいのであれば(そして私もそれをやりたがっているケースがある)、ex-navigationはあなたに答えがないようです。 –

関連する問題