2017-01-17 3 views

答えて

3

いくつかのテストの後、私はそれがかなりうまく動作していることを認識しました。 Recompose純粋な部品を使用して建築するための岩。

これは完全に有効であり、かなりうまく機能しています。

const enhWithHandlers = withHandlers({ 
    loginUserMutation: props => args => { 
    props.updateMutationState(loading: true, error: null }); 
    props.loginUser(args) 
     .then(() => 
     props.updateMutationState({loading: false, error: null })) 
     .catch(err => 
     props.updateMutationState({ loading: false, error: err })); 
    } 
}, 
... 
// then compose like 
export default compose(
    reduxConnect, 
    gqlConnectLogin, 
    gqlConnectRegister, 
    enhWithState, 
    enhWithHandlers 
)(UserLoginRegister); 

それは私がラップコンポーネントにApollo clientでgraphQl突然変異の結果を反映する能力の欠如を克服するのに役立ちます。これは、コンポーネント自体に副作用を必要とせずに完全に処理します。

+0

はい、それは私が 'props'参照が失われていることを理解していない – wuct

0

しかし、我々はこのようにそれを使用する場合、いくつかの問題があります。props参照が実際に我々await props.loginUser(args)後に失われているので

compose(
    withState('loginStatus', 'setLoginStatus', {loading: false, error:null}), 
    withHandlers({ 
    loginUserMutation: props => async args => { 
     try { 
     props.setLoginStatus({loading: true, error: null}); 
     await props.loginUser(args); 
     } catch(error) { 
     props.setLoginStatus({...props.loginStatus, error}); 
     } finally { 
     props.setLoginStatus({...props.loginStatus, loading: false}); 
     } 
    } 
    }) 
) 

。それが間違ってしまった後に使用します。

上記のように使用しないでください。


+0

安全で可能です。それはあなたではなく、あなたはそれを使用していません。おそらく、最終的には実行されないことを意味します。 'loginUser(args)'がアプリ状態を変更して、ラップされたコンポーネントがアンマウントされた場合には意味があります。それとももう少し詳しく説明できますか?我々は 'recompose'を広範囲に使用しており、絶対に問題はありません。 – DavidC

+0

'props'が' this.props'と同じであることを意味しますが、 'setLoginStatusとawait loginUser'(' setLoginStatus'は 'this.setState'に似ています)の後、引数' props'は'this.props' ....これはちょうど' const props = this.props; this.setState({xxx}); – xialvjun

+0

私はステートフルなコンポーネントとして再構成を考えないことをお勧めします(そして、考えていないと思っています。あなたの '' props.loginUser(args);を待つのは、上位のコンポーネントの小道具を変更し、それがコンポーネントツリーの再計算を引き起こすからです。それで、 '' await''の後に、loginuser (しかし、あなたがこの情報を渡す場合にのみ)、なぜなら、通常はexampleブランチを使用すると(loginまたはuserデータを表示するかどうかを決めるため)、loginUserの後にコンポーネントがアンマウントされ、ノーオペになります。 – DavidC

関連する問題