简体   繁体   English

有什么方法可以将 href 标签转换为 React.js 上的链接?

[英]Is there some way I can convert href tag to Link on React.js?

Thank you for opening this page in advance.感谢您提前打开此页面。 I am a self-taught coder.我是一名自学成才的程序员。 And now I am making my personal page with Bootstrap.现在我正在使用 Bootstrap 制作我的个人页面。

What I want to do now is;我现在想做的是; SPA feature of React.js. React.js 的 SPA 功能。 All I understand this feature is;我所理解的这个功能是;

  1. install "react-router-dom",安装“react-router-dom”,
  2. import { Link, NavLink } from "react-router-dom";从“react-router-dom”导入{链接,导航链接};
  3. And replace those anchor and href tag to Link to=并将那些锚和 href 标签替换为Link to=

The following code is in 'src' folder.以下代码位于“src”文件夹中。

Navbar.js导航栏.js

import React from "react";
import logoImage from "../components/logo.png";
// React fontawesome imports
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faBars } from "@fortawesome/free-solid-svg-icons";
import { Link, NavLink } from "react-router-dom";



const Navbar = () => {
    return (
        <nav className="navbar navbar-expand-lg navbar-light bg-white">
        <div className="container-fluid">

            <a className="navbar-brand mr-auto" href="#"><img className="logo" src={logoImage} alt="logoImage"/></a
            <button 
            className="navbar-toggler" 
            type="button" 
            data-bs-toggle="collapse" 
            data-bs-target="#navbarSupportedContent" 
            aria-controls="navbarSupportedContent" 
            aria-expanded="false" 
            aria-label="Toggle navigation"
            >
                <FontAwesomeIcon icon={faBars} style={{ color: "#2ff1f2" }}/>
            </button>

            <div className="collapse navbar-collapse" id="navbarSupportedContent">
                <ul className="navbar-nav ml-auto">
                    <li className="nav-item">
                        <a className="nav-link active" aria-current="page" href="../components/About">About me</a>
                    </li>
                    <li className="nav-item">
                        <a className="nav-link" href="#">Thoughts</a>
                    </li>
                    <li className="nav-item">
                        <a className="nav-link" href="#">Portfolio</a>
                    </li>
                    <li className="nav-item">
                        <a className="nav-link" href="#">Contacts</a>
                    </li>

                </ul>
                </div>
            </div>
            </nav>
                )
            }

export default Navbar;

App.js应用程序.js

import './App.css';
import "bootstrap/dist/css/bootstrap.min.css";
import Button from "react-bootstrap/Button";
import Particles from "react-particles-js";
import Navbar from "./components/Navbar";
import Header from "./components/Header";
import About from "./components/About";

function App() {
  return (
    <>
      <Particles
        className="particles-canvas"
          params={{
            particles: {
            number: {
            value: 30,
            density: {
            enable: true,
            value_area: 900
            }},
            shape: {
            type: "star",
            stroke: {
            width: 6,
            color: "#f9ab00"
            }}}}}
      />
      <Navbar />
      <Header />
      <About />
    </>
  );
}

export default App;

Header.js Header.js

import React from "react";
import Typed from "react-typed";
import { Link } from "react-router-dom";

const Header = () => {
    return (
        <div className="header-wraper">
            <div className="main-info">
                <h1>Welcome, this is my own personal page</h1>
                <Typed
                    className="typed-text"
                    strings={["text message to display in the centre of the page"]}
                    typeSpeed={80}
                />
                <a href="#" className="btn-main-offer">Details</a>



        </div>
    </div>
    )
}

export default Header;

And soon as I replace一旦我更换

<a className="nav-link" href="#">Thoughts</a> 

to

<Link to="../components/About">Thoughts</Link>

It stops working with this following error message.它停止使用以下错误消息。

