2017-06-28 28 views
0

レスキューネイティブで作業を開始しました。問題が発生しました。私はdispatchingアクションで、onLoadStartの画像コンポーネントの機能でコールバックが発砲しています。そのアクションが呼び出され、表示されます。Loading...画面上では、しかし、私はdispatchingonLoadEndで何も起こらない(callback loadEnd is not fired, app looks like frozen)。両方の場所でconsole.logを使用すると、コードは正常に動作しています。誰かが私に何が間違っているのか教えてもらえますか?コールバックでアクションをディスパッチ

class DisplayImage extends Component { 

    loadStart() { 
     this.props.iLoadingFunction(true); 
    } 
    loadEnd() { // <- this function is not fired 
     this.props.iLoadingFunction(false); 
    } 

    render() { 
     if (this.props.isLoading) { 
      return <Text>Loading…</Text>; 
     } 
     return (
      <View> 
       <Image 
       source={{uri: 'https://test.com/image'}} 
       onLoadStart={this.loadStart.bind(this)} 
       onLoadEnd={this.loadEnd.bind(this)} 
       /> 
      </View> 
     ); 
    } 
} 

const mapStateToProps = (state) => { 
    return { 
     isLoading: state.isLoading 
    }; 
}; 
const mapDispatchToProps = (dispatch) => { 
    return bindActionCreators({ iLoadingFunction }, dispatch); 
}; 

export default connect(mapStateToProps, mapDispatchToProps)(DisplayImage); 

アクションと減速

export function iLoadingFunction(bool) { 
    return { 
     type: 'IS_LOADING', 
     isLoading: bool 
    }; 
} 

export function iLoadingFunction(state = false, action) { 
    switch (action.type) { 
     case 'IS_LOADING': 
      return action.isLoading; 
     default: 
      return state; 
    } 
} 
+0

のように、this.props.isLoadingに基づいて、あなたがチェックした場合を除外しますか? –

+0

あなたの括弧が外れていると思います。 componentDidMountはレンダリング関数全体を囲んでいます。また、これら2つのメソッドをcomponentDidMountの外に定義し、内部で呼び出す必要があります。 –

+0

componentDidMountを削除しましたが、コードを貼り付けたときに何か問題があります。私はiLoadingFunctionアクションをチェックして、それも減速機と呼ばれることがわかりますが、ロードは無限に進みます。私はにconsole.log loadStartでアクションを交換するとき は(){ はconsole.log( '開始') } loadEnd() - ストップ{// <この関数は はconsole.log( '停止') を解雇されていません} – mrc

答えて

1

私は問題はアクションとレンダリングが中に発生していることを順序から来ていると思うのは、render機能を見てみましょう:。

render() { 
    if (this.props.isLoading) { 
     return <Text>Loading…</Text>; 
    } 
    return (
     <View> 
      <Image 
      source={{uri: 'https://test.com/image'}} 
      onLoadStart={this.loadStart.bind(this)} 
      onLoadEnd={this.loadEnd.bind(this)} 
      /> 
     </View> 
    ); 
} 

最初コンポーネントがマウントされる時刻this.props.isLoadingfalseであるため、コンポーネントレンダリング

<View> 
    <Image 
     source={{uri: 'https://test.com/image'}} 
     onLoadStart={this.loadStart.bind(this)} 
     onLoadEnd={this.loadEnd.bind(this)} 
    /> 
</View> 

Imageマウントは、イメージのロードを開始し、this.props.iLoadingFunction(true)をディスパッチします。

この時点で、店舗内の更新は、コンポーネントの再レンダリングをトリガーします。コンポーネントは今、元Imageが階層から削除されました

<Text>Loading…</Text> 

をレンダリングするように、この時間this.props.isLoadingは本当です。画像をダウンロードし続けるかどうかは確かではありませんが、処理することを期待しているコンポーネントが削除されたため、onLoadEndハンドラは起動しません。

は、この問題を回避するために、私は `IS_LOADING`が正常に動作している階層内 Imageを残すだけ含めるか Textそう

render() { 
    return (
     <View> 
      { this.props.isLoading && <Text>Loading…</Text> } 
      <Image 
      source={{uri: 'https://test.com/image'}} 
      onLoadStart={this.loadStart.bind(this)} 
      onLoadEnd={this.loadEnd.bind(this)} 
      /> 
     </View> 
    ); 
} 
+0

私はあなたにアプローチしようとしましたが、コンポーネントの小道具this.props.isLoadingがtrueの場合、falseコンポーネントが再びレンダリングされるため、onLoadStartが再び起動されるため、無限レンダリングが行われます。 – mrc

+0

私は正直な@mrc、私は多くの反応ネイティブ、ほとんどの標準的な反応を行っていない。反応では、仮想dom diffingアルゴリズムは 'Image'コンポーネントに触れず、' isLoading'フラグに基づいて 'Text'ノードを挿入して削除するだけです。反応ネイティブは何か似たようなことをやろうとしたおそらく私は間違っていますか? –

+0

ループ内でレンダリング関数が呼び出されたことがわかりました。私は別の解決策を使用しました。私はLoadingのために別のコンポーネントを作成しましたが、今度はローディングだけで小道具のisLoadingの変更を待ちます。したがってImageはもう再レンダリングされません。 – mrc

関連する問題