React路由组件的使用以及常用的Hook(6版本)

本文介绍了React Router v6中路由组件的变化,包括新引入的Routes, Navigate以及弃用的Switch和Redirect。重点讨论了常用的Hook——State, Effect, Ref在函数组件中的应用。此外,还详细讲解了如何使用NavLink实现高亮,通过useRoutes进行路由表配置,以及如何利用Outlet管理多级路由。同时,文章提到了三种传递参数的方法:params, search和state。" 112113037,10540082,SQL技巧:日期运算与统计分析,"['数据库', 'SQL', '日期处理']

一,React路由组件的使用以及常用的Hook(6版本)

npm i react-router-dom (这个命令下载都是最新版本)

其中BrowserRouter和HashRouter和5版本一样,这里就不再多说了

由于新版本推荐使用函数式组件,所以要用到hooks函数

1.首先先简单说一下hooks的简单使用

常用的三个Hook

(1).State Hook :React.useState()

(2).Effect Hook:React.useEffect()

(3).Ref Hook:React.useRef()

 State Hook

(1).State Hook让函数式组件也可以有state状态,并进行状态数据的读写操作

(2).语法: const [xxx,setXxx]  = React.useState(initValue)

(3).useState() 说明:

        参数:第一次初始化指定的值在内部做缓存

        返回值:包含2个元素的数组,第一个为内部当前状态值,第2个位更新状态值的函数

(4).setXxx()2种写法

        setXxx(newValue):参数为非函数值,直接指定新的状态值,内部覆盖原来的状态值

        setXxx(value => newValue):参数为函数,接收原本的状态值,返回新的状态值:

 Effect Hook

语法:useEffect(()=>{

        //在此可以执行任何带副作用的操作

        return()=>{

        //在这里做一些收尾工作 相当于componentWillUnmount()

        }

},[stateValue])//如果是[]则是componentDidMount() ,否则就是componentDidUpdate()

 Ref Hook

useRef 和 类组件中 React.createRef()作用相同

 2.react-router-dom中的路由变化

 新增Routes,Navigate ,删除了SwitchRedict,,其中Route中的写法改变了,Navigate相当于重定向 

import React from 'react'
import { Link, Route, Routes, Navigate } from 'react-router-dom'

import Home from './pages/Home'
import About from './pages/About'


export default function App() {
    return (
        <div>
            <h3>React路由新</h3>
            <div className=''>
                <Link to="/home">Home</Link>&nbsp;
                <Link to="/about">About</Link>
            </div>
            <Routes>
                <Route path='/home' element={<Home />}></Route>
                <Route path='/about' element={<About />}></Route>
                <Route path='/' element={<Navigate to='/about' />}></Route>
            </Routes>

        </div >
    )
}

 NavLink中实现选中高亮

  <NavLink className={({isActive})=>isActive ? 'list-item active' : 'list-item '} to="/home">Home</NavLink>
  

除了这样常规的写路由,新增了路由表Hook :useRoutes

import React from 'react'
import { NavLink, useRoutes } from 'react-router-dom'

// import routes from './routes'


export default function App() {
    // 根据路由表生成对应的路由
    const element = useRoutes([
        {
            path: '/about',
            element: <About />
        },
        {
            path: '/home',
            element: <Home />
        },
        {
            path: '/',
            element: <Navigate to='/about' />
        }
    ])

    return (
        <div>
            <h3>React路由新</h3>
            <div className=''>
                <NavLink to="/home">Home</NavLink>&nbsp;
                <NavLink to="/about">About</NavLink>
            </div>
            {/* 用这个代替Routes中的内容,方便管理 */}
            {element}

        </div >
    )
}

 也可以讲routes抽离出来,便于管理

import Home from "../pages/Home"
import About from "../pages/About"
import {Navigate} from 'react-router-dom'

export default [
    {
        path: '/about',
        element: <About />
    },
    {
        path: '/home',
        element: <Home />
    },
    {
        path: '/',
        element: <Navigate to='/about' />
    }
]

多级路由可以使用Outlet来管理(相当于vue中router-view)

import React from 'react'
import { NavLink, Outlet } from 'react-router-dom'

export default function Home() {
    // const element = useRoutes(routes)
    return (
        <div>
            <h3>我是Home组件</h3>
            <NavLink to="news" > 新闻</NavLink>&nbsp;
            <NavLink to="message" > 消息</NavLink>
            <Outlet />
        </div>
    )
}

三种传参方式:

        params: useParams

  <Link to={`context/${item.id}/${item.title}/${item.context}`}>{item.title}</Link>

---------------------------------------------------------------------------------------

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

export default function Context() {
    const { id, title, context } = useParams()
    return (
        <div>
            <ul>
                <li>{id}</li>
                <li>{title}</li>
                <li>{context}</li>
            </ul>
        </div>
    )
}

        search:useSearchParams

 <Link to={`context?id=${item.id}&title=${item.title}&context=${item.context}`}>{item.title}</Link>
----------------------------------------------------------


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

export default function Context() {
    const [search, setSearch] = useSearchParams()
    const id = search.get('id')
    const title = search.get('title')
    const context = search.get('context')

    return (
        <div>
            <ul>
                <li><button onClick={() => setSearch('id=008&title=嘿嘿&context=123')}>点我修改</button></li>
                <li>{id}</li>
                <li>{title}</li>
                <li>{context}</li>
            </ul>
        </div>
    )
}

        state:useLoaction

  <Link
       to="context"
       state={{
        id: item.id,
        title: item.title,
        context: item.context
        }}
   >{item.title}</Link>
----------------------------------------------------------

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

export default function Context() {
    const { state: { id, title, context } } = useLocation()
    return (
        <div>
            <ul>
                <li>{id}</li>
                <li>{title}</li>
                <li>{context}</li>
            </ul>
        </div>
    )
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值