周大胖子 发表于 2022-7-1 11:28:59

React react-router-dom V6 的基本使用




import React from "react";
import { BrowserRouter, HashRouter,useNavigate, Link, Route, Router, Routes, NavLink,Outlet } from "react-router-dom";
import TemJs from './temJs';
import Animationc from './animationc';
import './anmiationc.css';
import TFrom from "./tFrom";
import CssModelTest from "./cssModelTest";
import UseNav from "./useNav";
// 1.安装 npm install --save react-router-dom   注意
// 2.引入 import { BrowserRouter, HashRouter , Link ,Route } from "react-router-dom";
//   BrowserRouter, HashRouter为包裹元素,指定监听模式
//      BrowserRouter为 history 模式;   H5 新特性 如果不兼容低版本 建议使用
//      HashRouter为hash 模式的 url 访问;兼容低版本的时候使用
// 3.Link 控制url 跳转
// 4.Route 里面的path 用于匹配url ,   element为显示的组件 [这里有个问题 component是老版本的 里面的显示不一样]
// 5.V6版的react-router-dom 需要包裹一个Routes

// 7.理解网页应用的路由 使用 react-router-dom ;   安卓应用的路由使用 react-router-native
// 8. exact 表示精准匹配


// 在V6 版本中activeClassName 和activeStyle 已经从NavLinkProps中移除,可以直接在<NavLink>的className和style中使用一个函数来使用active。
{/*         <NavLink className={({ isActive }) =>
                        isActive ? "active-menu" : undefined
                  } to={'/temjs'}>模板</NavLink>*/}

// 9. NavLink 和 Link 本体使用差别不大   ,不过 NavLink可以加 className 会自动和 NavLink里的 to 想匹配

// 10 如果没有给Route 指定 path他就和所有路由都匹配   <Routeelement={<TemJs />} exact />

// 11 Switch 是V5 版本的,作用是 如果匹配到一个 就不在继续朝下匹配[联想10 ], V6版本后 Switch废弃, <Switch>重命名为<Routes>。


// 12. Redirect 资源重定向   V 6 废弃 直接在需要跳转的页面 写 <Navigate to="/login" /> 外层不需要嵌套

// 13. 嵌套路由【 被引入的子路由,再别的地方引入会报错,因为 子路由显示位置 外层包裹的 Router 问题】

// 14. 手动跳转 路由

//    V5 已经废弃 [下面都是]
//    分为两种: hash 模式 和正常模式如果是hash模式 只需要JS 设置hash值即可window.location.hash ='/discover/playLis
//    如果一个组件是通过【路由组件创建】出来的,那么系统会自动传递一个hash值给我们,只需要拿这个history对象 ,调用这个对象的push 方法修改资源地址就可以 this.props.history.push('/login/new');               
//    类似APP等组件不是通过路由创建的,如果要使用 history对象,需要搭配withRouter ; 写法 export default withRouter(APP);    已经废弃
//    上一条需要找个组件外面包裹 BrowserRouter类组件,用到地方都包 所以-我个人觉得方法很多种 这个真麻烦 已经废弃



//   v6在JS种使用 useNavigate进行跳转 [但是仅限于 function 类 , class类不能用] 已经单独记录 ,qing'fan


//17使用 react-router-config 可以对路由实现统一管理

   
class NewRouter extends React.Component {
    constructor() {
      super();
      this.state = {
            num: 123,
            aColor: '#a20ddf'
      }
    }

    render() {
      return (
            <section>
                <BrowserRouter>
                  {/* <Linkactiveclassname='active-menu' to={'/animationc'} >动画</Link>
                  <Link activeclassname='active-menu' to={'/temjs'}>模板</Link>   */}
                  <NavLinkclassName={({ isActive }) =>
                        isActive ? "active-menu" : undefined
                  }to={'/animationc'} >动画</NavLink>
                  {/* <NavLink activeclassname="active-menu" to={'/temjs'}>模板</NavLink>    这种写法已经没了 */}
                  <NavLink className={({ isActive }) =>
                        isActive ? "active-menu" : undefined
                  } to={'/temjs'}>模板</NavLink>
                     {/* <NavLink className={({ isActive }) =>
                        isActive ? "active-menu" : undefined
                  } to={'/tform'}>新闻</NavLink>   */}
                  {/* <NavLink className={({ isActive }) =>
                        isActive ? "active-menu" : undefined
                  } to={'/login'}>登录</NavLink>*/}
                  {/* <NavLink className={({ isActive }) =>
                        isActive ? "active-menu" : undefined
                  } to={{
                        pathname:'/login',
                        state:{
                            name:'2222'
                        }
                  }}>登录</NavLink>*/}
                  <NavLink className={({ isActive }) =>
                        isActive ? "active-menu" : undefined
                  } to={'/login'}state={{ id: 999, name: "i love merlin" }} >登录</NavLink>

                  <Routes >
                        <Route path={'/animationc'} element={<Animationc />}   />
                        <Route path={'/temjs'} element={<TemJs />}/>
                        {/* <Route path={'/tform'} element={<TFrom />} />*/}
                        <Route path={'/login/*'} element={<CssModelTest />}/>
                        {/* <Route component={Other} /> */}
                  </Routes>
                  
                </BrowserRouter>
               
                <button onClick={()=>{ this.go() }}> 点击跳转链接 </button>
               
                  <UseNav></UseNav>


            </section >
      );
    }
    go(){
      
      // const navigate = useNavigate();
      // this.props.history.push('/login/new');
      // useNavigate('/login/new');
      // navigate('/login/new');
      window.location= '/login/new';
    }


}



export default NewRouter;



页: [1]
查看完整版本: React react-router-dom V6 的基本使用