首页 > 其他分享 >react-router6笔记

react-router6笔记

时间:2022-12-11 00:44:05浏览次数:38  
标签:const dom router6 笔记 react import router 路由

1、概述

  1. React Router以三个不同的包发布到npm上,它们分别为:

    • react-router 路由的核心库,提供了很多的:组件、钩子
    • react-router-dom 包含react-router所以内容,并添加一些专门用于DOM的组件,例如、<BrowserRouter>等
    • react-router-native 包括react-router所以内容,并添加一些专门用于ReactNative的API,例如:<NativeRouter>等
  2. 与React Router 5.x 版本相比,改变了什么?

    • 内置组件的变化:移除<Switch/>,新增<Routes>等。

    • 语法的变化:component={About} 变为 element={<About/>}等。

    • 新增多个hook:useParams、useNavigate、useMatch等。

    • 官方明确推荐函数式组件了!!

      ...

2、一级路由

输入rcc或者rfc自动生成代码的vscode插件:ES7+ React/Redux/React-Native snippets

class变成className

import React from 'react'
import ReactDOM from 'react-dom'
import {BrowserRouter} from 'react-router-dom'
import App from './App'

ReactDOM.render(
	<BrowserRouter>
        <App></App>
    </BrowserRouter>,
    document.getElementById('root')
)

在路由链接的地方

import {NavLink,Routes,Route} from 'react-router-dom'
import About from './pages/About'
import Home from './pages/Home'

export default function App(){
    return (
        // 路由链接
 		<NavLink to="/about">About</NavLink>   
        <NavLink to="/home">Home</NavLink>   
        // 注册路由
        <Routes>
        	<Route path='/about' element={<About/>}></Route>
            <Route path='/home' element={<Home/>}></Route>
        </Routes>
    )
}

原来switch的左右就是防止,匹配成功后向下接着匹配

3、重定向

Navigate这个组件只要渲染一定会引起试图的切换

Routes替代了switch

  • v6版本中移出了先前的<Switch>,引入了新的替代者<Routes>
  • <Routes>和<Route>要配合使用,且必须要用<Routes>包裹<Route>
  • <Route>相当于一个if语句,如果其路径与当前URL匹配,则呈现其对应的组件
  • <Route caseSensitive>属性用于指定:匹配时是否区分大小写(默认为false)
  • 当URL发生变化时,<Routes>都会查看其所有子<Route>元素以找到最佳匹配并呈现组件
  • <Route>也可以嵌套使用,且可配合useRoutes()匹配“路由表”,但需要通过<Outlet>组件来渲染其子路由

4、NavLink高亮

router6里面,如果想实现自定义的类型,则需要把className写成一个函数

<NavLink className={({isAvtive})=>isActive ? 'list-item hightlight' : 'list-item'} to='/about'></NavLink>

//或者分开写
function computedClassName({isActive}){
    return isActive ? 'list-item hightlight' : 'list-item'
}
<NavLink className={computedClassName} to="/about">About</NavLink>

5、useRoutes路由表

import {useRoutes} from 'react-router-dom'
// 可以把里面的内容单独放一个文件中 
export default function App(){
    const element = useRoutes([
        {
            path:'/about',
            element:<About/>
        },
        {
            path:'/home',
            element:<Home/>
        },
        {
            path:'/',
            element:<Navigate to="/about"/>
        },
    ])
    // 注册路由的地方
    {element}
}

6、嵌套路由

outlet有点像vue里的router-view

// 指定路由组件呈现的位置
<Outlet/>

7、路由的params参数

传递参数

return (
	<div>
    	<ul>
        	{
                messages.map((m)=>{
                    return (
                    	// 路由链接
                        <li key={m.id}>
                            <Link to={`detail/${m.id}/${m.title}/${m.content}`}>{m.title}</Link>
                        </li>
                    )
                })
            }
        </ul>
    </div>
)

而且要在对应集中管理的路由文件中,类似vue-router里面写上对应参数的占位符

读取参数使用useParams,或者useMatch

import {useParams,useMatch} from 'react-router-dom'

export default function Detail(){
    const {id,title,content} = useParams()
    const x = useMatch('/home/message/detail/:id/:title/:content')
}

8、路由的search参数

search参数有点类似于vue里的query参数,不需要去集中的地方填写占位符

<Link to={`detail?id=${m.id}$title=${m.title}&content=${m.content}`}></Link>

获取参数用到useSearchParams,也可以用useLocation

import {useSearchParams,useLocation} 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')
    const x = useLocation()
}

9、路由的state参数

search参数和state参数都不需要占位

