反应路由器 history.push 没有加载预期的组件
react router history.push not loading expected component
我正在使用 saga 来管理我的异步调用。
这是登录传奇:
export function* loginApi({ type, formObj }) {
const formData = new FormData();
Object.keys(formObj).map(key => {
formData.append(key, formObj[key]);
})
const response = yield axios.post(`http://localhost/coupon/web/api/login`, formData)
if (response.data.status) {
localStorage.setItem('token', response.data.data.token);
yield put(loginsuccess(response.data.data.token))
yield call(forwardTo, '/dashboard')
} else {
yield put(loginFaield(response.data.msg))
}
}
登录成功后,我想将用户重定向到仪表板,为此:
yield call(forwardTo, '/dashboard')
执行 forwardTo 函数,下面是它的实现:
import { createBrowserHistory } from 'history';
const history = createBrowserHistory();
function forwardTo(location) {
console.log('location', location);
history.push(location);
}
export default forwardTo;
它将我的 url 从 http://localhost:3000/login
更改为 http://localhost:3000/dashboard
但它显示登录页面而不是仪表板。
路线:
const Routes = () => {
return (
<Switch>
<Route path="/register" component={RegisterUser} />
<Route path="/dashboard" component={Dashboard} />
<Route path="/login" component={Login} />
<Route path="/" component={Home} />
</Switch>
)
}
您每次调用 createHistory() 时都会创建新的历史记录,请尝试将此函数添加到应用程序,以便在应用程序 运行 时触发它并添加 exact
属性 所有路线
<Switch>
<Route exact path="/register" component={RegisterUser} />
<Route exact path="/dashboard" component={Dashboard} />
<Route exact path="/login" component={Login} />
<Route exact path="/" component={Home} />
</Switch>
您可以在登录组件中实现此...
传奇故事完成后 yield put(loginsuccess(response.data.data.token))
现在我假设.. 存储了一些关于登录成功的数据。登录前说state.user.token
是null
,登录后有一定的价值。
请将您的登录组件更改为如下所示。
import React from 'react';
import {Redirect} from "react-router-dom";
import {withRouter} from "react-router-dom";
import {compose} from 'redux';
import {connect} from 'react-redux';
const Login = props => {
return (
<div>
/*all login UI */
//..
{
props.token ?
<Redirect to={'/dashboard'}/> : null
}
</div>
)
};
const mapStateToProps = state => ({
token: //state.user.token or whatever
});
export default compose(
withRouter,
connect(mapStateToProps, mapDispatchToProps)
)(Login);
当用户未登录时,token
值为 null
,因此它不呈现任何内容,但当登录成功时,一些值分配给令牌,结果 <Redirect to='/dashboard'/>
将是呈现并且网站将被重定向到 /dashboard
我正在使用 saga 来管理我的异步调用。
这是登录传奇:
export function* loginApi({ type, formObj }) {
const formData = new FormData();
Object.keys(formObj).map(key => {
formData.append(key, formObj[key]);
})
const response = yield axios.post(`http://localhost/coupon/web/api/login`, formData)
if (response.data.status) {
localStorage.setItem('token', response.data.data.token);
yield put(loginsuccess(response.data.data.token))
yield call(forwardTo, '/dashboard')
} else {
yield put(loginFaield(response.data.msg))
}
}
登录成功后,我想将用户重定向到仪表板,为此:
yield call(forwardTo, '/dashboard')
执行 forwardTo 函数,下面是它的实现:
import { createBrowserHistory } from 'history';
const history = createBrowserHistory();
function forwardTo(location) {
console.log('location', location);
history.push(location);
}
export default forwardTo;
它将我的 url 从 http://localhost:3000/login
更改为 http://localhost:3000/dashboard
但它显示登录页面而不是仪表板。
路线:
const Routes = () => {
return (
<Switch>
<Route path="/register" component={RegisterUser} />
<Route path="/dashboard" component={Dashboard} />
<Route path="/login" component={Login} />
<Route path="/" component={Home} />
</Switch>
)
}
您每次调用 createHistory() 时都会创建新的历史记录,请尝试将此函数添加到应用程序,以便在应用程序 运行 时触发它并添加 exact
属性 所有路线
<Switch>
<Route exact path="/register" component={RegisterUser} />
<Route exact path="/dashboard" component={Dashboard} />
<Route exact path="/login" component={Login} />
<Route exact path="/" component={Home} />
</Switch>
您可以在登录组件中实现此...
传奇故事完成后 yield put(loginsuccess(response.data.data.token))
现在我假设.. 存储了一些关于登录成功的数据。登录前说state.user.token
是null
,登录后有一定的价值。
请将您的登录组件更改为如下所示。
import React from 'react';
import {Redirect} from "react-router-dom";
import {withRouter} from "react-router-dom";
import {compose} from 'redux';
import {connect} from 'react-redux';
const Login = props => {
return (
<div>
/*all login UI */
//..
{
props.token ?
<Redirect to={'/dashboard'}/> : null
}
</div>
)
};
const mapStateToProps = state => ({
token: //state.user.token or whatever
});
export default compose(
withRouter,
connect(mapStateToProps, mapDispatchToProps)
)(Login);
当用户未登录时,token
值为 null
,因此它不呈现任何内容,但当登录成功时,一些值分配给令牌,结果 <Redirect to='/dashboard'/>
将是呈现并且网站将被重定向到 /dashboard