[英]component not rendering when using react router dom v6
There are many answers to this question, but they only answer about either they are missing or forgot to replace any keywords such as exact
, Redirect
etc., or the flow of code.这个问题有很多答案,但他们只回答丢失或忘记替换任何关键字,例如
exact
、 Redirect
等,或代码流。
Recently I have upgraded my react app from react-router-dom: "^5.2.0"
to "react-router-dom": "^6.3.0"
.最近我已经将我的反应应用程序从
react-router-dom: "^5.2.0"
升级到"react-router-dom": "^6.3.0"
。 I have followed the Migrate to v6 from v5 guide and I am not able to see components rendering on particular routes.我已按照从 v5 迁移到 v6指南进行操作,但我无法看到在特定路线上呈现的组件。 As part of only
react-router-dom
, I am only adding routes
part of the React app
and component
.作为
react-router-dom
一部分,我只添加了 React app
和component
的routes
部分。 The way I followed the migration guide is as below:我遵循迁移指南的方式如下:
index.js index.js
const container = document.getElementById('root');
// Create a root.
const root = createRoot(container);
root.render(
<Provider store={Store}>
<BrowserRouter>
<Routes>
<Route path="/*" element={<App />} />
</Routes>
</BrowserRouter>
</Provider>
);
serviceWorker.unregister();
App.tsx应用程序.tsx
const App: FunctionComponent<IAppProps> = () => {
/* other stuff useEffect and fetch functions etc... */
return (
<ThemeProvider theme={theme}>
<ResetStyles />
<Routes>
{/* Public Facing */}
<Route path="*" element={<ViewLogin />} />
<Route path="/forgotten-password/*" element={<ViewForgottenPassword />} />
<Route path="/user/signup" element={<ViewUserSignup />} />
{/* User Protected */}
<Route path="/account-selection/" element={<ViewAccountSelection />} />
<Route path="/sign-out" element={<ViewSignOut />} />
<Route path="/user" element={<ViewUserConfiguration />} />
<Route path="/404" element={<ViewError404 />} />
<Route path="/:account/" element={<ViewDashboard />} />
{/* Error Pages */}
<Route element={<Navigate to="/404" />} />
</Routes>
</ThemeProvider>
);
};
export default App;
dashboard.tsx仪表板.tsx
const ViewDashboard = (props: any) => {
/* other stuff useEffect and fetch functions etc... */
return (
<div className="dashboard-container">
<Nav showSidebar={showSidebar} toggleSidebar={toggleSidebar} />
<div className={showSidebar ? 'dashboard-view-expanded' : 'dashboard-view-collapsed'}>
<ViewMenu sidebarExpanded={showSidebar} history={props.history} upperMenuTitle={getTitle()} />
<div className="dashboard-view__content">
<Routes>
<Route path="/:account/" element={<Navigate to={`${account.token}/reports/dashboard`} />} />
<Route path="/:account/account-management/*" element={<LayoutAccountManagement />} />
<Route path="/:account/reports/" element={<LayoutReport />} />
<Route element={<Navigate to="/404" />} />
</Routes>
</div>
<ViewModal />
<ViewNotification />
<ViewPopup />
</div>
</div>
);
};
export default memo(ViewDashboard, isEqual);
render
method of account-selection.js account-selection.js的
render
方法
render() {
if (this.props.user.isLoggedIn !== true) {
return <Navigate push to="/" />;
} else if (this.state.isLoading === true) {
return <ViewLoadingSplash />;
} else if (this.state.hasAccount || this.props.account.isSelected) {
console.log('Gone through account selection');
this.props.setDisplayMenu(true);
return <Navigate push to={`/${this.props.account.token}`} />;
}
return (
<div id="account-selection__view">
<div className="account-selection__content">
<div className="account-selection__content__selection">
<h3>Select Account</h3>
<ComponentInputField
value={this.state.search}
onChange={this.onInputChange}
placeholder="Search accounts..."
type="text"
/>
<ComponentList rows={this.state.visibleAccounts} onRowClick={this.onAccountClick} />
</div>
</div>
<ViewNotifications />
</div>
);
}
Now the app flow is, on login, there is an account selection page where I select users and it will take me to their dashboard.现在应用程序流程是,在登录时,有一个帐户选择页面,其中我是 select 用户,它会将我带到他们的仪表板。
If everything is working correctly we should see the following route and the user's dashboard:如果一切正常,我们应该看到以下路线和用户的仪表板:
http://localhost:3000/demoUser/reports/dashboard
Instead, it is taking me to http://localhost:3000/demoUser
with no dashboard view at all.相反,它把我带到
http://localhost:3000/demoUser
根本没有仪表板视图。
Not sure where it is going wrong or if I am missing something huge in this.不知道哪里出了问题,或者我是否遗漏了一些重要的东西。 A proper way of doing this would be appreciated.
这样做的正确方法将不胜感激。
The issues I see are the Routes
components are rendering routes with paths with a trailing "*"
wildcard character to allow descendent route path matching.我看到的问题是
Routes
组件正在渲染带有尾随"*"
通配符的路径的路径,以允许后代路径路径匹配。 From what I can see you want the user to navigate to "/account-selection"
and render the ViewAccountSelection
component which under the correct conditions will navigate the user to "/demoUser"
, ie the "/:account"
route renders ViewDashboard
component.据我所知,您希望用户导航到
"/account-selection"
并呈现ViewAccountSelection
组件,该组件在正确的条件下会将用户导航到"/demoUser"
,即"/:account"
路由呈现ViewDashboard
组件。 The ViewDashboard
then navigates the user to "/demoUser/reports/dashboard"
to render the LayoutReport
component. ViewDashboard
然后将用户导航到"/demoUser/reports/dashboard"
以呈现LayoutReport
组件。
Add the missing wildcard path characters to the routes that need it.将缺少的通配符路径字符添加到需要它的路由中。
App应用程序
<Routes>
{/* Public Facing */}
<Route path="*" element={<ViewLogin />} />
<Route
path="/forgotten-password/*"
element={<ViewForgottenPassword />}
/>
<Route path="/user/signup" element={<ViewUserSignup />} />
{/* User Protected */}
<Route
path="/account-selection/"
element={
<ViewAccountSelection
account={account}
user={{ isLoggedIn: true }}
/>
}
/>
<Route path="/sign-out" element={<ViewSignOut />} />
<Route path="/user" element={<ViewUserConfiguration />} />
<Route path="/404" element={<ViewError404 />} />
<Route path="/:account/*" element={<ViewDashboard />} /> // <-- here
{/* Error Pages */}
<Route element={<Navigate to="/404" />} />
</Routes>
ViewDashboard查看仪表板
const ViewDashboard = () => (
<div className="dashboard-container">
...
<div className="dashboard-view__content">
<Routes>
<Route
index // <-- index route, i.e. "/:account"
element={<Navigate to="reports/dashboard" />} // <-- navigate relative
/>
<Route
path="/account-management/*"
element={<LayoutAccountManagement />}
/>
<Route path="/reports/*" element={<LayoutReport />} /> // <-- add trailing *
<Route element={<Navigate to="/404" />} />
</Routes>
</div>
...
</div>
</div>
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.