react18 企业必备的技能

115 阅读4分钟

就不写多余的了,直接开始吧

组件通信

父传子

子组件只能读取props的数据,并不能直接修改,只能由父组件修改

image.png

image.png

插槽

image.png

子传父

image.png

兄弟组件---状态提升

image.png

useEffect依赖项参数说明

image.png

清除副作用

image.png

reactHooks的使用规则

image.png

Redux

image.png

react使用时的配套工具

image.png

pnpm add react-redux @reduxjs/toolkit

image.png

image.png

image.png

image.png

redux调试---devtools

自行安装浏览器插件Redux DevTools

路由模块

安装react-router-dom 6.17.0

  • createBrowserRouter
  • RouterProvider
import { createBrowserRouter, RouterProvider } from "react-router-dom";
// 创建router实例对象,并且配置路由对应关系
const route = createBrowserRouter([
  {
    path: "/login",
    element: <div>登录</div>,
  },
  {
    path: "/article",
    element: <div>文章</div>,
  },
]);

ReactDOM.createRoot(document.getElementById("root")!).render(
  <React.StrictMode>
    <RouterProvider router={route} />
  </React.StrictMode>
);

路由传参方式

SeachParams传参

// 传参
navigate('/login?id=100&name=linhan')

// 接受参数
const [params] = useSeachParams()
let id = params.get('id')

params传参 需要在路由部分添加占位符匹配 /:id

// 传参
navigate('/login/1001')

// 接受参数
const params = useParams()
let id = params.id

嵌套路由的配置

实现步骤

  • 使用children属性配置路由嵌套关系
  • 使用 <Outlet /> 组件配置二级路由渲染位置

配置

[
  {
    path: "/",
    element: <loyout>,
    children:[
        {
            path: "board",
            element: <Board>,
        },
        {
            path: "about",
            element: <About>,
        }
    ]
  },
  {
    path: "/article",
    element: <div>文章</div>,
  },
]

渲染

export function Layout() {
  return (
    <div>
      <div>我是layout</div>
      <Link to="/about">关于</Link>
      <Link to="/board">面板</Link>
      {/* 二级路由渲染出口 */}
      <Outlet />
    </div>
  );
}

默认二级路由配置

当访问的是一级路由的时候,默认的二级路由组件也可以得到渲染,只需要早二级路由的位置去掉path 设置index属性为true

// 创建router实例对象,并且配置路由对应关系
export const route = createBrowserRouter([
  {
    path: "/",
    element: <Layout />,
    children: [
      // 设置为默认二级路由
      {
        index: true,
        element: <About />,
      },
      {
        path: "/board",
        element: <Board />,
      },
    ],
  },
]);

404路由

当浏览器输入url的路径在整个路由配置中都找不到对应的path,为了用户体验,可以使用404兜底组件进行渲染

实现步骤:

  • 准备一个NotFound组件
  • 在路由表数组的末尾,以* 号作为路由path配置路由
// 创建router实例对象,并且配置路由对应关系
export const route = createBrowserRouter([
  {
    path: "/",
    element: <Layout />,
    children: [
      // 设置为默认二级路由
      {
        index: true,
        element: <About />,
      },
      {
        path: "/board",
        element: <Board />,
      },
    ],
  },
  /* 配置404页面 */
  { path: "*", element: <NotFound /> },
]);

两种路由模式

  • history 模式
  • hash 模式
ReactRouter分别由createBrowerRouter和createHashRouter函数负责创建
路由模式url表现底层原理是否需要后端支持
historyurl/loginhistory对象 + pushState事件需要
hashurl/#/login监听hashChange事件不需要

示例hash模式

// 切换创建路由函数
export const route = createHashRouter([
  {
    path: "/",
    element: <Layout />,
    children: [
      // 设置为默认二级路由
      {
        index: true,
        element: <About />,
      },
      {
        path: "/board",
        element: <Board />,
      },
    ],
  },
  /* 配置404页面 */
  { path: "*", element: <NotFound /> },
]);

配置路径别名

CRA本身把webpack配置包装到了黑盒里无法直接修改,需要借助一个插件 craco

配置步骤:

  • 安装craco
  • 项目根目录创建配置文件 craco.config.js
  • 配置文件添加路径解析配置
  • 包文件配置启动和打包命令
pnpm add -D @craco/craco
const path = require('path')
module.exports = {
    //webpack配置
    webpack:{
      // 配置别名
      alias:{
          '@':path.resolve(__dirname,'src')
      }
    }
}
"scripts":{
    "start":"craco start",
    "build":"craco build"
}

封装request请求模块

image.png

// 安装axios
pnpm add -D axios

src下创建service文件夹,在其底下同时创建index.tsx 和 request.tsx文件

// 统一中转模块函数
import { request } from "./request";

export { request };

import axios from "axios";

/**
 * axios的封装处理步骤:
 * 1. 根域名配置
 * 2. 超时时间
 * 3. 请求拦截器/响应拦截器
 */

const request = axios.create({
  baseURL: "http://127.0.0.1:3000",
  timeout: 5000,
});

// 添加请求拦截器
request.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
request.interceptors.response.use(
  (response) => {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  },
  (error) => {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  }
);
export { request };

使用redux管理token

image.png

  1. 新增store目录
  2. 创建index.tsx文件和modules目录
  3. modules目录底下创建user.ts模块

编写user模块代码

image.png

image.png

入口文件组装

image.png

入口文件关联组件

image.png

异步方法,完成登录获取token

image.png

login组件触发异步方法

image.png

token持久化处理

image.png

存到本地

image.png

封装token的存取删

image.png

image.png

请求头里面注入token

image.png

image.png

使用token做路由权限控制

image.png

image.png

初始化样式

// 安装Normalize.css
pnpm add normalize.css

menu菜单点击跳转路由的实现

image.png

根据当前路径高亮菜单

  • 获取当前url上的路由路径
  • 找到组件负责高亮的属性,绑定当前路由路径
  • useLocation拿pathname

image.png

路由懒加载

image.png

打包优化

打包体积可视化

// 安装source-map-explorer
pnpm add source-map-explorer
// 启动命令
"analyze":"source-map-explorer 'build/static/js/*.js'"