Skip to content

react-router-dom

react-router-dom 是 React 中处理路由的库,它提供了在单页面应用中处理导航和页面切换的功能。下面是关于 react-router-dom 的基本使用和一些进阶使用的示例。

一: 基本使用

  1. 安装:

    bash
    npm install react-router-dom
  2. 使用 BrowserRouter 包裹应用:

    在应用的最外层,使用 BrowserRouter 包裹整个应用,它会提供路由上下文。

    jsx
    import { BrowserRouter as Router } from 'react-router-dom';
    
    const App = () => {
      return (
        <Router>
          {/* 应用的其他组件和路由配置放在这里 */}
        </Router>
      );
    };
  3. 定义路由:

    使用 Route 组件来定义路由。Routepath 属性表示路由路径,component 属性表示匹配该路径时渲染的组件。

    jsx
    import { Route } from 'react-router-dom';
    
    const Home = () => <div>Home Page</div>;
    const About = () => <div>About Page</div>;
    
    const App = () => {
      return (
        <Router>
          <Route path="/" exact component={Home} />
          <Route path="/about" component={About} />
        </Router>
      );
    };
  4. 导航链接:

    使用 Link 组件来创建导航链接,使用户能够点击链接切换页面。

    jsx
    import { Link } from 'react-router-dom';
    
    const Navigation = () => {
      return (
        <nav>
          <ul>
            <li>
              <Link to="/">Home</Link>
            </li>
            <li>
              <Link to="/about">About</Link>
            </li>
          </ul>
        </nav>
      );
    };

二: 进阶使用

  1. 嵌套路由:

    可以在组件内部定义嵌套的路由,这样可以更灵活地组织页面结构。

    jsx
    const Product = () => {
      return (
        <div>
          <h2>Product Page</h2>
          <Route path="/product/:id" component={ProductDetails} />
        </div>
      );
    };
  2. 路由参数:

    使用 :param 语法可以定义路由参数,可以在组件中通过 useParams 钩子获取参数值。

    jsx
    import { useParams } from 'react-router-dom';
    
    const ProductDetails = () => {
      const { id } = useParams();
      return <div>Product Details for ID: {id}</div>;
    };
  3. 路由守卫:

    使用 react-router-dom 提供的高阶组件 withRouter 可以在组件内部获取 historylocationmatch 属性,进行路由守卫操作。

    jsx
    import { withRouter } from 'react-router-dom';
    
    const ScrollToTop = ({ history }) => {
      useEffect(() => {
        const unlisten = history.listen(() => {
          window.scrollTo(0, 0);
        });
        return () => {
          unlisten();
        };
      }, [history]);
    
      return null;
    };
    
    export default withRouter(ScrollToTop);
  4. 使用 Switch 包裹 Route

    Switch 组件用于只渲染与当前地址匹配的第一个子元素 RouteRedirect

    jsx
    import { Switch, Route, Redirect } from 'react-router-dom';
    
    const App = () => {
      return (
        <Router>
          <Switch>
            <Route path="/home" component={Home} />
            <Route path="/about" component={About} />
            <Redirect from="/" to="/home" />
          </Switch>
        </Router>
      );
    };

这是一些 react-router-dom 的基本和进阶使用示例,根据具体的项目需求,可以进一步深入学习和使用更多的高级特性。

三: 在 react-router-dom 中,有一些高级特性和 API,可以用于动态调整页面路径或进行导航操作。

以下是其中一些常见的高级特性:

使用 useHistory 钩子

useHistory 钩子提供了 pushreplace 等方法,用于进行导航操作。

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

const MyComponent = () => {
  const history = useHistory();

  const handleClick = () => {
    // 使用 push 进行导航
    history.push('/new-path');

    // 或者使用 replace 进行导航,不保留当前页面在历史记录中
    // history.replace('/new-path');
  };

  return (
    <button onClick={handleClick}>Navigate to New Path</button>
  );
};

使用 useLocation 钩子

useLocation 钩子提供了当前页面的 pathnamesearchhash 等信息。

jsx
import { useLocation } from 'react-router-dom';

const MyComponent = () => {
  const location = useLocation();
  const { pathname, search, hash } = location;

  return (
    <div>
      <p>Pathname: {pathname}</p>
      <p>Search: {search}</p>
      <p>Hash: {hash}</p>
    </div>
  );
};

使用 useParams 钩子

useParams 钩子用于获取路由参数。

jsx
import { useParams } from 'react-router-dom';

const ProductDetails = () => {
  const { id } = useParams();

  return <div>Product Details for ID: {id}</div>;
};

使用 useRouteMatch 钩子

useRouteMatch 钩子用于获取与当前 URL 匹配的 Route 的信息。

jsx
import { useRouteMatch } from 'react-router-dom';

const MyComponent = () => {
  const match = useRouteMatch('/path/:id');
  const { params } = match;

  return <div>Matched ID: {params.id}</div>;
};

这些钩子和方法提供了丰富的路由控制能力,可以根据具体场景选择使用。如果需要更多的动态路由控制,建议查阅 react-router-dom 官方文档,其中有详细的 API 说明和示例。