简介react-router-dom基本使用

本文详细介绍了React Router DOM的使用,包括如何通过`yarn add react-router-dom`安装,以及四大核心Hook:`useHistory`、`useLocation`、`useParams`和`useRouteMatch`的用法示例。通过这些Hook,开发者能够轻松地实现页面导航、获取当前URL信息、解析动态参数和进行路由匹配,从而更好地管理React应用中的路由状态。

1.下载包

yarn add react-router-dom 

2. 常用HOOK

  • useHistory:返回 history 对象,可以使用 useHistory 进行导航;
  • useLocation:返回当前URL的 location 对象,每当URL发生变化时,它都会返回一个新的位置;
  • useParams:动态参数列表的引用对象,用于获取<Route>中的 match.params (动态参数)
  • useRouteMatch:主要用于访问匹配数据,而无需实际渲染<Route>

3.基本使用

1.useHistory

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

function JumpPage() {
  let history = useHistory();

  function handleClick() {
    history.push("/跳转位置");
  }

  return (
    <button type="button" onClick={handleClick}>
      Go back
    </button>
  );
}

2.useLocation

import React from "react";
import ReactDOM from "react-dom";
import {
  BrowserRouter as Router,
  Switch,
  useLocation
} from "react-router-dom";

function usePageViews() {
  let location = useLocation();
  React.useEffect(() => {
    ga.send(["pageview", location.pathname]);
  }, [location]);
}

function App() {
  usePageViews();
  return <Switch>...</Switch>;
}

ReactDOM.render(
  <Router>
    <App />
  </Router>,
  node
);

3.useParams

import React from "react";
import ReactDOM from "react-dom";
import {
  BrowserRouter as Router,
  Switch,
  Route,
  useParams
} from "react-router-dom";

function BlogPost() {
  let { slug } = useParams();
  return <div>Now showing post {slug}</div>;
}

ReactDOM.render(
  <Router>
    <Switch>
      <Route exact path="/">
        <HomePage />
      </Route>
      <Route path="/blog/:slug">
        <BlogPost />
      </Route>
    </Switch>
  </Router>,
  node
);

4.useRouteMatch

useRouteMatch 尝试以与<Route>相同的方式匹配当前URL。

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

function BlogPost() {
  let match = useRouteMatch("url");

  // 匹配你想要匹配的url
  return <div />;
}
// ------等比于------
import { Route } from "react-router-dom";

function BlogPost() {
  return (
    <Route
      path="url"
      render={({ match }) => {
        // 匹配你想要匹配的url
        return <div />;
      }}
    />
  );
}

useRouteMatch 钩子也可以:

  • 不接受任何参数并返回当前<Route>
  • 接受单个参数,与matchPath的props参数相同。它可以是一个字符串形式的路径名(类似此例子),也可以是一个带有匹配道具的对象,例如:
const match = useRouteMatch({
  path: "url",
  strict: true,
  sensitive: true
});

### 两者的主要区别 `npm install react-router-dom` 和 `npm i react-router` 是两个用于安装不同版本和用途的 React 路由库的命令。以下是它们之间的主要区别: #### 1. **适用平台** - `react-router-dom` 是专门为 Web 平台设计的路由库[^1]。它提供了与浏览器交互的功能,例如 `BrowserRouter`、`HashRouter` 等组件。 - `react-router` 是一个更通用的核心库,适用于所有平台(包括 Web、Native 等)。它是 `react-router-dom` 和 `react-router-native` 的基础[^3]。 #### 2. **依赖关系** - 安装 `react-router-dom` 时,`react-router` 会被作为其依赖项自动安装[^1]。因此,`react-router-dom` 包含了 `react-router` 的功能,并在此基础上添加了针对 Web 的特定功能。 - 如果单独安装 `react-router`,则不会包含任何特定于 Web 或 Native 的功能,需要根据需求手动选择其他扩展包(如 `react-router-dom` 或 `react-router-native`)[^3]。 #### 3. **功能差异** - `react-router-dom` 提供了专门用于 Web 开发的组件,例如 `BrowserRouter` 和 `HashRouter`,这些组件利用了浏览器的历史 API 和 URL 哈希值来管理路由[^2]。 - `react-router` 只提供核心功能,例如 `MemoryRouter` 和 `Prompt` 等,不包含任何与浏览器或原生环境相关的特定实现[^4]。 #### 4. **安装命令** - `npm install react-router-dom`:安装 `react-router-dom` 及其依赖项 `react-router`。 - `npm i react-router`:仅安装核心库 `react-router`,不包含任何平台特定的功能。 #### 示例代码 以下是一个使用 `react-router-dom` 的简单示例: ```javascript import React from 'react'; import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; function App() { return ( <Router> <Switch> <Route path="/" component={Home} /> </Switch> </Router> ); } export default App; ``` 而如果使用 `react-router`,则需要手动选择合适的路由器组件,例如 `MemoryRouter`: ```javascript import React from 'react'; import { MemoryRouter as Router, Route, Switch } from 'react-router'; function App() { return ( <Router> <Switch> <Route path="/" component={Home} /> </Switch> </Router> ); } export default App; ``` ### 结论 对于 Web 开发,推荐使用 `react-router-dom`,因为它包含了所有必要的 Web 特定功能[^2]。而对于跨平台开发或需要自定义路由器的情况,可以选择安装 `react-router` 并根据需求扩展其功能[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值