React18的边学边记

搭建项目

路由

路由有两种模式:对象模式和组件模式。

对象模式的配置

typescript 复制代码
// main.tsx

import { StrictMode } from 'react';
import { BrowserRouter } from 'react-router-dom';
import { createRoot } from 'react-dom/client';
import 'reset-css/reset.css'  //样式初始化

import "@/assets/styles/global.scss" // 全局样式

import App from './App.tsx'

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </StrictMode>,
)
typescript 复制代码
// router.tsx

import React from "react";
import { Navigate } from "react-router-dom";

import Comp1 from '@/components/Comp1/index'
import Comp2 from '@/components/Comp2/index'

const baseRouter: any = [
  { path: "/", element: <Navigate replace to="/comp1" /> },
  { path: "/comp1", element: <Comp1></Comp1> },
  { path: "/comp2", element: <Comp2></Comp2> },
]
export default baseRouter
typescript 复制代码
// app.tsx

import { useState } from 'react'
import { Button } from 'antd';
import { useRoutes,Link } from "react-router-dom";
import router from '@/router/index'

function App() {
const outlet = useRoutes(router)
  return (
    <div className='app'>
      <Link to='/comp1'><Button type="link">Link comp1</Button></Link>
      <Link to='/comp2'><Button type="link">Link comp2</Button></Link>
      { outlet }
    </div>
  )
}

export default App

组件模式的配置

typescript 复制代码
// main.tsx

import { StrictMode } from 'react';
import { BrowserRouter } from "react-router-dom";
import { createRoot } from 'react-dom/client';
import 'reset-css/reset.css'  //样式初始化

import "@/assets/styles/global.scss" // 全局样式

import { AppRoutes } from "@/router/index.tsx"

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <BrowserRouter>
      <AppRoutes />
    </BrowserRouter>
  </StrictMode>,
)
typescript 复制代码
// router.tsx
import React from "react";
import { Routes, Route } from "react-router-dom";

import App from '@/App';
import Comp1 from '@/components/Comp1/index'
import Comp2 from '@/components/Comp2/index'

export function AppRoutes() {
  return (
    <Routes>
      <Route path="/" element={<App />}>
        <Route path="comp1" element={<Comp1 />} />
        <Route path="comp2" element={<Comp2 />} />
      </Route>
    </Routes>
  );
}
typescript 复制代码
// app.tsx

import { useState } from 'react'
import { Button } from 'antd';
import { useRoutes,Link } from "react-router-dom";
import router from '@/router/index'

function App() {
const outlet = useRoutes(router)
  return (
    <div className='app'>
      <Link to='/comp1'><Button type="link">Link comp1</Button></Link>
      <Link to='/comp2'><Button type="link">Link comp2</Button></Link>
      { outlet }
    </div>
  )
}

export default App

抽取React Router的loading组件

typescript 复制代码
import React, { lazy } from "react";  // 导入lazy函数
import { Navigate } from "react-router-dom";

const Comp1 = lazy(() => import('@/components/Comp1/index'))
const Comp2 = lazy(() => import('@/components/Comp2/index'))


// 封装loading的函数
const withLoading = (component: any) => {
  return( <React.Suspense fallback={<div>Loading...</div>}>{component}</React.Suspense>)
}

// 在路由中使用懒加载loading函数
const baseRouter: any = [
  { path: "/", element: <Navigate replace to="/comp1" /> },
  { path: "/comp1", element: withLoading(<Comp1></Comp1>) },
  { path: "/comp2", element: withLoading(<Comp2></Comp2>) },
]

export default baseRouter

编程式导航

实现的思路:首先需要在router中设置嵌套路由表,然后在主页面,通过useNavigate函数重定向路由,并且在内容区域设置outlet组件用于显示内容。

typescript 复制代码
// router.tsx
const baseRouter: any = [
  { path: "/", element: <Navigate to="/comp1" /> }, // 空路由时重定向到第一个内容模块
  { path: "/", 
    element: <Home/>,
    children: [
      { path: "/comp1", element: withLoading(<Comp1></Comp1>) },
      { path: "/comp2", element: withLoading(<Comp2></Comp2>) }
    ]
  }
]
typescript 复制代码
// home.tsx

import { useNavigate, Outlet } from 'react-router-dom'; // 导入useNavigate用于重定向路由,outlet设置路由出口

 const navigate = useNavigate(); // 定义跳转的方法
 const menuClick = (e: any) => {
   navigate(e.key); // 重定向路由
 }

组件传值

入门级(修改变量)

实现的思路:首先通过useState创建一个变量以及修改变量的set函数,赋值修改时直接调用set函数。

typescript 复制代码
const [openMenuKeys, setOpenMenuKeys] = useState<string[]>([]); // 创建变量和修改变量的函数

 // 重新赋值,只保留数组最后一项
 setOpenMenuKeys([openKeys.length > 0 ? openKeys[openKeys.length - 1] : '']);
相关推荐
szp2005几秒前
为了在浏览器里跑多线程 ONNX 推理,我把自己的支付浮层弄挂了
前端·webassembly
kisshyshy10 分钟前
从 useRef 到 Web Worker:理解 React 可变对象与浏览器多线程
前端·javascript·react.js
fatcoder12 分钟前
玩转Nginx 04 — 反向代理:给 nginx 接上后端
前端·后端·nginx
Data_Journal1 小时前
什么是 CAPTCHA,它是如何工作的?
java·大数据·服务器·前端·数据库
产品设计大观1 小时前
实测墨刀AI生成光伏储能管理后台,快速交付高保真界面和React源码
人工智能·react.js·墨刀
计算机魔术师1 小时前
我看了这个更新,把原来的检索方案推翻了
前端
zhanghaha13142 小时前
HTML系列教程:3_HTML 基础标签 — 标题、段落、超链接、图像
前端·html
李高钢2 小时前
C# WPF Prism 进阶(二):区域(Region)与模块化(Module)
java·前端·数据库
xyphf_和派孔明2 小时前
Vite 与 Webpack 对比及常见面试题
前端·webpack·vite
明月_清风2 小时前
Pi Agent 深度解析:开源极简终端 AI 编码代理的终极指南
前端·后端·ai编程