洛锋 發表於 2020-7-22 21:48:00

React中配置子路由

<p>1、组件First.js下有子组件:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="7">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;import Admin from './Admin'\nimport FormCom from './FormCom'\nimport One from './One'\nimport ButtonCom from './ButtonCom'\nimport MenuCom from './MenuCom'\nimport StepsCom from './StepsCom'\nimport TabsCom from './TabsCom'\nimport TableCom from './TableCom'\nimport MessageCom from './MessageCom'\nimport NotificationCom from './NotificationCom'\nimport ProgressCom from './ProgressCom'\nimport SpinCom from './SpinCom'\nimport BadgeCom from './BadgeCom'&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs"><span class="hljs-keyword">import Admin <span class="hljs-keyword">from <span class="hljs-string">'./Admin'
<span class="hljs-keyword">import FormCom <span class="hljs-keyword">from <span class="hljs-string">'./FormCom'
<span class="hljs-keyword">import One <span class="hljs-keyword">from <span class="hljs-string">'./One'
<span class="hljs-keyword">import ButtonCom <span class="hljs-keyword">from <span class="hljs-string">'./ButtonCom'
<span class="hljs-keyword">import MenuCom <span class="hljs-keyword">from <span class="hljs-string">'./MenuCom'
<span class="hljs-keyword">import StepsCom <span class="hljs-keyword">from <span class="hljs-string">'./StepsCom'
<span class="hljs-keyword">import TabsCom <span class="hljs-keyword">from <span class="hljs-string">'./TabsCom'
<span class="hljs-keyword">import TableCom <span class="hljs-keyword">from <span class="hljs-string">'./TableCom'
<span class="hljs-keyword">import MessageCom <span class="hljs-keyword">from <span class="hljs-string">'./MessageCom'
<span class="hljs-keyword">import NotificationCom <span class="hljs-keyword">from <span class="hljs-string">'./NotificationCom'
<span class="hljs-keyword">import ProgressCom <span class="hljs-keyword">from <span class="hljs-string">'./ProgressCom'
<span class="hljs-keyword">import SpinCom <span class="hljs-keyword">from <span class="hljs-string">'./SpinCom'
<span class="hljs-keyword">import BadgeCom <span class="hljs-keyword">from <span class="hljs-string">'./BadgeCom'</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>First.js完整代码如下:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="6">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;import React from 'react'\nimport { Layout, Menu } from 'antd';\nimport { UserOutlined, LaptopOutlined, NotificationOutlined } from '@ant-design/icons';\nimport { HashRouter, Route, Link } from 'react-router-dom'\nimport Admin from './Admin'\nimport FormCom from './FormCom'\nimport One from './One'\nimport ButtonCom from './ButtonCom'\nimport MenuCom from './MenuCom'\nimport StepsCom from './StepsCom'\nimport TabsCom from './TabsCom'\nimport TableCom from './TableCom'\nimport MessageCom from './MessageCom'\nimport NotificationCom from './NotificationCom'\nimport ProgressCom from './ProgressCom'\nimport SpinCom from './SpinCom'\nimport BadgeCom from './BadgeCom'\nconst { SubMenu } = Menu;\nconst { Header, Content, Sider } = Layout;\n\nexport default class First extends React.Component {\n    constructor() {\n      super();\n    }\n\n    //只展开当前父级菜单 begin\n    rootSubmenuKeys = ['sub1', 'sub2', 'sub3'];\n\n    state = {\n      openKeys: ['sub1'],\n    };\n\n    onOpenChange = openKeys =&amp;gt; {\n      const latestOpenKey = openKeys.find(key =&amp;gt; this.state.openKeys.indexOf(key) === -1);\n      if (this.rootSubmenuKeys.indexOf(latestOpenKey) === -1) {\n            this.setState({ openKeys });\n      } else {\n            this.setState({\n                openKeys: latestOpenKey ? : [],\n            });\n      }\n    };\n    //只展开当前父级菜单 end\n\n    render() {\n      return (&amp;lt;div&amp;gt;\n            &amp;lt;Layout&amp;gt;\n                &amp;lt;HashRouter&amp;gt;\n                  &amp;lt;Header className=\&amp;quot;header\&amp;quot; style={{ position: 'fixed', zIndex: 1, width: '100%', paddingLeft: '20px'}}&amp;gt;\n                        &amp;lt;div className=\&amp;quot;logo\&amp;quot; style={{fontSize: '32px', color: '#ffffff', fontWeight: 'bold'}}&amp;gt;React App&amp;lt;/div&amp;gt;\n                        &amp;lt;Menu theme=\&amp;quot;dark\&amp;quot; mode=\&amp;quot;horizontal\&amp;quot; defaultSelectedKeys={['1']}&amp;gt;\n                            {/*&amp;lt;Menu.Item key=\&amp;quot;1\&amp;quot;&amp;gt;nav 1&amp;lt;/Menu.Item&amp;gt;\n                            &amp;lt;Menu.Item key=\&amp;quot;2\&amp;quot;&amp;gt;nav 2&amp;lt;/Menu.Item&amp;gt;\n                            &amp;lt;Menu.Item key=\&amp;quot;3\&amp;quot;&amp;gt;nav 3&amp;lt;/Menu.Item&amp;gt;*/}\n                        &amp;lt;/Menu&amp;gt;\n                  &amp;lt;/Header&amp;gt;\n                  &amp;lt;Layout&amp;gt;\n                        &amp;lt;Sider width={200} className=\&amp;quot;site-layout-background\&amp;quot; style={{\n                            overflow: 'auto',\n                            height: '100vh',\n                            position: 'fixed',\n                            left: 0,\n                        }}&amp;gt;\n                            &amp;lt;Menu\n                              theme=\&amp;quot;dark\&amp;quot;\n                              mode=\&amp;quot;inline\&amp;quot;\n                              defaultSelectedKeys={['2']}\n                              defaultOpenKeys={['sub1']}\n                              style={{ height: '100%', paddingTop: '60px', borderRight: 0 }}\n                              onOpenChange={this.onOpenChange}\n                              openKeys={this.state.openKeys}\n                            &amp;gt;\n                              &amp;lt;SubMenu key=\&amp;quot;sub1\&amp;quot; icon={&amp;lt;UserOutlined /&amp;gt;} title=\&amp;quot;subnav 1\&amp;quot;&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;1\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/admin`}&amp;gt;admin&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;2\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/form`}&amp;gt;form&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;3\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/one`}&amp;gt;One&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;4\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/menu`}&amp;gt;Menu&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                              &amp;lt;/SubMenu&amp;gt;\n                              &amp;lt;SubMenu key=\&amp;quot;sub2\&amp;quot; icon={&amp;lt;LaptopOutlined /&amp;gt;} title=\&amp;quot;subnav 2\&amp;quot;&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;5\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/step`}&amp;gt;Step&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;6\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/tabs`}&amp;gt;Tabs&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;7\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/table`}&amp;gt;Table&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;8\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/message`}&amp;gt;Message&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                              &amp;lt;/SubMenu&amp;gt;\n                              &amp;lt;SubMenu key=\&amp;quot;sub3\&amp;quot; icon={&amp;lt;NotificationOutlined /&amp;gt;} title=\&amp;quot;subnav 3\&amp;quot;&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;9\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/notification`}&amp;gt;Notification&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;10\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/progress`}&amp;gt;ProgressCom&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;11\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/spin`}&amp;gt;Spin&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;12\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/badge`}&amp;gt;Badge&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                                    &amp;lt;Menu.Item key=\&amp;quot;13\&amp;quot;&amp;gt;&amp;lt;Link to={`${this.props.match.path}/button`}&amp;gt;Button&amp;lt;/Link&amp;gt;&amp;lt;/Menu.Item&amp;gt;\n                              &amp;lt;/SubMenu&amp;gt;\n                            &amp;lt;/Menu&amp;gt;\n                        &amp;lt;/Sider&amp;gt;\n                        &amp;lt;Layout style={{ padding: '84px 20px 20px', marginLeft: 200}}&amp;gt;\n                            &amp;lt;Content\n                              className=\&amp;quot;site-layout-background\&amp;quot;\n                              style={{\n                                    padding: 24,\n                                    margin: 0\n                              }}\n                            &amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/admin`} exact component={Admin}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/form`} component={FormCom}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/one`} component={One}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/menu`} component={MenuCom}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/step`} component={StepsCom}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/tabs`} component={TabsCom}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/table`} component={TableCom}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/message`} component={MessageCom}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/notification`} component={NotificationCom}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/progress`} component={ProgressCom}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/spin`} component={SpinCom}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/badge`} component={BadgeCom}&amp;gt;&amp;lt;/Route&amp;gt;\n                              &amp;lt;Route path={`${this.props.match.path}/button`} component={ButtonCom}&amp;gt;&amp;lt;/Route&amp;gt;\n                            &amp;lt;/Content&amp;gt;\n                        &amp;lt;/Layout&amp;gt;\n                  &amp;lt;/Layout&amp;gt;\n                &amp;lt;/HashRouter&amp;gt;\n            &amp;lt;/Layout&amp;gt;\n      &amp;lt;/div&amp;gt;)\n    }\n}&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs"><span class="hljs-keyword">import React <span class="hljs-keyword">from <span class="hljs-string">'react'
<span class="hljs-keyword">import { Layout, Menu } <span class="hljs-keyword">from <span class="hljs-string">'antd';
<span class="hljs-keyword">import { UserOutlined, LaptopOutlined, NotificationOutlined } <span class="hljs-keyword">from <span class="hljs-string">'@ant-design/icons';
<span class="hljs-keyword">import { HashRouter, Route, Link } <span class="hljs-keyword">from <span class="hljs-string">'react-router-dom'
<span class="hljs-keyword">import Admin <span class="hljs-keyword">from <span class="hljs-string">'./Admin'
<span class="hljs-keyword">import FormCom <span class="hljs-keyword">from <span class="hljs-string">'./FormCom'
<span class="hljs-keyword">import One <span class="hljs-keyword">from <span class="hljs-string">'./One'
<span class="hljs-keyword">import ButtonCom <span class="hljs-keyword">from <span class="hljs-string">'./ButtonCom'
<span class="hljs-keyword">import MenuCom <span class="hljs-keyword">from <span class="hljs-string">'./MenuCom'
<span class="hljs-keyword">import StepsCom <span class="hljs-keyword">from <span class="hljs-string">'./StepsCom'
<span class="hljs-keyword">import TabsCom <span class="hljs-keyword">from <span class="hljs-string">'./TabsCom'
<span class="hljs-keyword">import TableCom <span class="hljs-keyword">from <span class="hljs-string">'./TableCom'
<span class="hljs-keyword">import MessageCom <span class="hljs-keyword">from <span class="hljs-string">'./MessageCom'
<span class="hljs-keyword">import NotificationCom <span class="hljs-keyword">from <span class="hljs-string">'./NotificationCom'
<span class="hljs-keyword">import ProgressCom <span class="hljs-keyword">from <span class="hljs-string">'./ProgressCom'
<span class="hljs-keyword">import SpinCom <span class="hljs-keyword">from <span class="hljs-string">'./SpinCom'
<span class="hljs-keyword">import BadgeCom <span class="hljs-keyword">from <span class="hljs-string">'./BadgeCom'
<span class="hljs-keyword">const { SubMenu } = Menu;
<span class="hljs-keyword">const { Header, Content, Sider } = Layout;

<span class="hljs-keyword">export <span class="hljs-keyword">default <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">First <span class="hljs-keyword">extends <span class="hljs-title">React.<span class="hljs-title">Component {
    <span class="hljs-keyword">constructor() {
      <span class="hljs-keyword">super();
    }

    <span class="hljs-comment">//只展开当前父级菜单 begin
    rootSubmenuKeys = [<span class="hljs-string">'sub1', <span class="hljs-string">'sub2', <span class="hljs-string">'sub3'];

    state = {
      <span class="hljs-attr">openKeys: [<span class="hljs-string">'sub1'],
    };

    onOpenChange = <span class="hljs-function"><span class="hljs-params">openKeys =&gt; {
      <span class="hljs-keyword">const latestOpenKey = openKeys.find(<span class="hljs-function"><span class="hljs-params">key =&gt; <span class="hljs-keyword">this.state.openKeys.indexOf(key) === <span class="hljs-number">-1);
      <span class="hljs-keyword">if (<span class="hljs-keyword">this.rootSubmenuKeys.indexOf(latestOpenKey) === <span class="hljs-number">-1) {
            <span class="hljs-keyword">this.setState({ openKeys });
      } <span class="hljs-keyword">else {
            <span class="hljs-keyword">this.setState({
                <span class="hljs-attr">openKeys: latestOpenKey ? : [],
            });
      }
    };
    <span class="hljs-comment">//只展开当前父级菜单 end

    render() {
      <span class="hljs-keyword">return (&lt;div&gt;
            &lt;Layout&gt;
                &lt;HashRouter&gt;
                  &lt;Header className="header" style={{ position: 'fixed', zIndex: 1, width: '100%', paddingLeft: '20px'}}&gt;
                        &lt;div className="logo" style={{fontSize: '32px', color: '#ffffff', fontWeight: 'bold'}}&gt;React App&lt;/div&gt;
                        &lt;Menu theme="dark" mode="horizontal" defaultSelectedKeys={['1']}&gt;
                            {/*&lt;Menu.Item key="1"&gt;nav 1&lt;/Menu.Item&gt;
                            &lt;Menu.Item key="2"&gt;nav 2&lt;/Menu.Item&gt;
                            &lt;Menu.Item key="3"&gt;nav 3&lt;/Menu.Item&gt;*/}
                        &lt;/Menu&gt;
                  &lt;/Header&gt;
                  &lt;Layout&gt;
                        &lt;Sider width={200} className="site-layout-background" style={{
                            overflow: 'auto',
                            height: '100vh',
                            position: 'fixed',
                            left: 0,
                        }}&gt;
                            &lt;Menu
                              theme="dark"
                              mode="inline"
                              defaultSelectedKeys={['2']}
                              defaultOpenKeys={['sub1']}
                              style={{ height: '100%', paddingTop: '60px', borderRight: 0 }}
                              onOpenChange={this.onOpenChange}
                              openKeys={this.state.openKeys}
                            &gt;
                              &lt;SubMenu key="sub1" icon={&lt;UserOutlined /&gt;} title="subnav 1"&gt;
                                    &lt;Menu.Item key="1"&gt;&lt;Link to={`${this.props.match.path}/admin`}&gt;admin&lt;/Link&gt;&lt;/Menu.Item&gt;
                                    &lt;Menu.Item key="2"&gt;&lt;Link to={`${this.props.match.path}/form`}&gt;form&lt;/Link&gt;&lt;/Menu.Item&gt;
                                    &lt;Menu.Item key="3"&gt;&lt;Link to={`${this.props.match.path}/one`}&gt;One&lt;/Link&gt;&lt;/Menu.Item&gt;
                                    &lt;Menu.Item key="4"&gt;&lt;Link to={`${this.props.match.path}/menu`}&gt;Menu&lt;/Link&gt;&lt;/Menu.Item&gt;
                              &lt;/SubMenu&gt;
                              &lt;SubMenu key="sub2" icon={&lt;LaptopOutlined /&gt;} title="subnav 2"&gt;
                                    &lt;Menu.Item key="5"&gt;&lt;Link to={`${this.props.match.path}/step`}&gt;Step&lt;/Link&gt;&lt;/Menu.Item&gt;
                                    &lt;Menu.Item key="6"&gt;&lt;Link to={`${this.props.match.path}/tabs`}&gt;Tabs&lt;/Link&gt;&lt;/Menu.Item&gt;
                                    &lt;Menu.Item key="7"&gt;&lt;Link to={`${this.props.match.path}/table`}&gt;Table&lt;/Link&gt;&lt;/Menu.Item&gt;
                                    &lt;Menu.Item key="8"&gt;&lt;Link to={`${this.props.match.path}/message`}&gt;Message&lt;/Link&gt;&lt;/Menu.Item&gt;
                              &lt;/SubMenu&gt;
                              &lt;SubMenu key="sub3" icon={&lt;NotificationOutlined /&gt;} title="subnav 3"&gt;
                                    &lt;Menu.Item key="9"&gt;&lt;Link to={`${this.props.match.path}/notification`}&gt;Notification&lt;/Link&gt;&lt;/Menu.Item&gt;
                                    &lt;Menu.Item key="10"&gt;&lt;Link to={`${this.props.match.path}/progress`}&gt;ProgressCom&lt;/Link&gt;&lt;/Menu.Item&gt;
                                    &lt;Menu.Item key="11"&gt;&lt;Link to={`${this.props.match.path}/spin`}&gt;Spin&lt;/Link&gt;&lt;/Menu.Item&gt;
                                    &lt;Menu.Item key="12"&gt;&lt;Link to={`${this.props.match.path}/badge`}&gt;Badge&lt;/Link&gt;&lt;/Menu.Item&gt;
                                    &lt;Menu.Item key="13"&gt;&lt;Link to={`${this.props.match.path}/button`}&gt;Button&lt;/Link&gt;&lt;/Menu.Item&gt;
                              &lt;/SubMenu&gt;
                            &lt;/Menu&gt;
                        &lt;/Sider&gt;
                        &lt;Layout style={{ padding: '84px 20px 20px', marginLeft: 200}}&gt;
                            &lt;Content
                              className="site-layout-background"
                              style={{
                                    padding: 24,
                                    margin: 0
                              }}
                            &gt;
                              &lt;Route path={`${this.props.match.path}/admin`} exact component={Admin}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/form`} component={FormCom}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/one`} component={One}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/menu`} component={MenuCom}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/step`} component={StepsCom}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/tabs`} component={TabsCom}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/table`} component={TableCom}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/message`} component={MessageCom}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/notification`} component={NotificationCom}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/progress`} component={ProgressCom}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/spin`} component={SpinCom}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/badge`} component={BadgeCom}&gt;&lt;/Route&gt;
                              &lt;Route path={`${this.props.match.path}/button`} component={ButtonCom}&gt;&lt;/Route&gt;
                            &lt;/Content&gt;
                        &lt;/Layout&gt;
                  &lt;/Layout&gt;
                &lt;/HashRouter&gt;
            &lt;/Layout&gt;
      &lt;/div&gt;)
    }
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>其中</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="5">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;${this.props.match.path}&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">${<span class="hljs-keyword">this.props.match.path}</span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>是关键。</p>
<p>2、假设还有一个登录组件Login.js,代码如下:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="4">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;import React from 'react'\nimport { Button } from 'antd';\n\nexport default class Login extends React.Component {\n    constructor() {\n      super();\n    }\n\n    redirectHandle = () =&amp;gt; {\n      console.log(\&amp;quot;aaa\&amp;quot;);\n      this.props.history.push(\&amp;quot;/home\&amp;quot;);\n    }\n\n    render() {\n      return (&amp;lt;Button type=\&amp;quot;primary\&amp;quot; onClick={()=&amp;gt;this.redirectHandle()}&amp;gt;Primary Button&amp;lt;/Button&amp;gt;)\n    }\n}&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">import React from 'react'
import { Button } from 'antd';

export default class Login extends React.Component {
    constructor() {
      super();
    }

    redirectHandle = () =&gt; {
      console.log("aaa");
      this.props.history.push("/home");
    }

    render() {
      return (&lt;Button type="primary" onClick={()=&gt;this.redirectHandle()}&gt;Primary Button&lt;/Button&gt;)
    }
}</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>假设React项目用的是React脚手架搭建,则在src目录下的App.js文件中设置路由:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="3">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;render() {\n    return (&amp;lt;HashRouter&amp;gt;\n      &amp;lt;Switch&amp;gt;\n      &amp;lt;Route exact={true} path=\&amp;quot;/login\&amp;quot; component={Login} /&amp;gt;\n      &amp;lt;Route path=\&amp;quot;/home\&amp;quot; component={First} /&amp;gt;\n      &amp;lt;Redirect to='/login' /&amp;gt; {/*/login和/home之外的路由直接跳转到/login*/}\n      &amp;lt;/Switch&amp;gt;\n    &amp;lt;/HashRouter&amp;gt;)\n}&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs">render() {
    <span class="hljs-keyword">return (&lt;HashRouter&gt;
      &lt;Switch&gt;
      &lt;Route exact={true} path="/login" component={Login} /&gt;
      &lt;Route path="/home" component={First} /&gt;
      &lt;Redirect to='/login' /&gt; {/*/login和/home之外的路由直接跳转到/login*/}
      &lt;/Switch&gt;
    &lt;/HashRouter&gt;)
}</span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>App.js完整代码如下:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="2">
<pre class="cke_widget_element" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;javascript&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;import React from 'react';\nimport { notification } from 'antd'\nimport { HashRouter, Route, Switch, Redirect } from 'react-router-dom';\nimport First from './First';\nimport Login from './Login';\nimport './App.css';\n\nclass App extends React.Component {\nconstructor() {\n    super();\n    this.openNotificationWithIcon = type =&amp;gt; {\n      notification({\n      message: 'Notification Title',\n      description:\n          'This is the content of the notification. This is the content of the notification. This is the content of the notification.',\n      });\n    }\n}\n\nclickHandle() {\n    console.log(\&amp;quot;clicked!!!\&amp;quot;);\n}\n\nrender() {\n    return (&amp;lt;HashRouter&amp;gt;\n      &amp;lt;Switch&amp;gt;\n      &amp;lt;Route exact={true} path=\&amp;quot;/login\&amp;quot; component={Login} /&amp;gt; {/**exact 防止混路由混合   如:输入127.xx.xx.xx/home 中有/login页面*/}\n      &amp;lt;Route path=\&amp;quot;/home\&amp;quot; component={First} /&amp;gt;\n      &amp;lt;Redirect to='/login' /&amp;gt;\n      &amp;lt;/Switch&amp;gt;\n    &amp;lt;/HashRouter&amp;gt;)\n}\n}\n\nexport default App;&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-javascript hljs"><span class="hljs-keyword">import React <span class="hljs-keyword">from <span class="hljs-string">'react';
<span class="hljs-keyword">import { notification } <span class="hljs-keyword">from <span class="hljs-string">'antd'
<span class="hljs-keyword">import { HashRouter, Route, Switch, Redirect } <span class="hljs-keyword">from <span class="hljs-string">'react-router-dom';
<span class="hljs-keyword">import First <span class="hljs-keyword">from <span class="hljs-string">'./First';
<span class="hljs-keyword">import Login <span class="hljs-keyword">from <span class="hljs-string">'./Login';
<span class="hljs-keyword">import <span class="hljs-string">'./App.css';

<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">App <span class="hljs-keyword">extends <span class="hljs-title">React.<span class="hljs-title">Component {
<span class="hljs-keyword">constructor() {
    <span class="hljs-keyword">super();
    <span class="hljs-keyword">this.openNotificationWithIcon = <span class="hljs-function"><span class="hljs-params">type =&gt; {
      notification({
      <span class="hljs-attr">message: <span class="hljs-string">'Notification Title',
      <span class="hljs-attr">description:
          <span class="hljs-string">'This is the content of the notification. This is the content of the notification. This is the content of the notification.',
      });
    }
}

clickHandle() {
    <span class="hljs-built_in">console.log(<span class="hljs-string">"clicked!!!");
}

render() {
    <span class="hljs-keyword">return (&lt;HashRouter&gt;
      &lt;Switch&gt;
      &lt;Route exact={true} path="/login" component={Login} /&gt; {/**exact 防止混路由混合   如:输入127.xx.xx.xx/home 中有/login页面*/}
      &lt;Route path="/home" component={First} /&gt;
      &lt;Redirect to='/login' /&gt;
      &lt;/Switch&gt;
    &lt;/HashRouter&gt;)
}
}

export default App;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>项目目录结构如下:</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="1"><img alt="" width="276" height="682" class="cke_widget_element lazyload" src="https://img-blog.csdnimg.cn/20200722214617495.PNG" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200722214617495.PNG&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;276&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;682&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200722214617495.PNG"><span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>项目预览效果如下:</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="0"><img alt="" class="cke_widget_element lazyload" src="https://img-blog.csdnimg.cn/20200722214753388.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2R1YW5zYW12ZQ==,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200722214753388.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2R1YW5zYW12ZQ==,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200722214753388.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2R1YW5zYW12ZQ==,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img width="15" height="15" class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p><br><br>
来源:https://www.cnblogs.com/samve/p/13363356.html
頁: [1]
查看完整版本: React中配置子路由