<Link
    to='detail'
    state={{
        id:m.id,
        title:m.title,
        content:m.content
    }}
    >{m.title}</Link>

获取参数使用useLocation

import {useLocation} from 'react-router-dom'
export default function Detail(){
    const {state} = useLocation()
    const {state:{id,title,content}} = useLocation()
}

10、编程式路由导航

react-router5里面有Link和NavLink,6里面有Link、NavLink、Navigate

import {useNavigate} from 'react-router-dom'
export default function Message(){
    const navigate = useNavigate()
    function showDetail(){
        navigate('/about',{   // 第二个里面可以传参数
            replace:true,
            state:{
                id:m.id,
                title:m.title
            }
        })
        // navigate(-1)  // 后退
        // navigate(1)  // 前进
    }
    ...
    // 给某些按钮添加点击事件showDetail
}

11、useInRouterContext

只要被<BrowserRouter></BrowserRouter>包裹,则为真

import {useInRouterContext} from 'react-router-dom'
//...
console.log(useInRouterContext())

12、useNavigationType

  1. 作用:返回当前的类型导航(用户是如何来到当前页面的)
  2. 返回值:POP、PUSH、REPLACE
  3. 备注:POP是指在浏览器中直接打开了这个路由组件(刷新页面)
import {useNavigationType} from 'react-router-dom'
//...
console.log(useNavigationType())  // 判断一下是怎么来的

13、useOutlet

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

  2. 示例

    import {useOutlet} from 'react-router-dom'
    const result = useOutlet()
    console.log(result)
    // 如果嵌套路由没有挂载,则result为null
    // 如果嵌套路由已经挂载,则展示嵌套的路由对象
    

14、useResolvedPath

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

import {useResolvedPath} from 'react-router-dom'
...
console.log(useResolvedPath('/user?id=001&name=tom#qwe'))

标签:const,dom,router6,笔记,react,import,router,路由
From: https://www.cnblogs.com/oaoa/p/16972721.html

相关文章

  • 详解逻辑回归与评分卡-梯度下降求解逻辑回归【菜菜的sklearn课堂笔记】
    视频作者:菜菜TsaiTsai链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili我们以最著名也最常用的梯度下降法为例。现在有一个带两个特征并......
  • 树链剖分学习笔记
    树链剖分学习笔记简介树链剖分是一种可以把树丢到线段树上维护的一种算法,时间复杂度为\(O(n\log^2n)\)。思路一、一些概念1.重儿子:如果一个点有儿子,那么所有儿子中......
  • 《深入理解计算机系统》第二章学习笔记
    补码编码是表示有符号整数的最常见的方式,有符号整数就是可以为正或者为负的数字。计算机的表示法是用有限数量的位来对一个数字编码,因此,当结果太大以至不能表示时,某些运算......
  • 微波炉变压器点焊机笔记
    为了将锂电池堆叠成锂电池组,不免需要点焊。而近期笔者一台微波炉“退休”了,刚好看到网上流传用微波炉变压器改造成点焊机的文章。动手将就地组装一台。现记录下制作心得备忘......
  • delphi D11编程语言手册 学习笔记(P393-419) 对象与内存
      这本书可以在Delphi研习社②群256456744的群文件里找到.书名:Delphi11AlexandriaEdition.pdf 这些年来,Delphi行动装置编译器提供了一个不同的内存模式,称......
  • python 笔记
    1、Myfirstprocedure。#我的第一个程序。print('Helloworld!')#print:打印到屏幕。(‘打印到屏幕的内容’)print('Ilikeyou!')#例一执行程序,输出如下:......
  • 后端程序员必会的前端知识-05:React
    五.React1.React基础react是前端三大框架之一没有vue的基础更好,因为两者思想不太一样,不能用vue的习惯学习react需要有js基础,视频19-58需要有ts基础,视......
  • Vue2(笔记31) - 脚手架 - scoped
    scoped样式的作用域,每个组件都有独立的样式,最终都会打包合并,难免会重名导致页面样式混乱,可以给每个组件的样式加上scoped 限定样式的作用域只限于当前组件;改下school.vue......
  • Entity Framework Core 笔记 - 入门
    先决条件请确保安装了.NETCore第6或7版本,我这安装的是7.   一.领域建模方式1.CodeFirstPOCO:PlainOldCLRObject。内在含义是指那些没有从任何类继承......
  • Vue学习笔记2--类样式绑定和内置指令v-xxx
    Class和Style绑定class绑定放置对象(常用):class="{类名:布尔}"<!--第一种放置字符串--><pclass="active">hello</p><!--第二种放置对象--><!--......