react实战(二)

138 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

今天实战的内容是配置React脚手架的路由,用到了react的react-router-dom

使用的版本为:

image.png

react-router-dom v5到v6有了不小的改动: 1、v5的到了v6变为 2、的新特性变更。 3、路由跳转由原本的useHistroy()变为了useNavigate() 4、能更好的使用嵌套路由 5、新增了useRoutes代替了react-router-config

在v5版本中使用Switch配置路由:

<Switch>
    <Route exact path="/"><A/><Route>     
</Switch>

在v6版本使用Routes配置路由

<Routes>
    <Route path="/" element={<A/>} />
</Routes>

tips:Route中v5版本的component/render被v6中的element取代

v5中嵌套路由需要明确定义,且要求组件中包含许多字符串匹配逻辑。需要使用到useRouteMatch()

v6则完全不需要这些操作,并且可以直接在路由里定义,然后使用Outlet这个新API,它就类似于是vue-router中的router-view

React的路由跳转 v5使用的是useHistory

import { useHistory } from 'react-router-dom'
function pussRouter(){
    const history = useHistory()
    function handlePush(){
        history.push('/usehistory');
    }
    return <div onClick={handlePush}>跳转路由</div>
}

v6使用了useNavigate将useHistroy取代了

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

function pushRouter(){
    const navigate = useNavigate();
    function handlePush(){
        navigate('/useNavigate')
    }
    return <div onClick={handlePush}>跳转路由</div>
    }

}

useHistory的方法也被navigate替代

history.push('/histroy')
history.replace('/history')

navigate('/navigate')
navigate('/navigate',{replace:true});

新勾子函数useRoutes替代了react-router-config

function Test(){
    let element = useRoutes(
        [{ path:'/',element:<A/>},
        {
           path: 'parent',
           element: <Parent />,
           children: [
            { path: '/child',element:<Child />}
           ]
        },
        {
         //重定向
         {path: 'redirect',redirectTo:'/'},
         //404页面
         {path: '*',element:<pageNotFound />}
        }
        ]
    )
}

实战 1、创建React脚手架 2、安装react-router-dom v6版本 3、在src中创建router文件夹,然后在router文件夹下创建index.js文件

image.png

写入以下代码:

import { lazy } from 'react';
const router = [
    {
        path: '/index',
        component: lazy(() => import('../components/Index/index')),
    },
    {
        path: '/consult',
        component: lazy(() => import('../components/Consult/consult')),
    },
    {
        path: '/404',
        component: lazy(() => import('../components/404/pageNotFound')),
    }
]
export default router

tips: 这样用到了路由懒加载 接着到App.js这个主文件中,写入以下代码:

import TabBar from './components/tarBar/tabBar';
import { Route, Routes,Navigate } from 'react-router-dom';
import './App.scss';
import React,{ Suspense } from 'react';
import router from './router/index';
const tabName = [
    {
     name:'首页',
     value: 'index'
    },
    {
     name:'咨询浏览',
     value: 'consult'
    },
    {
     name:'协会',
     value:''
    },
    {
     name:'课程安排',
     value:''
    },
    {
    name:'资料查询',
    value:''
    },
    {
    name:'联系我们',
    value:''
}]
function App() {
  return (
    <div className="App">
     <div className='content'>
     <TabBar tabName={tabName}></TabBar>
        <Routes>
          {
            router.map((item, i) => {
              return (
                <Route key={i} path={item.path} element={
                  <Suspense fallback={
                    <div>路由懒加载</div>
                  }>
                    < item.component />
                  </Suspense>
                } />
              )
            })
          }
          <Route path="/404" element={<div>Page Not Found</div>}></Route>
          <Route path="*" element={<Navigate replace to="/404"></Navigate>}></Route>
        </Routes>
        </div>
    </div>
  );
}
export default App;

最后在主入口文件index.js中

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import { BrowserRouter } from 'react-router-dom';
import App from './App';
import reportWebVitals from './reportWebVitals';
import "antd/dist/antd.css";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <BrowserRouter>
    <App />
    </BrowserRouter>
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

以上路由配置完成。 效果如下:

image.png

image.png