使用React Router通过边栏导航动态呈现组件的更简单方法

时间:2019-03-27 18:53:17

标签: javascript reactjs react-router jsx react-router-dom

当前正在本教程中介绍如何使用React Router https://reacttraining.com/react-router/web/example/sidebar

创建侧边栏导航系统

我计划有多个路由,所以这意味着我必须继续导入路由并将其添加到routes数组中。是否有一种聪明/正确的方式来动态加载它们?

我所有的组件都在我的/Views文件夹中。

App.js

import React, { Component } from 'react';
import SideBar from './components/SideBar/SideBar';
import MainContent from './components/MainContent/MainContent';
import { BrowserRouter as Router,
} from 'react-router-dom';


// Import all components here
import Button from './components/Views/Button/Button';
import Color from './components/Views/Color/Color';
import Card from './components/Views/Card/Card';
import Filter from './components/Views/Filter/Filter';

const routes = [
  {
    path: "/",
    name: 'home',
    exact: true,
    main: () => <h2>Home</h2>
  },
  {
    path: "/button",
    name: 'Button',
    main: () =>  <Button />
  },
  {
    path: "/color",
    name: 'Color',
    main: () =>  <Color />
  },
  {
    path: "/card",
    name: 'Card',
    main: () =>  <Card />
  },
  {
    path: "/filter",
    name: 'Filter',
    main: () =>  <Filter />
  },
];

class App extends Component {
  render() {
    return (
      <Router>
        <div className="ds-container">
          <SideBar routes={routes} />
          <MainContent routes={routes} />
        </div>
      </Router>
    );
  }
}

export default App;

2 个答案:

答案 0 :(得分:1)

由于您正在使用内部使用webpack的create-react-app,因此可以查看require-context。这将帮助您动态导入与某个正则表达式匹配的文件夹中的所有文件。 (例如:以.jsx / .js结尾)

但是,我建议您反对:

  1. 您永远不会知道您目前正在适应的路线。
  2. 这可能会降低代码的可读性。
  3. 您可能还必须将组件的映射({Route中的path)与组件本身一起导出。

要避免所有这些情况,您只需在index.js组件中创建一个Views文件,该文件将需要您创建的任何新路由组件,并返回在{中形成的最终数组{1}}文件。

从本质上讲, /Views/index.js

App.js

SideBar.js 中:

// Import all components here
import Button from './components/Views/Button/Button';
import Color from './components/Views/Color/Color';
import Card from './components/Views/Card/Card';
import Filter from './components/Views/Filter/Filter';

const routes = [
  {
    path: "/",
    name: 'home',
    exact: true,
    main: () => <h2>Home</h2>
  },
  {
    path: "/button",
    name: 'Button',
    main: () =>  <Button />
  },
  {
    path: "/color",
    name: 'Color',
    main: () =>  <Color />
  },
  {
    path: "/card",
    name: 'Card',
    main: () =>  <Card />
  },
  {
    path: "/filter",
    name: 'Filter',
    main: () =>  <Filter />
  },
  // add new routes here
];

export default routes;

这样,您可以清理App.js中的代码,并且还可以有效地分离各个组件的关注点。

我希望这是有道理的:)

答案 1 :(得分:0)

有几种方法可以根据当前位置选择主要组件。但是所有这些都需要列出所有可能的路线并导入相应的组件。您可以使用dynamic importsReact.lazy来简化代码拆分。

但是您可以避免对侧边栏进行额外的配置。侧边栏可以从全局状态获取配置,并且您的主要组件可以在挂载(componentDidMountuseEffect(() => {...}, []))上更新该状态:

const SideBarContext = React.createContext(() => {});

function useSidebar(name) {
  const setSidebarName = useContext(SideBarContext);
  useEffect(() => {
    setSidebarName(name);
    return () => setSidebarName(null);
  }, []);
}

function Home() {
  useSidebar('home');
  return <h2>Home</h2>;
}

function Button() {
  useSidebar('Button');
  return <button>press me</button>;
}

function App() {
  const [name, setName] = useState(null);

  return (
      <Router>
        <div className="ds-container">
          <SideBar name={name} />
          <SideBarContext.Provider value={setName}>
            <Route path="/" exact component={Home}/>
            <Route path="/button" component={Button}/>
          </SideBarContext.Provider>
        </div>
      </Router>
  );
}

因此,每个组件都会考虑侧边栏的选项,您只需导入它们并添加Route