2016-11-08 6 views
0

私は 'Navigator'を使用してルートごとに複数のコンポーネントをレンダリングしています。ロードに時間がかかるので、コンポーネントにレンダリングする前にローダーを表示したい(イメージやテキストの「Loading ...」など)。私のコードを見直して、どこでローダーを使うべきか教えてください。 Route.jsコンポーネントの読み込み時間

import React from 'react'; 
import { 
    Platform, 
    StyleSheet, 
    Text, 
    View, 
    Image, 
    ListView, 
    TouchableHighlight, 
    Navigator, 
    TouchableOpacity, InteractionManager 
} from 'react-native'; 

import Home from './Home'; 
import Tomo from './App'; 
import Profile from './Profile'; 

var SCREEN_WIDTH = require('Dimensions').get('window').width; 
var BaseConfig = Navigator.SceneConfigs.FloatFromRight; 
var CustomLeftToRightGesture = Object.assign({}, BaseConfig.gestures.pop, { 
    snapVelocity: 10, 
    edgeHitWidth: SCREEN_WIDTH, 
}); 
var CustomSceneConfig = Object.assign({}, BaseConfig, { 
    springTension: 300, 
    springFriction: 10, 
    gestures: { 
    pop: CustomLeftToRightGesture, 
} 
}); 

export default class Route extends React.Component { 
    constructor(props, context) { 
    super(props, context); 
    this.state = {renderPlaceholderOnly: true}; 
    } 

    componentDidMount() { 
    InteractionManager.runAfterInteractions(() => { 
     this.setState({renderPlaceholderOnly: false}); 
    }); 
    } 

    _configureScene(route) { 
    return CustomSceneConfig; 
    } 

    render() { 
    if (this.state.renderPlaceholderOnly) { 
     return this._renderPlaceholderView(); 
    } 
    return (
     <Navigator 
      initialRoute={{id: 'Home'}} 
      configureScene={this._configureScene} 
      renderScene={this.navigatorRenderScene} 

     /> 
    ); 
    } 

    _renderPlaceholderView() { 
    return (
     <View> 
     <Text>Loading...</Text> 
     </View> 
    ); 
    } 

    header() { 
    return (
     <View> 
     <Text>Loading...</Text> 
     </View> 
    ); 
    } 

    navigatorRenderScene(route, navigator) { 
    _navigator = navigator; 
    switch (route.id) { 
    case 'Home': 
     return (<Home navigator={navigator} title="Home"/>); 
    case 'Tomo': 
     return (<Tomo navigator={navigator} title="Tomo"/>); 
    case 'Profile': 
     return (<Profile navigator={navigator} title="Profile" />); 
    } 
    } 
} 

ありがとうございました。

+0

コンポーネントをロードする前にネットワーク操作を行っていますか? – Jickson

+0

いいえ、コンポーネントをレンダリングするだけです。コンポーネントのうちの1つは、ロードする時間がかかるように、より多くのファイルを含みます。 –

+0

あなたが投稿したコードに問題はありません。ソースから目的地のコンポーネントまでナビゲート中に遅延を引き起こしているコンポーネントのコードを投稿できますか? – Jickson

答えて

0

他のコンポーネントのコンテナとして基本コンポーネントを作成します(HomeTomoProfile)。このコンテナには、Loadingコンポーネントも含まれています。したがって、このコンテナ内のすべてのコンポーネントにローディング効果があります。

class BaseContainer extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     showLoading: true 
    } 
    } 

    render() { 
    ...... 

    return (
     {this.props.children} 
     { 
     this.state.showLoading ? <Loading /> : '' 
     } 
    ); 
    } 

    ...... 
} 
+0

ジェイソンに感謝します。私はネイティブの反応が新しく、Navigatorコードを持つRoute.jsファイルをどこで使うべきかを知りたい:render(){\t navigatorRenderScene (ルート、ナビゲータ){ _navigator = navigator; switch(route.id){\t \t case 'Home': return(); ケース「トモ」: リターン(<トモナビゲータ= {ナビゲータ} title = "トモ" />); case 'Profile': return(<プロファイルナビゲータ= {navigator} title = "Profile" />); } } –

+0

と私はいつshowLoading状態(this.state.showLoading)をfalseにしておきますか? –

+0

ルーティングにコンポーネントを使用していますか? 'react-native-router'(https://github.com/t4t5/react-native-router)のように、あなたのアプリのルートに適したものを選ぶ方が良いでしょう。時間のかかる作業をしただけで、showLoading状態を 'false'に変更すると、コンポーネントは' Loading'コンポーネントなしで再びレンダリングされます。 –

関連する問題