【React Router 6 快速上手二】useParams / useSearchParams / useLocation / 编程式路由导航useNavigate等API

news2025/2/24 22:03:35

前言

博主主页👉🏻蜡笔雏田学代码
专栏链接👉🏻React专栏
之前学习了react-router-dom5版本的相关内容
参考文章👉🏻React路由组件传参的三种方式和 【React路由】编程式路由导航
回顾上篇文章👉🏻【React Router 6 快速上手一】,今天来学习react-router-dom6版本的另一些相关知识!
感兴趣的小伙伴一起来看看吧~🤞

在这里插入图片描述

文章目录

  • 1. 向路由组件传递params参数:useParams()
  • 2. 向路由组件传递search参数:useSearchParams()
  • 3. 向路由组件传递state参数:useLocation()
  • 4. 编程式路由导航useNavigate()
  • 5. useInRouterContext()
  • 6. useNavigationType()
  • 7. useOutlet()
  • 8. useResolvedPath()


1. 向路由组件传递params参数:useParams()

在v5版本中,路由组件传递参数方式有三种:params、search、state。在v6中,都能用这三种方式,但是写法不一样了。

在这里插入图片描述

当点击消息1这个导航链接时,展示下方对应的Detail路由组件,并向这个组件传递params参数(ID,TITLE,CONTENT)信息。

向路由组件传递params参数:和v5一样,在路径后面跟上想要传递的值

Message.jsx

message.map((m) => {
  return (
    // 路由链接
    <li key={m.id}>
       <Link to={`detail/${m.id}/${m.title}/${m.content}`}>
       	{m.title}
       </Link>&nbsp;&nbsp;
    </li>
  )
})

在路由表中,声明接收params参数

routes=>index.jsx

{
  path: 'message',
  element: <Message />,
  children: [
     {
         path: 'detail/:id/:title/:content',
         element: <Detail />
     }
   ]
}

这样id,title参数就传递给了Detail组件,Detail组件就要拿到这三个参数,在v5版本中是通过this.props.match.params拿到参数,但是v6中,函数式组件没有this,所以不能用这种方式,需要借助一个Hook:useParams

Detail.jsx

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

export default function Detail() {
  // 获取URL中携带过来的params参数
  const { id, title, content } = useParams()
  // console.log(a)
  //{id: '001', title: '消息1', content: '你好'}
  
  //还可以使用另外一个Hook:useMatch(比较麻烦)
  //const x = useMatch('/home/message/detail/:id/:title/:content')
  return (
    <ul>
      <li>ID{id}</li>
      <li>TITLE{title}</li>
      <li>CONTENT{content}</li>
    </ul>
  )
}

效果

在这里插入图片描述

2. 向路由组件传递search参数:useSearchParams()

作用:用于读取和修改当前位置的 URL 中的查询字符串。

返回一个包含两个值的数组,内容分别为:当前的seaech参数更新search的函数

向路由组件传递search参数:写法和v5一样

Message.jsx

message.map((m) => {
    return (
    // 路由链接
    <li key={m.id}>
        <Link to={`detail?id=${m.id}&title=${m.title}&content=${m.content}`}>
        	{m.title}
        </Link>&nbsp;&nbsp;
    </li>
  )
})

在路由表中,无需声明接收params参数

Detail组件要拿到传递过来的参数,需要使用一个Hook:useSearchParams(和useState方法类似)。

Detail.jsx

import React from 'react'
import { useSearchParams } from 'react-router-dom';

export default function Detail() {
  const [search, setSearch] = useSearchParams()
  const id = search.get('id')
  const title = search.get('title')
  const content = search.get('content')
  
  //还可以使用另外一个Hook:useLocation
  const x = useLocation()
  
  return (
    <ul>
      <li>ID{id}</li>
      <li>TITLE{title}</li>
      <li>CONTENT{content}</li>
    </ul>
  )
}

const [search, setSearch] = useSearchParams()

useSearchParams()拿到search参数,然后调身上的get()方法才能得到具体的某一个参数(id/title/content)

setSearch:主要用于更新收到的search参数的方法

