2016-10-12 21 views
5

Trong đoạn mã sau, cách tốt nhất để chuyển biến cơ sở dữ liệu làm đạo cụ cho tất cả các thành phần được Router/NavigationProvider phục vụ là gì?ExNavigation: cách truyền đạo cụ cho tất cả các thành phần của bộ định tuyến?

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> 
} 

Cảm ơn!

+0

bạn đã giải quyết vấn đề này theo cách chưa? Tôi đang cố gắng đạt được điều tương tự với [thành phần điều hướng cũ] (https://github.com/exponent/ex-navigation). Sẽ giúp đỡ nếu bạn có thể chia sẻ một số đoạn trích. –

+0

Câu trả lời được chấp nhận đã giải quyết nó cho tôi trong trường hợp này. Chỉ cần tạo một tệp (services/database.js) và nhập khẩu cá thể db khi bạn cần nó – cmrichards

+0

@chrichards: Tôi thấy, cảm ơn! –

Trả lời

-2

Bạn nên tạo tệp javascript mới xuất kết nối cơ sở dữ liệu của bạn và nhập nó vào thành phần bạn muốn sử dụng.

Bạn cũng có thể tạo thành phần thứ tự cao hơn cho phép kết nối cơ sở dữ liệu như một biện pháp chống đỡ cho thành phần của bạn. Điều này tương tự như withNavigation được tích hợp sẵn trong ExNavigation hoặc connect đi kèm với các ràng buộc React của Redux.

Tuy nhiên, vì HOC là một chủ đề nâng cao chút ít (nhưng không khó nắm bắt!) Đây là một ví dụ không có nó.

dịch vụ/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 

vùng chứa/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

Cảm ơn vì điều đó. Tôi quen thuộc với HOC và cách redux hoạt động. Bạn đang phải mặc dù và ví dụ của bạn là cách đơn giản nhất để làm điều đó. Tôi chỉ tự hỏi nếu tôi đã thiếu một số loại passProps tùy chọn như tôi đã sử dụng trong các router khác. – cmrichards

+1

Nhưng trong ví dụ của bạn, bạn không đi qua như đạo cụ, bạn đang truy cập vào 'databaseConnection' từ thành phần con. Làm cách nào để chuyển nó vào từ thành phần 'App'? –

+0

Vâng, đây thực sự không phải là câu trả lời. Nếu bạn muốn đi qua như đạo cụ (và tôi cũng có trường hợp mà tôi muốn làm chính xác điều đó), có vẻ như chuyển hướng cũ không có câu trả lời cho bạn. –

Các vấn đề liên quan