×
Error: Invariant failed: You should not use <Link> outside a <Router>
invariant
C:/Users/Administrator/my-portfolio/node_modules/tiny-invariant/dist/tiny-invariant.esm.js:10
(anonymous function)
C:/Users/Administrator/modules/Link.js:88
  85 | return (
  86 |   <RouterContext.Consumer>
  87 |     {context => {
> 88 |       invariant(context, "You should not use <Link> outside a <Router>");
     | ^  89 | 
  90 |       const { history } = context;
  91 | 

My understanding to this error is:我对这个错误的理解是:

  1. I should make Router.js file in src folder.我应该在 src 文件夹中创建 Router.js 文件。
  2. I should just start again without Bootstrap first.我应该在没有 Bootstrap 的情况下重新开始。 Once SPA feature is done, then I can start work on this CSS feature as CSS in JS (eg const something = div.styled ``;)完成 SPA 功能后,我可以在 JS 中将 CSS 功能作为 CSS 开始工作(例如 const something = div.styled `;)

I know this sounds ridiculous, but this is the best option I could think for now.我知道这听起来很荒谬,但这是我目前能想到的最佳选择。

Question is, Where should I begin investigating this error message?问题是,我应该从哪里开始调查此错误消息?

I am currently relying on this document page to remove the error message.我目前依靠此文档页面来删除错误消息。 1st Example: Basic Routing - https://reactrouter.com/web/guides/quick-start第一个示例:基本路由 - https://reactrouter.com/web/guides/quick-start

I would appreciate your opinion.我会很感激你的意见。 Thank you.谢谢你。 If I found a solution, I will update it with mine here.如果我找到了解决方案,我会在这里用我的更新。

Yes, you can do that, this error happen since you are missing to wrap <Link> component via <Router> ...是的,您可以这样做,发生此错误是因为您缺少通过<Router>包装<Link>组件...

If you like to put it for all project, you can simply do this:如果你想把它放在所有项目中,你可以简单地这样做:

    <Router>
  <App />
</Router>

Example:例子:

   <Router>
  <div>
    <nav>
      <ul>
        <li>
          <Link to="/">Home</Link>
        </li>
        <li>
          <Link to="/about">About</Link>
        </li>
        <li>
          <Link to="/users">Users</Link>
        </li>
      </ul>
    </nav>

    {/* A <Switch> looks through its children <Route>s and
        renders the first one that matches the current URL. */}
    <Switch>
      <Route path="/about">
        <About />
      </Route>
      <Route path="/users">
        <Users />
      </Route>
      <Route path="/">
        <Home />
      </Route>
    </Switch>
  </div>
</Router>

Router is a component provided by react-router-dom As the error says, Link can be used inside Router . Routerreact-router-dom提供的一个组件,如报错所说,可以在Router内部使用 Link 。

Also, path for Link should actual browser url and not the path of the component.此外,链接的路径应该是实际浏览器 url 而不是组件的路径。 Ideal way is to add routes for each component.理想的方法是为每个组件添加路由。

For Example your App can be like this: ( Only for reference )例如您的应用程序可以是这样的:(仅供参考

function App() {
  return (
    <Router>
      <Switch>
        <Route path="/about">
          <About />
        </Route>
        <Route path="/">
          <Navbar />
        </Route>
      </Switch>
    </Router>
  );
}

This is a good question, but, in order to answer it the best way, you will need to work with several files, as I'm sure you're already aware of.这是一个很好的问题,但是,为了以最佳方式回答它,您将需要处理多个文件,我相信您已经知道了。

To start, assuming you used create-react-app , go to the index.js file, and wrap everything from the first parameter with react-router-dom 's BrowserRouter component.首先,假设您使用create-react-app 、 go 到 index.js 文件,并使用react-router-domBrowserRouter组件包装从第一个参数开始的所有内容。 It should look like the following:它应该如下所示:

index.js index.js

import { BrowserRouter } from "react-router-dom";

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

Next, you will want to use react-router-dom 's Switch component to wrap all the application's routes.接下来,您将要使用react-router-dom的 Switch 组件来包装所有应用程序的路由。

App.js应用程序.js

import { Route, Switch } from "react-router";

import Navbar from "./components/Navbar";
import Header from "./components/Header";
import About from "./components/About";

// Particles component removed for explanation
function App() {
  return (
   <Navbar />
   <Header />

   // When a link is clicked, the component will appear within the following div,
   // so if you want certain elements to stay where they are on the page, wrap
   // and place the Switch component accordingly.
   <div className='pages'>
     <Switch>
       <Route path='/about' component={About} />
       <Route path='/profile' component={profile} />
       <Route path='/thoughts' component={Thoughts} />   
       <Route path='/contacts' component={Contacts} />
     </Switch>
   </div>

  );
}

export default App;

Now, within any child component of App , you can use react-router-dom Links (I personally prefer using NavLink due to its ease of styling).现在,在App的任何子组件中,您都可以使用react-router-dom Links (我个人更喜欢使用NavLink ,因为它易于样式化)。 This could be done by the following:这可以通过以下方式完成:

Navbar.js导航栏.js

import { NavLink } from "react-router-dom";

const Navbar = (props) => {
 return (
  <nav className="navbar navbar-expand-lg navbar-light bg-white">
   <div className="container-fluid">

     <NavLink className="navbar-brand mr-auto" to='/home'>
        <img className="logo" src={logoImage} alt="logoImage"/>
     </NavLink
      <button 
        className="navbar-toggler" 
        type="button" 
        data-bs-toggle="collapse" 
        data-bs-target="#navbarSupportedContent" 
        aria-controls="navbarSupportedContent" 
        aria-expanded="false" 
        aria-label="Toggle navigation"
       >
          <FontAwesomeIcon icon={faBars} style={{ color: "#2ff1f2" }}/>
       </button>

   <div className="collapse navbar-collapse" id="navbarSupportedContent">
      <ul className="navbar-nav ml-auto">
         <li className="nav-item">
           <NavLink className="nav-link active" to='/about'>About me</NavLink>
         </li>
          <li className="nav-item">
            <NavLink className="nav-link" to='/thoughts'>Thoughts</NavLink>
          </li>
          <li className="nav-item">
            <NavLink className="nav-link" to='/portfolio'>Portfolio</NavLink>
          </li>
          <li className="nav-item">
            <NavLink className="nav-link" to='/contacts'>Contacts</NavLink>
          </li>
       </ul>
    </div>
   </div>
  </nav>
 )
};

export default Navbar;

After doing what is shown below, you will be able to navigate throughout your page using react-router-dom .完成如下所示的操作后,您将能够使用react-router-dom浏览整个页面。

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

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