使用 react-router 链接到其他组件

Posted

技术标签:

【中文标题】使用 react-router 链接到其他组件【英文标题】:Linking to other components with react-router 【发布时间】:2019-01-21 18:17:09 【问题描述】:

我对 React 很陌生,我正在尝试使用 react-router 导航到新组件。以前,网站是静态 html 和 CSS,因此很容易在 html 文件之间导航,但是,自从使用 React 进行切换和更新网站后,我有点困惑。

我一直在关注两个 tuts:

    https://medium.com/@pshrmn/a-simple-react-router-v4-tutorial-7f23ff27adf https://www.youtube.com/watch?v=1iAG6h9ff5s&index=6&list=PLoYCgNOIyGABj2GQSlDRjgvXtqfDxKm5b

现在我有一个简单的关于页面组件,我试图在单击页面页脚上的“关于”链接时呈现该组件。因此,当前发生的情况是,当我单击页脚上的 about 链接时,它会从 localhost:3000/#/react 变为 localhost:3000/#/about,但页面上没有任何变化。它仍然显示索引/主页,但我希望它显示关于内容。

这是我的代码:

Components 文件夹包含 About.jsFooter.jspages 文件夹包含 App.jsIndex.js

关于.js:

import React from 'react';

const About = function() 
  return (
    <div>
      <h1 className="container-headers">- Our Mission and Vision -</h1>
      <p>
        Blah, blah.. this going to work?
      </p>
    </div>
  )


export default About;

Footer.js

import React from 'react';
import Logo from '../img/footer-logo.png';
import FontAwesomeIcon from '@fortawesome/react-fontawesome';
import  Link  from 'react-router-dom';


const Footer = function() 
  return (
    <div className="container-fluid twenty-padding-top">
      <div className="row">

        <div className="col-lg-4 col-sm-12 sixty-bottom-margin">
          <ul className="contact">
            <span className="margin-top-twentypx">Menu</span>

            <li>
              <Link to="about">About</Link>
            </li>

            <li>
              <a href="about.html">Provider Login</a>
            </li>

            <li>
              <a href="#">Blog</a>
            </li>
          </ul>
        </div>

      </div>
    </div>
  )


export default Footer;

App.js

import React,  Component  from 'react';
import './App.css';
import Services from './components/Services';
import Navbar from './components/Navbar';
import HowItWorks from './components/HowItWorks';
import BitIcons from './components/BitIcons';
import Footer from './components/Footer';
import Banner from './components/Banner';

class App extends Component 
  render() 
    return (
      <div className="App">
        <Navbar />
        <Banner />
        <Services />
        <HowItWorks />
        <BitIcons />
        <Footer />
      </div>
    );
  


export default App;

最后,index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import 'bootstrap/dist/css/bootstrap.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import registerServiceWorker from './registerServiceWorker';

import  Switch, HashRouter, Route, Link  from 'react-router-dom';

const app = document.getElementById('root');

const About = () => (
  <Switch>
    <Route exact path='/about' component=About />
  </Switch>
)

const Main = () => (
  <Main>
    <Switch>
      <Route exact path='/about' component=About />
    </Switch>
  </Main>
)

const Header = () => (
  <header>
    <nav>
      <ul>
        <li><Link to='/about'>About</Link></li>
      </ul>
    </nav>
  </header>
)

ReactDOM.render(
  <HashRouter>
    <App />
  </HashRouter>,
app);

registerServiceWorker();

有谁知道问题出在哪里,以及我如何从本质上“隐藏”索引/主页主登录页面并改为显示关于内容?

谢谢!

【问题讨论】:

如何渲染登陆页面?您没有在您的index.js 中使用您的AboutMainHeader 组件。您只使用了您的App,它使用了其他组件,例如NavbarBanner等。 @devserkan 还有一个公用文件夹,其中包含一个 index.html 文件,我将所有内容附加到根目录。 实际附件在HashRouter内的index.js中。 我不知道你是怎么做到的,但你为什么不在你的应用程序中使用这个逻辑呢?带有一些组件的登录页面,然后带有 Link 的只是转到相关页面。 @devserkan 所以就像一个标准的 HTML 页面,其中混合了一些 React 组件,其中有标准链接 ? 【参考方案1】:

您可以按照以下方式进行所需的简单设置:

import React from "react";
import ReactDOM from "react-dom";
import  BrowserRouter, Route, Switch, Link  from "react-router-dom";

const Landing = () => (
  <div>
    <h3>This is landing page with Foo and Bar</h3>
    <Foo />
    <Bar />
  </div>
)
const Foo = () => <div>This is component Foo.</div>;
const Bar = () => <div>This is component Bar.</div>;
const About = () => <div>This is component About.</div>;
const Header = () => (
  <div style=height: "30px", background: "gray">Header | 
  <Link to="/about"> Go to about</Link>
  </div>
);
const Footer = () => (
  <div style= height: "30px", background: "gray" >Footer |
  <Link to="/about"> Go to about</Link>
  </div>
);

const NotFound = () => <div>Not found</div>

class App extends React.Component 
  render() 
    return (
      <div>
      <BrowserRouter>
        <div>
            <Header />
            <Switch>
              <Route exact path="/" component=Landing />
              <Route path="/about" component=About />
              <Route component=NotFound />
            </Switch>
            <Footer />
        </div>
      </BrowserRouter>
      </div>
    );
  


ReactDOM.render(<App />, document.getElementById("root"));

【讨论】:

以上是关于使用 react-router 链接到其他组件的主要内容,如果未能解决你的问题,请参考以下文章

十react-router 4.x的基本配置

有没有办法单击 div 容器包装的 react-router 链接组件?

有没有办法单击 div 容器包装的 react-router 链接组件?

如何使用 react-router 在组件中保存表单的状态

如何使用组件类中的 react-router 链接来使用组件中的数据?

React-Router 4默认路由内容显示在所有其他组件上[重复]