有一个很常见的需求, 在用户注册成功之后跳转到主页, 对应的action
可能如下:
// SignupAction.js
export const signupRequest = (userData) => {
return dispatch => {
dispatch(signupPending())
return axios.post('/api/user', userData)
.then(res => dispatch(signupSuccess()))
.then(() => {
// history.push('/')
// 这里该如何得到 history 对象?
})
.catch(error => dispatch(signupFailure(error.message)))
}
}
可以看到, 在signupRequest
这个 action 里面, 无法直接使用 react-router
里面的history
对象
当然我可以这样改, 比如给signupRequest
添加第二个参数, 就是history
对象本身: signupRequest(userData, history)
, 也可以传一个回调过去:signupRequest(userData, callback)
, 不知道使用哪种方法或者有更好的思路?
自己还想过另外一种, 之前代码都是将相关逻辑全部放到action
里面, 也可以将逻辑放到组件内部处理, action
里只做异步请求, 但是似乎这样就没有太多意义了, 比如代码可能是这样:
// signupAction.js
export const signupRequest = (userData) => {
return dispatch => {
return axios.post('/api/users', userData);
}
}
// signupForm.js
export default class SignupForm extends Component {
// ...
handleSubmit = e => {
const userData = e.target.value
this.props.signupRequest(userData)
.then(() => this.props.dispatch(signupSuccess()))
.then(() => {
// 这里可以使用 history 对象了
this.props.history.push('/')
})
.catch(error => dispatch(signupFailure(error.message))) }
}
不知道该使用哪种方法, 以及对于这一类问题有没有最佳实践(best practice?), 多谢!
搜到了答案就自问自答一下
实际上我就是想在全局得到
history
这个对象, 然而react-router
里面, 使用<BrowserRouter>
,<HashRouter>
,<MemoryRouter>
, 和<NativeRouter>
, 一个history
其实默认就已经帮你创建好了当然其实也是可以直接手动创建的, 我搜了一下发现:
上面两个链接有提到, 直接贴解决办法的代码:
然后就能直接在任何地方引用这个
history
了...