<li>
  <button onClick={() => setSearch('id=004&title=哈哈&content=嘻嘻')}>
  	点我更新一下search参数
  </button>
</li>

3. 向路由组件传递state参数:useLocation()

向路由组件传递search参数:和v5不同(比v5更简单)

Message.jsx

message.map((m) => {
  return (
     // 路由链接
     <li key={m.id}>
       <Link
          to='detail'
          state={{
            id: m.id,
            title: m.title,
            content: m.content
          }}
       >{m.title}</Link>&nbsp;&nbsp;
     </li>
   )
})

在路由表中,无需声明接收params参数

Detail组件要拿到传递过来的参数,需要使用一个Hook:useLocation

import React from 'react'
import { useLocation } from 'react-router-dom'

export default function Detail() {
  //连续解构赋值
  const { state: { id, title, content } } = useLocation()
  return (
    <ul>
      <li>ID{id}</li>
      <li>TITLE{title}</li>
      <li>CONTENT{content}</li>
    </ul>
  )
}

4. 编程式路由导航useNavigate()

需求

现在我想在每一个消息的后面有一个"点我查看详情"按钮,下方展示详情内容,之前都是靠Link来展示详情内容。

效果

在这里插入图片描述

Message.jsx

import {useNavigate } from 'react-router-dom'
...
const navigate = useNavigate()
function showDetail(m) {
  navigate('detail', //路径
   //配置对象
   {
    replace: false, //push模式
    //只能写state,不能写search/params参数
    //如果是search/params参数,直接写在路径里
    state: {
      id: m.id,
      title: m.title,
      content: m.content
    }
  })
}
...
// 路由链接
<li key={m.id}>
  <Link
		to='detail'
		state={{
       id: m.id,
       title: m.title,
       content: m.content
      }}
  >{m.title}</Link>&nbsp;&nbsp;
	<button onClick={() => showDetail(m)}>查看详情</button>
</li>

点击查看详情按钮实现组件切换,需要使用一个Hook:useNavigate,原来v5版本通过this.props.history可以完成的功能(前进/后退),navigate()都可以完成,navigate不像this.props.history有很多API(goBack/goForward)。

那么,如果想用useNavigate实现后退或前进功能呢?

在这里插入图片描述

新增一个非路由Header组件:

components/Header.jsx

import React from 'react'
import { useNavigate } from 'react-router-dom'

export default function Header() {
  const navigate = useNavigate()
  function back() {
    navigate(-1)
  }
  function forward() {
    navigate(1)
  }

  return (
    <div className="col-xs-offset-2 col-xs-8">
      <div className="page-header">
        <h2>React Router Demo</h2>
        <button onClick={back}>⬅后退</button>
        <button onClick={forward}>➡前进</button>
      </div>
    </div>
  )
}

在v5中,只有路由组件身上才有三个独有的属性:history/match/location,来实现各种跳转,一般组件想用路由组件身上的API,需要使用withRouter(),然而v6中,移除了withRouter(),想要实现编程式路由导航,使用useNavigate()这个Hook就能实现了,所以在Header一般组件引入useNavigate也能实现编程式路由导航

5. useInRouterContext()

作用:如果组件在 <Router> 的上下文中呈现(目前所处的组件被BrowserRouter包裹了),则 useInRouterContext 钩子返回 true,否则返回 false。

6. useNavigationType()

  1. 作用:返回当前的导航类型(用户是如何来到当前页面的)。
  2. 返回值:POPPUSHREPLACE
  3. 备注:POP是指在浏览器中直接打开了这个路由组件(刷新页面)。

7. useOutlet()

作用:用来呈现当前组件中渲染的嵌套路由组件。

const result = useOutlet()
console.log(result)
// 如果嵌套路由没有挂载,则result为null
// 如果嵌套路由已经挂载,则展示嵌套的路由对象

8. useResolvedPath()

作用:解析路径,给定一个 URL值,解析其中的:path、search、hash值。

console.log(useResolvedPath('/user?id=001&name=tom#qwe'))
//打印结果:
//{pathname:'/user',search:'?id=001&name=tom',hash:'#qwe'}

