Released 2023-03-09

Modified 2023-03-18

Tech

598Words (3min read)

使用 Navbar 元件實現 React 路由導航

Title Image

Photo by React on React

正題

繼續前一篇 React 路由的基本設置 | React 學習筆記 的下一步驟,路由配置完了接下來要如何與 Navbar 元件進行結合跳轉呢?

在 React 中要使兩者鏈結跳轉的話,需要使用到 React Router 提供的 Link 元件來創建鏈結。

首先,在 Navbar.js 元件中,將鏈結與 to 屬性指定為相應頁面的路徑。

例如:在主頁的鏈結中,將 to 屬性設置為 /,在 Projects 的鏈結則設置為 /projects,About 的鏈結同理類推。

import { Link } from 'react-router-dom';

function Navbar() {
  return (
    <nav>
      <div className="logo">
        <Link to="/">Logo</Link>
      </div>
      <div className="links">
        <Link to="/projects">Projects</Link>
        <Link to="/about">About</Link>
      </div>
    </nav>
  );
}

export default Navbar;

結果展示範例

Demo

Q&A

Q: 是一定要用 <Link>嗎? 不能使用 <a> 嗎?兩個有什麼差異?還有別的方法嗎?

A: React Router 提供的 <Link> 元件與 HTML 中的 <a> 標籤有些類似,但它們的實現方式有所不同。

使用 <a> 標籤創建鏈接會導致頁面刷新,這會使應用程式變得緩慢並且不夠流暢。而 <Link> 元件則會在不刷新整個頁面的情況下更新 URL 和元件內容,這可以提高應用程式的性能並提供更好的用戶體驗。

如果仍然想使用 <a> 標籤來創建鏈接,可以使用 react-router-dom 中的 useHistory Hook。

例如:

import { useHistory } from 'react-router-dom';

function Navbar() {
  const history = useHistory();

  const handleClick = (path) => {
    history.push(path);
  };

  return (
    <nav>
      <div className="logo">
        <a onClick={() => handleClick('/')}>Logo</a>
      </div>
      <div className="links">
        <a onClick={() => handleClick('/projects')}>Projects</a>
        <a onClick={() => handleClick('/about')}>About</a>
      </div>
    </nav>
  );
}

export default Navbar;

在上面的程式碼中使用 useHistory Hook 獲取了 history 對象,並在單擊鏈接時使用 history.push 方法將用戶導航到相應的頁面。這種方式可以在不刷新整個頁面的情況下更新 URL 和元件內容,從而提高應用程式的性能和用戶體驗。

相關文章

關於 React 的文件結構:

如何組織 React 的文件結構? | React 學習筆記

關於如何建立新 React 檔案:

[Day 19] 如何快速建立最新版 React 專案? - 嘗試 30 日寫文充版挑戰

關於如何在 React 使用 TailwindCSS:

在 React 專案中輕鬆使用 TailwindCSS | React 學習筆記

關於如何在 React 設置路由:

React 路由的基本設置 | React 學習筆記

使用 Navbar 元件實現 React 路由導航

https:///en/blog/38

Author

Kama

Read more from Tech
lightbox-image
Toggle Button - Red Pandas Icons by svgrepo.com

Copyrights © 2023 Kama, All Rights Reserved.