【发布时间】:2020-08-24 10:26:43
【问题描述】:
我认为我有一个很常见的问题,但找不到我确信是好的做法的最新答案。
我正在使用 React、Redux、React Router DOM 编写一个论坛应用程序。我正在使用浏览器路由器。
这是我想要做的:在我发布创建线程的请求并完成后,我想将用户重定向到新创建的线程页面(我需要我将获得的对象 ID 以响应 URL)。
组件
class CreateThread extends React.Component {
handleCreateThread = (values) => {
this.props.createThread(values);
[...more code...]
}
动作
export const createThread = (data) => async dispatch => {
try {
const response = await instance().post('/api/threads/', data);
// const { id, category } = response.data;
// history.push(`/categories/${category.id}/threads/${id}`);
dispatch({ type: types.CREATE_THREAD_FULFILLED, payload: response.data })
} catch(err) {
dispatch({ type: types.CREATE_THREAD_ERRORS, payload: err.response.data })
}
};
最好的方法是什么?我认为重定向内部操作是最简单的。这是好习惯吗?在这种情况下如何访问历史对象? (动作代码中的注释部分不起作用,我无法访问这样的历史对象)。 我正在寻找答案,但我发现许多不是最新的或矛盾的,我很困惑。
------------编辑----------
所以我听从了 Ahmad Nawaz Khan 的建议,但是在尝试访问 history.push 内部动作创建者时,我收到了一个错误 TypeError: "_routing__WEBPACK_IMPORTED_MODULE_3__.default.push is not a function"
// routing/history.js
import { createBrowserHistory } from 'history';
export default createBrowserHistory();
// routing/index.js
import { Router } from 'react-router-dom';
import history from './history';
const Routing = (props) => {
return (
<Router history={history}>
...
// redux/actions/index.js
import history from '../../routing';
export const createThread = (data) => async dispatch => {
try {
const response = await instance().post('/api/threads/', data);
const { id, category } = response.data;
history.push(`/categories/${category.id}/threads/${id}`);
dispatch({ type: types.CREATE_THREAD_FULFILLED, payload: response.data })
} catch(err) {
...
"历史": "^4.10.1", "react-router-dom": "^5.1.2", “反应”:“^16.12.0”
【问题讨论】:
标签: reactjs redirect redux react-router-dom