今天的分享就到这里啦✨ \textcolor{red}{今天的分享就到这里啦✨} 今天的分享就到这里啦

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

🤞 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nvm管理node版本

nvm 使用 1. nvm介绍 nvm 全英文也叫 node.js version management&#xff0c;是一个 nodejs 的版本管理工具 nvm 和 npm 都是 node.js 版本管理工具&#xff0c;为了解决 node.js 各种版本存在不兼容现象可以通过它可以安装和切换不同版本的 node.js 2. 安装与配置 2-1 nv…

CSS绝对定位(absolute)、相对定位(relative)方法(详解)

CSS中几种常用的定位方法&#xff0c;直接上干货&#xff01; 什么是定位&#xff1f; 元素可以使用的顶部&#xff0c;底部&#xff0c;左侧和右侧属性定位。然而&#xff0c;这些属性无法工作&#xff0c;除非是先设定 position属性。他们也有不同的工作方式&#xff0c;这…

Echarts直角坐标系x轴y轴属性设置大全

1、Echarts版本 "echarts": "^5.3.3", 2、最简单的直角坐标系&#xff0c;以柱状图为例。 常见的直角坐标系&#xff0c;x轴设置type: category&#xff0c;为类目轴&#xff0c;适用于离散的类目数据&#xff1b;y轴设置type: value&#xff0c;为数值轴…

前端编程中你是如何进行调试代码的?这篇文章让你学会更多调试方法——前端新手进阶

要我讲就是&#xff1a;对自己代码自信的人&#xff0c;从来不需要调试&#xff0c;只是log一下值是否符合预期(doge)。 哈哈&#xff0c;这当然是一句玩笑话&#xff0c;不管你是刚刚起步的新手&#xff0c;还是从业多年的老手&#xff0c;编程中或多或少都会遇到一些瓶颈&…

Vue3中的watch监听

目录 一、监听基础ref类型 1、监听单个ref数据 2、 监听多个ref数据 二、监听reactive类型 1、监听对象中单个属性 2、监听对象中多个属性 3、同时监听ref基本类型数据和reactive对象中的属性 4、监听整个对象 5、监听对象中值为对象的属性 三、watchEffect 一、监听基础…

JS数组方法中哪些会改变原数组,哪些不会?

前言 作为一名前端开发人员&#xff0c;我们每天都会与数组打交道。JS 也提供了很多操作数组的原生 API 供我们调用。在这些方法里面&#xff0c;有的方法会改变原数组&#xff0c;有些不会改变原数组。别看这一点小小的区别&#xff0c;往往会造成巨大的影响&#xff0c;特别…

HTML常用标签超详细整理

HTML概述 1.1 什么是HTML HTML是做网站的、Web开发、互联网生态开发(PC端移动端微应用) 目前我们使用的都是HTML5,支持传统的PC端开发&#xff0c;还支持移动端开发还支持微应用开发,从而替换了部分传统的移动端开发技术 1.2 HTML概念 HTML:Hyper Text Markup Language&#…

小满Vue3第三十六章(Vue如何开发移动端)

视频教程Vue3 vite Ts pinia 实战 源码 全栈_哔哩哔哩_bilibili 如果使用npm init vuelatest 报错 error when starting dev server: Error: Cannot find module node:path nodejs 升级为16版本就好了 开发移动端最主要的就是适配各种手机&#xff0c;为此我研究了一套…

让div居中的方式的几种方法

让div水平居中的方式的几种方法。 文章目录 一、margin二、绝对定位三、子元素绝对定位父元素相对定位四、flex布局总结 一、margin 第一种方式我们可以利用外边距属性来使div水平垂直居中 先来看一段有问题的代码 <!DOCTYPE html> <html lang"en"> &…

React框架创建项目详细流程-项目的基本配置-项目的代码规范

文章目录React创建项目流程与规范项目规范项目配置目录结构样式重置Router配置Redux状态管理axios配置React创建项目流程与规范 项目规范 项目规范: 在项目中都会有一些开发规范和代码风格, 下面介绍一下我采用的规范与风格 文件夹、文件名称统一小写、多个单词以连接符(-)连…

