約束のあるハンドラで使用することは可能ですか安全ですか? 例:withHandlers ...非同期で再構成しますか?
withHandlers({
onChange: props => event => {
props.callAPI(props.data)
.then(data => props.updateData(data))
},
...
ありがとう!
約束のあるハンドラで使用することは可能ですか安全ですか? 例:withHandlers ...非同期で再構成しますか?
withHandlers({
onChange: props => event => {
props.callAPI(props.data)
.then(data => props.updateData(data))
},
...
ありがとう!
いくつかのテストの後、私はそれがかなりうまく動作していることを認識しました。 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突然変異の結果を反映する能力の欠如を克服するのに役立ちます。これは、コンポーネント自体に副作用を必要とせずに完全に処理します。
しかし、我々はこのようにそれを使用する場合、いくつかの問題があります。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});
}
}
})
)
。それが間違ってしまった後に使用します。
上記のように使用しないでください。
安全で可能です。それはあなたではなく、あなたはそれを使用していません。おそらく、最終的には実行されないことを意味します。 'loginUser(args)'がアプリ状態を変更して、ラップされたコンポーネントがアンマウントされた場合には意味があります。それとももう少し詳しく説明できますか?我々は 'recompose'を広範囲に使用しており、絶対に問題はありません。 – DavidC
'props'が' this.props'と同じであることを意味しますが、 'setLoginStatusとawait loginUser'(' setLoginStatus'は 'this.setState'に似ています)の後、引数' props'は'this.props' ....これはちょうど' const props = this.props; this.setState({xxx}); – xialvjun
私はステートフルなコンポーネントとして再構成を考えないことをお勧めします(そして、考えていないと思っています。あなたの '' props.loginUser(args);を待つのは、上位のコンポーネントの小道具を変更し、それがコンポーネントツリーの再計算を引き起こすからです。それで、 '' await''の後に、loginuser (しかし、あなたがこの情報を渡す場合にのみ)、なぜなら、通常はexampleブランチを使用すると(loginまたはuserデータを表示するかどうかを決めるため)、loginUserの後にコンポーネントがアンマウントされ、ノーオペになります。 – DavidC
はい、それは私が 'props'参照が失われていることを理解していない – wuct