2017-06-19 12 views
1

componentDidMount()メソッドでfetch(url, ...)のReact Nativeでデータを取得します。componentDidMountでデータを取得中に警告が発生しました。「マウントまたはマウントされたコンポーネントのみを更新できます」

だから私のクラスでは、私がreduxredux-persistを使用して起動するまで、それがうまく働いていたすべての

class Posts extends Component { 
    state = { 
    posts: [] 
    }; 

    componentDidMount() { 
    fetch('https://...').then(res => res.json()).then(res => { 
     this.setState({ posts: res.posts }); 
    } 
    } 

    render() { 
    return <FlatList data={this.state.posts} ... />; 
    } 
} 

ようになります。

今すぐ警告が表示されます。Warning: Can only update a mounted or mounting component. ...

componentDidMountで呼び出された場合にマウントする必要があるため、なぜこのようなことが起こっているのか分かりません。

componentWillUnmountでフェッチを中止する必要があるのか​​、実際にデータを一時的に 'ローカルコンポーネント'に格納するのではなく、reduxストアに実際にフェッチする必要があるのだろうかと思います。他のほとんどのアプリを開くと、アプリを開いたときにデータが既に読み込まれているように見えます。これは非常に高速なデータ検索やデータを永続的なストアに保存しているためですか?

私はif (this.isMounted) { .. }componentDidMountの内部で使用するいくつかのプロジェクトを見てきましたが、この方法のライフサイクルを理解しているので、この時点でコンポーネントが常にマウントされていました。また、isMountedは推奨されていません。

私は間違っていますか?この問題はアプリを起動したときにのみ発生するため、別のルートに移動してからこのルートに戻ると問題はありません。

答えて

2

fetchは非同期なので、データが到着したときにコンポーネントがマウントされないことがあります。 thenの中の矢印機能が呼び出されているとき、コンポーネントはすでにマウントを完了し、おそらくレンダリングを続けていました。これはPromiseの性質です。

あなたは、それはこのように、国の設定時にコンポーネントがまだマウントされていることを確認する必要があります。

class Posts extends Component { 
    state = { 
    posts: [] 
    }; 

    componentDidMount() { 
    this.mounted = true; 
    fetch('https://...').then(res => res.json()).then(res => { 
     if(this.mounted) this.setState({ posts: res.posts }); 
    } 
    } 

    componentWillUnmount() { 
    this.mounted = false; 
    } 

    render() { 
    return <FlatList data={this.state.posts} ... />; 
    } 
} 
+0

ありがとう!できます!しかし、このアプローチは私にはちょっと変わったようです。代わりにreduxでデータを取得するのは意味がありますか? – Jamgreen

+1

私はreduxで働いていますが、私はそれをしますが、それは常に意味をなさないと思います。はい、reduxはマウント(接続のため)の心配を解消しますが、キャッシュを解除するかどうかによって、データをメモリから消去する必要があります。 このデータを混乱の少ない状態で取得し、グローバル状態(常に適合しない)に保つことを約束しない別の方法があります。私のお気に入りは「再構成」です。 –

+0

なぜこの方法が最善の方法ではないかという考えのための食べ物:https://reactjs.org/blog/2015/12/16/ismounted-antipattern.html – Martin

関連する問題

 関連する問題