vue实战--vue+elementUI实现多文件上传+预览(word/PDF/图片/docx/doc/xlxs/txt)

需求 最近在做vue2.0element UI的项目中遇到了一个需求&#xff1a;需求是多个文件上传的同时实现文件的在线预览功能。需求图如下&#xff1a; 看到这个需求的时候&#xff0c;小栗脑袋一炸。并不知道该如何下手&#xff0c;之前的实践项目中也并没有遇到相似的功能。因此也…

webpack配置

webpack 前端工程化 实际的前端开发 模块化&#xff08;js 的模块化、css 的模块化、资源的模块化&#xff09; 组件化&#xff08;复用已有的 UI 结构、样式、行为&#xff09; 规范化&#xff08;目录结构的划分、编码规范化、接口规范化、文档规范化、Git 分支管理&…

【Web前端】CSS-盒子模型

文章目录一、盒子模型1、网页布局的本质2、盒子模型&#xff08;Box Model&#xff09;组成3、边框&#xff08;border&#xff09;3.1、边框的使用3.2、表格的细线边框3.3、边框会影响盒子实际大小4、内边距&#xff08;padding&#xff09;4.1、内边距的使用方式4.2、内边距会…

CSS响应式布局(自适应布局)

CSS 响应式布局也称自适应布局&#xff0c;是 Ethan Marcotte 在 2010 年 5 月份提出的一个概念&#xff0c;简单来讲就是一个网站能够兼容多个不同的终端&#xff08;设备&#xff09;&#xff0c;而不是为每个终端做一个特定的版本。这个概念是为解决移动端浏览网页而诞生的。…

一文弄懂Vue与Servlet的交互:让你的大学课设变得容易起来

文章目录1 写作动机2 准备工作3 前端请求3.1 get请求3.1.1 仿照网站栏撰写3.1.2 按照Parms格式传参3.2 Post请求3.2.1 按照Data格式传参3.2.2 按照Params格式传参3.3 一个特殊的点4 后端接收请求4.1 提要4.2 代码4.2.1 架子4.2.2 模块一&#xff1a;获取参数4.2.3 模块二&#…

【微信小程序】选择器组件picker

文章目录【微信小程序】选择器组件pickerpicker组件的定义picker组件的类型picker属性共同的属性时间选择器time参考【微信小程序】选择器组件picker picker组件的定义 picker组件是一种从底部向上弹起的滚动选择器。 picker组件的类型 在官方文档中&#xff0c;有提供五种…

【uni-app系列】uni-app之nvue使用

目录一、介绍二、新建 nvue 页面三、开发四、nvue 开发与 vue 开发的常见区别一、介绍 uni-app App 端内置了一个基于 weex 改进的原生渲染引擎&#xff0c;提供了原生渲染能力。 在 App 端&#xff0c;如果使用 vue 页面&#xff0c;则使用 webview 渲染&#xff1b;如果使用…

无界(wujie)微前端实现及三种通信方式介绍

一、对比 之前介绍过前段时间比较流行的微前端框架qiankun&#xff0c;虽然实现了微前端的理念&#xff0c;但是也暴露出很多缺点&#xff0c;比如官网上讲到的四点&#xff1a; 基于路由匹配&#xff0c;无法同时激活多个子应用&#xff0c;也不支持子应用保活改造成本较大&…

echarts:饼图标签formatter的使用/饼图自定义标签

需求描述 需要实现一个“五彩斑斓”的饼图&#xff1a;每块饼上的标签颜色与这块饼的颜色一致。 实现思路 要改变饼图标签的颜色&#xff0c;需要参考echarts饼图label配置项&#xff0c;以及这个很棒的官方示例&#xff1a;饼图引导线调整。从这个示例中可以了解到自定义标…

【Vue路由守卫】

Vue路由守卫Vue路由守卫全局路由守卫全局前置守卫全局后置守卫实例代码&#xff1a;独享守卫组件内守卫总结Vue路由守卫 路由守卫&#xff0c;简单理解来说就是&#xff0c;当用户要进行一些操作时&#xff0c;我需要用户的一些信息或数据或行为&#xff0c;我判断过后&#x…