React Router路由总结

一、路由安装

# npm 安装
npm install react-router-dom
# yarn 安装
yarn add react-router-dom
# pnpm 安装
pnpm add react-router-dom

二、组件创建的路由

写法一:

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

// 使用组件包裹
<BrowserRouter>
    <Routes>
       <Route path='/' element={<App />}></Route>

       <Route path='/demo' element={<React />}></Route>

    </Routes>

</BrowserRouter>
写法二:可以使用Hook简写
function Router(){
  return useRoutes([
      {
        path: "/",
        element: <App />,
      },
      {
        path: "/demo",
        element: <React />,
      }
  ]);
}
export default Router;

// 在main.tsx中加载
import Router from './router'
<BrowserRouter>
   <Router />
</BrowserRouter>

三、通过API创建路由

import { createBrowserRouter, RouterProvider} from "react-router-dom";

// 创建路由
const router = createBrowserRouter([
  {
    path: "/",
    element: <App />,
  },
  {
    path: "/demo",
    element: <React />,
  }]);

// 传递给RouterProvider
<RouterProvider router={router} />

四、动态路由

{
    path: '/order/:orderId',
    element: <Order/>
}


{
    path: '/goods/:goodsId/order/:orderId',
    element: <Order/>
}

function Order(){
    const params = useParams();
    return <div>
        <h2>商品组件</h2>

        <p>
            <span>商品ID:{params.goodsId}</span>

            <span>订单ID:{params.orderId}</span>

        </p>

    </div>

}

五、嵌套路由

{
  path: '/goods',
  element: <Goods />,
  children: [
    {
      path: 'list',
      element: (
        <div>
          <p>商品一</p>

          <p>商品二</p>

        </div>

      )
    }
  ]
}

// 组件定义
function Goods() {
  return (
    <div>
      <h2>商品主页</h2>

      <Outlet />
    </div>

  )
}

六、Data API

只有API创建的路由才有,组件创建的路由没有Data API

Loader拦截

{
      path: '/order/:id',
      element: <Order />,
      loader: orderLoader
}


function orderLoader({ params }: any) {
  return params.id;
}

Action提交

// 路由定义,定义action
{
    path: '/login',
    element: <Login />,
    action: loginAction
}


// 表单组件定义,提交以后,会触发action
function Login() {
  const errors: any = useActionData()
  return (
    <Form method='post'>
      <p>
        <input type='text' name='email' />
        {errors?.email && <span>{errors.email}</span>}
      </p>

      <p>
        <input type='text' name='password' />
        {errors?.password && <span>{errors.password}</span>}
      </p>

      <p>
        <button type='submit'>登录</button>

      </p>

    </Form>

  )
}


async function loginAction({ request }: any) {
  const formData = await request.formData()
  const email = formData.get('email')
  const password = formData.get('password')
  // TODO
  console.log('创建用户成功')
  return redirect('/')
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值