简体   繁体   English

使用反应路由器dom v6时组件不呈现

[英]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.这个问题有很多答案,但他们只回答丢失或忘记替换任何关键字,例如exactRedirect等,或代码流。

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 appcomponentroutes部分。 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.jsrender方法

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>
);

编辑 component-not-rendering-when-using-react-router-dom-v6

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM