reactjs - 登录成功时如何在redux saga中路由跳转?
问题描述
感谢您检查这个问题。我是新来的反应。我使用 react hooks 和 redux-saga。我希望路由器/home
在登录成功时跳转到。我使用connected-react-router
andhistory
来做到这一点,这是一种常用的方法吗?请告诉我是否有更好的方法。现在当我登录成功时。页面不会跳转到“/home”。这是我的代码。
reducer.ts
const initialUser = (): UserState => {
const token = TokenStorage.getToken();
if (token === null) {
return { isAuthenticated: false };
}
return UserModel.getUser(token);
};
function user(state = initialUser(), action: UserAction): UserState {
switch (action.type) {
case LOGIN_SUCCESS:
return { ...state, ...action.payload };
case LOGIN_FAILED:
TokenStorage.clear();
return { isAuthenticated: false };
default:
return state;
}
}
export const createRootReducer = (history: History) =>
combineReducers({
router: connectRouter(history),
user,
});
// when add router into combineReducers. the RootState is wrong.. how to fix?
export type RootState = ReturnType<typeof createRootReducer>;
存储/索引.ts
export default function configureStore(history: History) {
const sagaMiddleware = createSagaMiddleware();
const composeEnhancers =
(typeof window === 'object' &&
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) ||
compose;
const store = createStore(
createRootReducer(history),
composeEnhancers(applyMiddleware(sagaMiddleware, routerMiddleware(history)))
);
sagaMiddleware.run(rootSaga);
return store;
}
sagat.ts
function* LoginRequestSaga(username: string, password: string) {
try {
const result: ILoginResponseData = yield call(
fetchLogin,
username,
password
);
if (result.code === '1') {
TokenStorage.storeToken(result.token);
message.success(result.msg);
const user = UserModel.getUser(result.token);
yield put(loginSuccess(user));
yield put(push('/home')); <----- this line doesn't run....
} else {
message.error(result.msg);
yield put(loginFailed());
}
} catch (err) {
message.error(err);
yield put(loginFailed());
}
}
索引.ts
export const history = createBrowserHistory();
export const store = configureStore(history);
ReactDOM.render(
<Provider store={store}>
<ConnectedRouter history={history}>
<Router />
</ConnectedRouter>
</Provider>,
document.getElementById('root')
);
我的路由器
const renderRoutes = routes.map(({ path, exact, component, key }) => (
<Route exact={exact || false} path={path} key={key} component={component} />
));
const Routers: React.FC = () => (
<BrowserRouter>
<Suspense fallback={<Loading />}>
<Switch>{renderRoutes}</Switch>
</Suspense>
</BrowserRouter>
);
如果您想查看更多详细信息,可以查看此repo 谢谢大家。
解决方案
好吧,我有一个非常相似的项目,登录方法相同(使用 redux-saga)。为了实现重定向,我在我的Login.js
组件中使用了这个方法:
const history = useHistory()
const { isLogged, state } = useSelector(state => ({
isLogged: state.logged.isLogged,
state: state.login,
}))
if(isLogged) {
history.push(routes.dashboard)
}
基本上我将它存储isLogged
到一个 reducer 中,并在Login.js
组件中检查它。
希望这可以帮助。
推荐阅读
- excel - 从 VBA 搜索 Outlook 电子邮件
- javascript - 忽略 HTML 表单中的模型验证
- java - 如何在(Actionlistener)保存方法中为对象设置值?
- php - 隐藏输入仅从循环数据中获取最后一个值-php
- c - uint8_t 中的二进制序列
- uiimageview - 如何将 UIImageViews 添加到受限于视图的 centerXAnchor 的 UIStackView?
- javascript - 遍历类名并将一些隐藏在 vanilla js 中
- python - 为什么 tensorflow 中同时存在 tf.round 和 tf.rint 函数?
- python - ssh断开后重新进入pdb
- android - 如何在我的实体中使用 setBalance 方法来设置成员的实际余额值?