与承诺一起使用处理程序可能/安全吗? 例如:异步重组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);
它帮助我克服不足,以反映graphQl突变的结果与Apollo client的包裹成分的能力。这可以完美地处理它,而不需要组件本身的副作用。
但也存在一些问题,当我们用这样的:
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});
}
}
})
)
因为props
引用之后,我们确实await props.loginUser(args)
丢失。然后我们在错误之后使用它。
我们应该注意不要像上面那样使用它。
我不明白'props'基准丢失。这不是,你甚至不使用它。也许你的意思是终于没有运行。如果'loginUser(args)'更改应用程序状态,以便卸载已包装的组件,那么这很有意义。或者你可以详细说明一下吗?我们广泛使用'recompose',并且绝对没有问题。 – DavidC
我的意思是说'props'等于'this.props',但是在你设置了loginLoginStatus并等待loginUser后(setLoginStatus就像this.setState),那么参数'props'不等于'this.props' ....它就像:'const props = this.props; this.setState({XXX}); api()。then(_ => console.log(props == this.props));'它会记录'false' ... – xialvjun
我建议不要考虑重组作为一个有状态的组件你的'await props.loginUser(args);'会改变更高组件中的道具,并且会触发组件树的重新计算,这就是为什么在这个'await'后道具可能会有所不同,如果loginUser更改组件层中的道具(但只有当你传递这个信息的时候)。这就是为什么通常如果你使用例如分支(决定是否显示登录或用户数据),在loginUser之后你的组件将被卸载,将成为无操作。 – DavidC
是的,它是安全的,并可能 – wuct