历史推送更改了url,但不呈现组件 [英] history.push changes url, but component is not rendered
本文介绍了历史推送更改了url,但不呈现组件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
history.push("/dashboard")
将url更改为/dashboard
后,Dashboard
组件为何未呈现?
Gif showcasing the issue,如您所见,我必须手动单击刷新按钮才能触发重新渲染。
index.js
import ReactDOM from "react-dom";
import Router from "./Router";
const rootElement = document.getElementById("root");
ReactDOM.render(
<Router />,
rootElement
);
LoginForm.js
import React, {Component} from "react"
class LoginForm extends Component {
handleSubmit = (event) => {
event.preventDefault()
this.props.history.push("/dashboard")
}
render() {
return (
<form name="signup_form" onSubmit={this.handleSubmit}>
<input type="submit" value="Sign Up"/>
</form>
)
}
}
export default LoginForm
Router.js
import LoginForm from "./LoginForm";
import {BrowserRouter, Route, Switch } from "react-router-dom";
import React, {Component} from "react";
import { createBrowserHistory } from "history"
const browserHistory = createBrowserHistory()
class Router extends Component {
render() {
return (
<BrowserRouter >
<LoginForm history={browserHistory} />
<Switch>
<Route path="/dashboard" component={Dashboard}/>
</Switch>
</BrowserRouter>
)
}
}
export default Router
function Dashboard() {
return <h1>Dashboard</h1>
}
推荐答案
问题
您正在创建BrowserRouter
不知道的自定义历史记录对象。LoginForm
组件正在操作history
对象的一个版本,而路由器和路由器正在使用路由上下文使用的默认history
对象。登录表单能够更新地址栏中的URL,但外部路由上下文无法看到此更改。
解决方案
删除自定义历史记录并使用BrowsserRouter
或提供的历史记录,或者使用较低级别的Router
组件并将自定义history
对象传递给它以在路由上下文中使用。
使用路由上下文中的标准历史记录
Router.js
<BrowserRouter >
<LoginForm/>
<Switch>
<Route path="/dashboard" component={Dashboard}/>
</Switch>
</BrowserRouter>
LoginForm-使用withRouter
更高级别的组件进行装饰,以便从最近的布线上下文接收布线道具。
import React, {Component} from "react";
import { withRouter } from 'react-router-dom';
class LoginForm extends Component {
handleSubmit = (event) => {
event.preventDefault()
this.props.history.push("/dashboard")
}
render() {
return (
<form name="signup_form" onSubmit={this.handleSubmit}>
<input type="submit" value="Sign Up"/>
</form>
);
}
}
export default withRouter(LoginForm);
使用自定义历史记录
import LoginForm from "./LoginForm";
import { Router, Route, Switch } from "react-router-dom";
import React, { Component } from "react";
import { createBrowserHistory } from "history"
const browserHistory = createBrowserHistory()
class MyRouter extends Component {
render() {
return (
<Router history={browserHistory} >
<LoginForm />
<Switch>
<Route path="/dashboard" component={Dashboard}/>
</Switch>
</Router>
)
}
}
export default MyRouter;
,并仍使用withRouter
临时装饰LoginForm
,以便传递路线道具。
import React, {Component} from "react";
import { withRouter } from 'react-router-dom';
class LoginForm extends Component {
handleSubmit = (event) => {
event.preventDefault()
this.props.history.push("/dashboard")
}
render() {
return (
<form name="signup_form" onSubmit={this.handleSubmit}>
<input type="submit" value="Sign Up"/>
</form>
);
}
}
export default withRouter(LoginForm);
建议
编写时,LoginForm
组件将始终呈现,这可能不是您想要的。我建议把它移到一条路线上,这样路线道具就会通过。
<Route path="/login" component={LoginForm} />
这篇关于历史推送更改了url,但不呈现组件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文