Bootstrap

react-router-dom使用指南(最新V6.0.1) 详解!!!

1:NavLink-Link

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

export default function App(){

return ( 
          <NavLink to={'/home'}>home</NavLink>
          <NavLink to={'/about'}>about</NavLink>
          <Link to={'/link'}>link</Link>
)
}

2:Routes_Route

          <NavLink to={'/home'}>home</NavLink>
          <NavLink to={'/about'}>about</NavLink>


        <Routes>
          <Route path='/home' element={<Home />}></Route>
          <Route path='/about' element={<About />}></Route>
        </Routes>

3:路由高亮

import React from 'react'
import { NavLink,Route,Routes } from 'react-router-dom'
import About from './About'
import Home from './Home'
export default function App() {
  const activeLink = (prop) =>{
    // 函数。在绑定的NavLink组件渲染时候执行
    console.log('style run');
    console.log(prop);
    // isActive: false/true  true 表示当前 NavLink 被激活。
    let isActive = prop.isActive;
    let obj = {};
    if(isActive){
      obj = {
        color:'red',
        fontWeight:900,
        background:'orange'
      }
    }else {
      obj = {
        color:'black',
        fontWeight:300,
        background:'#fff'

      }
    }
    // 返回:虚拟样式对象。作用:设置路由高亮显示的 
    return (obj)
  }
  return (
    <div>
      <ul>
        <li>
             {/* 
          style 作用:设置路由高亮样式
          赋值:定义函数
             函数在NavLink渲染时候执行
                函数执行传实参,为对象,isActive isPending
                 isActive 表示路由是否被激活,true 激活,false 没激活
          返回值:虚拟样式对象       
          有多个style 执行多次
          
          */}
          <NavLink style={activeLink} to={'/home'}>home</NavLink>
        </li>
        <li>
          <NavLink style={activeLink} to={'/about'}>about</NavLink>
        </li>
      </ul>
      <div>
        <Routes>
          <Route path='/home' element={<Home />}></Route>
          <Route path='/about' element={<About />}></Route>
        </Routes>
      </div>
    </div>
  )
}

4:编程时导航

import React from 'react'
// useNavigate 新增的hook函数
import { useNavigate } from 'react-router-dom' 
export default function Home() {
  // useNavigate 返回函数
  let Navigate = useNavigate()
  const linkAbout = ()=>{
    setTimeout(() => {
      Navigate('/about')
    }, 2000);
  }
  return (
    <div>
      {/* 
      Navigate() 
      参数:链接地址
      作用:跳转链接
      */}
      <button onClick={linkAbout}>点击跳转about</button>

      <button onClick={()=>{}}>标签方式跳转</button>
    </div>
  )
}

5:params传参

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

export default function About() {
  // useParams() 作用:获取params参数,返回,参数独享
  let params = useParams();
  console.log(params);
  return (
    <div>About
      <h1>接受params参数{params.id} </h1>
    </div>
  )
}

6:search参数

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

export default function About() {
  // search参数
  // useSearchParams()作用:获取search参数,返回值:数组
  // 0: 参数对象, .get(key) 获取具体参数
  // 1: setSearch() 更改search 参数
  let [search,setSearch] = useSearchParams()
  console.log(search.get('id')); // 获取id,如果还有其他参数执行 get方法多次
  console.log(setSearch);

  const onSetSearch = function(){
    // setSearch(options)
    // 参数: search参数对象
    setSearch({
      id:5
    })
  }
  return (
    <div>About
      <h1>接受search参数 {search.get('id')} </h1>
      <button onClick={()=>{onSetSearch()}}>使用setSearch</button>

    </div>
  )
}

7:嵌套路由

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

export default function About() {
  /**
   * useLocation() 作用:获取包装后的location对象 
   *   hash     
   *   pathname 路由地址
   *   state    state参数
   *   search   search 参数
   * 
   */
  let location = useLocation();
  console.log(location); 
  // 获取state 参数
  let id = location.state.id;
   let [_id,setid]  = useState(id)
   console.log(_id);
  const changeState = function(){
    // 为了修改state参数赋值.
    location.state.id = 7;
    // 处理页面展示
    setid(7)
  }
  return (
    <div>About
      {/* <h1>接受params参数{params.id} </h1> */}
      <h1>接受state参数 {_id} </h1>
      <button onClick={()=>{changeState()}}>更改state参数</button>
    </div>
  )
}


//7_src_嵌套路由

8:outlet嵌套路由

import React from 'react'
import { NavLink,Outlet } from 'react-router-dom'
export default function Home() {
  return (
    <div>
     <ul>
        <li>
          <NavLink  to={'/home/list'}>list</NavLink>
        </li>
        <li>
          <NavLink  to={'/home/item'}  >item</NavLink>

        </li>
      </ul>

      <div>
        {/* 注册路由 */}
        {/* 
        作用: 展示注册的子路由组件
        */}
        <Outlet />
      </div>
    </div>
  )
}

9:路由配置_嵌套路由

import { useRoutes } from 'react-router-dom';
import About from './About'
import Home from './Home'
import List from './list'
import Item from './item'

export default function Router(){
    const routes = [
        {
            path:'/home',
            element: (<Home />),
            // 实现嵌套路由。
            children: [
                {
                    path:'list',// /home.list
                    element:(<List />)
                },{
                    path:'/home/item',
                    element: (<Item />)
                }
            ]
        },{
            path:'/About',
            element:(<About />),
        }
    ]
    // useRoutes() 作用 相当于 Routes组件.
    // 参数;元组,
    //      数组元素路由配置对象.
    //    path      设置匹配路由组件的地址
    //    element   注册路由组件
    //    children  嵌套路由
    //    .....
    // 返回值:注册略有的虚拟dom
    return useRoutes(routes)
}

 10:重定向

import { useRoutes,Navigate } from 'react-router-dom';
import About from './About'
import Home from './Home'
import List from './list'
import Item from './item'
import NotFount from './404'

// 注意:路由匹配规则,精准匹配,
function Router(){
    const routes = [
        {
            path:'/home',
            element: (<Home />),
            // 实现嵌套路由。
            children: [
                {
                    path:'list',// /home.list
                    element:(<List />)
                },{
                    path:'/home/item',
                    element: (<Item />)
                }
            ]
        },{
            path:'/About',
            element:(<About />),
        },{
           path:'/', 
        // Navigate 实现重定向
           element:(<Navigate to="/home"/>)
        },{// 处理404
            path:"*", // 匹配所有路径,优先级最低
            // 路由渲染的优先级。
            element: (<NotFount />)
        }
    ]
    // useRoutes() 作用 相当于 Routes组件.
    // 参数;元组,
    //      数组元素路由配置对象.
    //    path      设置匹配路由组件的地址
    //    element   注册路由组件
    //    children  嵌套路由
    //    .....
    // 返回值:注册略有的虚拟dom
    return useRoutes(routes)
}

export default Router

// 路由权限验证

// 基于身份动态渲染NavLink,

/**

 * admin:

 * 用户管理

 * 商品管理

 * 购物车管理

 *

 * 其他用户:

 *   购购物车管理

 *

 * 从到1搭建后台管理系统

 */

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;