简体   繁体   English

将路由存储在文件中并导入 App.js

[英]Storing routes in a file and importing into App.js

I'm trying to store routes in a file to make them more modular.我正在尝试将路线存储在文件中以使它们更加模块化。 I am using BrowserRouter, Switch, and Route.我正在使用 BrowserRouter、Switch 和 Route。 Right now, the components are not showing up on the page where the links are.现在,组件没有显示在链接所在的页面上。 I am using Django for backend and React for front.我使用 Django 作为后端,使用 React 作为前端。 These are supposed to be the URLs that show in the top bar, and the only Django URLs are the APIs.这些应该是显示在顶部栏中的 URL,唯一的 Django URL 是 API。 I need the actual URLs so I can link them in the navbar.我需要实际的 URL,以便可以在导航栏中链接它们。

App.js:应用程序.js:

import React from 'react';
import MembersRouter from "./members/MembersRouter";

import {
  BrowserRouter as Router,
  Switch,
  Route
} from 'react-router-dom';

function App() {

  return (
    <div className="App">
      <Router>
        <Switch>
          <Route path="/memberships/redesign" component={ MembersRouter }/>
        </Switch>
      </Router>
    </div>
  );
}

export default App;

MembersRouter.js:成员路由器.js:

import React from 'react';
import MemberForm from './MemberForm';
import MembersTable from './MembersTable';
import MembershipForm from './MembershipForm';
import MembershipTable from './MembershipTable';
import LockerRentalForm from './LockerRentalForm';
import LockerRentalTable from './LockerRentalTable';

import {
  BrowserRouter as Router,
  Switch,
  Route
} from 'react-router-dom';

export default function MembersRouter() {
    return (
        <Router>
          <Route path="/member_form" component={ MemberForm } />
          <Route path="/members_table" component={ MembersTable} />
          <Route path="/membership_form" component={ MembershipForm } />
          <Route path="/membership_table" component={ MembershipTable } />
          <Route path="/locker_rental_form" component={ LockerRentalForm } />
          <Route path="/locker_rental_table" component={ LockerRentalTable } />
        </Router>
    );
}

Django URL patterns: Django URL 模式:

urlpatterns = [
    url(r'^redesign/$', ReactView.as_view(), name='member_index'),
    url(r'^redesign/member_form/$', ReactView.as_view(), name='member_form'),
    url(r'^redesign/member_table/$', ReactView.as_view(), name='member_table'),
    url(r'^redesign/membership_form/$', ReactView.as_view(), name='membership_form'),
    url(r'^redesign/membership_table/$', ReactView.as_view(), name='membership_table'),
    url(r'^redesign/locker_rental_form/$', ReactView.as_view(), name='locker_rental_form'),
    url(r'^redesign/locker_rental_table/$', ReactView.as_view(), name='locker_rental_table'),

    url(r'^api/make_member/$', redesign_member_form),
    url(r'^api/get_members/(?P<page>\d+)/$', redesign_members_table),

    url(r'^api/make_membership/$', redesign_membership_form),
    url(r'^api/get_memberships/(?P<page>\d+)/$', redesign_memberships_table),

    url(r'^api/make_locker_rental/$', redesign_locker_rental_form),
    url(r'^api/get_locker_rentals/(?P<page>\d+)/$', redesign_locker_rentals_table),

    url(r'^$', index),
]

BaseView and ReactView: BaseView 和 ReactView:

class BaseView(View):
    page_title = ""

    def get_navbar(self, user):
        return 'navbar/nav_template.html'

    def get_context_data(self, *args, **kwargs):
        context = super(BaseView, self).get_context_data(*args, **kwargs)
        context['navbar'] = self.get_navbar(self.request.user)

        return context

class ReactView(BaseView, TemplateView):
    template_name = 'redesign/react_dashboard.html'

    def get_context_data(self, **kwargs):
        context = super(ReactView, self).get_context_data(**kwargs)
        return context

Maybe because you are calling a Router inside another Router , that is the problem.可能是因为您在另一个Router中调用Router ,这就是问题所在。 You should call only Route .您应该只调用Route

You can modify App.js like below and try -您可以像下面这样修改App.js并尝试 -

App.js应用程序.js

import React from 'react';
import MembersRouter from "./members/MembersRouter";

import {
  BrowserRouter as Router,
  Switch,
  Route
} from 'react-router-dom';

function App() {

  return (
    <div className="App">
      <MembersRouter />
    </div>
  );
}

export default App;

And Switch you can put in the MembersRouter.js file like below -并且您可以将Switch放入MembersRouter.js文件中,如下所示 -

MembersRouter.js成员路由器.js

import React from 'react';
import MemberForm from './MemberForm';
import MembersTable from './MembersTable';
import MembershipForm from './MembershipForm';
import MembershipTable from './MembershipTable';
import LockerRentalForm from './LockerRentalForm';
import LockerRentalTable from './LockerRentalTable';

import {
  BrowserRouter as Router,
  Switch,
  Route
} from 'react-router-dom';

export default function MembersRouter() {
    return (
        <>
          <Switch>
            <Route path="/member_form" component={ MemberForm } />
            <Route path="/members_table" component={ MembersTable} />
            <Route path="/membership_form" component={ MembershipForm } />
            <Route path="/membership_table" component={ MembershipTable } />
            <Route path="/locker_rental_form" component={ LockerRentalForm } />
            <Route path="/locker_rental_table" component={ LockerRentalTable } />
          </Switch>
        </>
    );
}

And wrap your App from App.js in the Router component, in the index.js file, something like this -并将App.js中的App包装在Router组件中,在index.js文件中,如下所示 -

index.js index.js

import App from './App' // correct according to location of App.js file

ReactDOM.render(
    <Router>
      <App />
    </Router>,
  document.getElementById('root')
)

You can check and remove the unused imports.您可以检查并删除未使用的导入。

I never tried this way of segregating the routes.我从未尝试过这种隔离路线的方式。 Its very convenient to create routes wherever you need them instead of putting all in a single file.在您需要的地方创建路线非常方便,而不是将所有路线都放在一个文件中。

It's untested, I am hoping it should work.它未经测试,我希望它应该工作。

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

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