React项目开发常用API

2023-11-14

记录一下React项目开发常用API,作为后续开发的参考。

路由配置

配置文件形式

// router/index.js
import React, { lazy, Suspense } from 'react'

// Suspense配合lazy实现懒加载
const SuspenseComponent = Component => {
  return (
    <Suspense>
      <Component></Component>
    </Suspense>
  )
}

const routes = [
  {
    path: '/',
    element: SuspenseComponent(lazy(() => import('../pages/index/Index'))),
  },
  {
    path: '/login',
    element: SuspenseComponent(lazy(() => import('../pages/login/Login')))
  },
  {
    path: '/list/:b',
    element: SuspenseComponent(lazy(() => import('../pages/list/List')))
  },
  {
    path: '*',
    element: SuspenseComponent(lazy(() => import('../pages/notFound/NotFound'))),
  },
]

export default routes

标签形式

import { HashRouter, Routes, Route } from 'react-router-dom'
import Index from './pages/index/Index'
import Login from './pages/login/Login'
import NotFound from './pages/NotFound/NotFound'

<React.StrictMode>
  <HashRouter>
    <Routes>
      <Route path='/' element={<Index />}></Route>
      <Route path='/login' element={<Login />}></Route>
      <Route path='*' element={<NotFound />}></Route>
    </Routes>
  </HashRouter>
</React.StrictMode>

路由鉴权

import React, { Fragment } from 'react'
import { useRoutes, Navigate, useLocation } from 'react-router-dom'
import routes from './router'
import { getToken } from './utils/auth'

const Permission = () => {
    const token = getToken()
    const location = useLocation()
    // 没有token,且不是访问登录页,重定向到登录页
    const toLogin = !token && location.pathname !== '/login'

    function RenderRoutes() {
        return useRoutes(routes)
    }

    return (
        <Fragment>
            { toLogin ? <Navigate to="/login" replace /> : <RenderRoutes /> }
        </Fragment>
    )
}

export default Permission

路由跳转,传参

标签跳转

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

<Link to={{pathname: '/'}}>
    <button>跳转</button>
</Link>

useNavigate跳转

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

const navigate = useNavigate()

/** 
  * 三种路由传参方式
  * 1、声明传参:/list/:id
  * 2、地址栏传参: /list?id=1
  * 3、state属性传参:state: { id: 1 }
  */
navigate('/List/3?a=2', {
    state: { id: 1 }
})

history跳转(前进、后退)

// history.js
import { createHashHistory } from 'history'

export default createHashHistory()


import history from './history'

history.back()

样式编写

styled-components

// App.js
import { ThemeProvider } from 'styled-components'

// 传递主题
<ThemeProvider theme={{ primaryColor: '#db3046' }}>
  <Permission />
</ThemeProvider>
// index/style.js
import styled from 'styled-components'

export default styled.div`
  height: 100vh;
  display: flex;
  flex-direction: column;
  .nav {
      height: 70px;
      padding: 0 20px;
      background-color: ${props => props.theme.primaryColor};
      display: flex;
      align-items: center;
      .title {
          text-align: left;
          flex: 1;
          font-size: 20px;
          font-weight: 600;
          color: yellow;
      }
  }
`

状态管理

创建模块

// store/features/user.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'
import { getToken, getUserInfo, removeToken, removeUserInfo } from '../../utils/auth'
import { logout } from '../../api/login'
import history from '../../lib/history'

export const logoutAction = createAsyncThunk('user/logout', async () => {
  return await logout()
})

const slice = createSlice({
  name: 'user',
  initialState: {
    token: getToken(),
    userInfo: getUserInfo(),
  },
  reducers: {
    setToken(state, { payload }) {
      state.token = payload
    },
    setUserInfo(state, { payload }) {
      state.userInfo = payload
    },
  },
  extraReducers(builder) {
    builder.addCase(logoutAction.fulfilled, (state, { payload }) => {
      if (payload.success && payload.code === 200) {
        state.token = ''
        state.userInfo = ''
        removeToken()
        removeUserInfo()
        history.push('/login')
        location.reload()
      }
    })
  },
})

export const { setToken, setUserInfo } = slice.actions

export default slice.reducer

注册模块

// store/index.js
import { configureStore } from '@reduxjs/toolkit'
import userReducer from './features/user'

export default configureStore({
  reducer: {
    user: userReducer
  }
})

传递状态

import { Provider } from 'react-redux'
import store from './store/index'
import App from './App'

<Provider store={store}>
  <App />
</Provider>

获取、操作状态

import { useSelector, useDispatch } from 'react-redux'
import { logoutAction } from '../../store/features/user'

const { userInfo } = useSelector(store => store.user)
const dispatch = useDispatch()

return (
  <div>
    <div>{userInfo.realName}</div>
    <button onClick={() => dispatch(logoutAction())}>登出</button>
  </div>
)

函数组件使用钩子

import React, { useState, useEffect } from 'react'

function onRequest() {}

const [number, setNumber] = useState(0)

/**
 * useEffect第二个参数不传,任意状态发生改变,都会执行
 * 传[],只在组件挂载后执行
 * 传[number],在组件挂载后和number变化后执行
 */
useEffect(() => {
    onRequest()
}, [number])

代码优化

减少重复渲染

memo

// 调用memo,当父组件重新渲染,但是props不变时,子组件读取缓存
import React, { memo } from 'react'

const Child = () => {
  return (
    <div>child</div>
  )
}

export default memo(Child)

useCallback

// 使用useCallback处理函数,当父组件重新渲染,依赖数组不变时,返回相同函数,避免触发props变化,导致子组件重新渲染
import React, { useState, useCallback } from 'react'
import Child from 'Child'

const Parent = () => {
  const [value, setValue] = useState(0)
  function sum() {
    setValue(value + 1)
  }

  const sumCall = useCallback(sum, [])
  return (
    <div>
      <div>{ value }</div>
      <Child onClick={sumCall} />
    </div>
  )
}

减少重复计算

useMemo

// 调用useMemo,当组件重新渲染时,若依赖数组不变,直接读取缓存的结果
import React, { useMemo, useState } from 'react'

const Parent = () => {
  const [value, setValue] = useState(0)
  function sum() {
    let result = 0
    for(let i = 0; i < 100000; i++) {
      result++
    }

    return result
  }

  const result = useMemo(sum, [])
  return (
    <div>
      <div>{ value + result }</div>
      <button onClick={() => setValue(value + 1)}></button>
    </div>
  )
}

本文由mdnice多平台发布

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React项目开发常用API 的相关文章

随机推荐

  • 五分钟带你一步一步去了解Spring Boot是如何实现自动配置

    前言 在使用传统的 Spring 去做 Java EE 应用开发时 在项目中会出现大量的 XMl配置文件 使 Java EE 项目变得笨重且繁琐 从而导致开发和部署上的效率降低 Spring Boot 的出现就是简化 Spring 应用的搭
  • 计算机原码反码补码的理解和作用

    摘要 本文旨在深入探讨整数在计算机中的二进制表示形式以及涉及的源码 反码和补码的运算原理 我们将介绍二进制数的基本概念 解释源码 反码和补码的定义和转换规则 并探讨在运算过程中它们的作用和区别 通过详细的解释和示例 我们希望读者能够全面理解
  • Vue项目引用百度地图并实现搜索定位等功能

    Tip 本篇文章为案例分析 技术点较多 所以篇幅较长 认真阅览的你一定会学到很多知识 前言 百度地图开放平台 给开发者们提供了丰富的地图功能与服务 使我们的项目中可以轻松地实现地图定位 地址搜索 路线导航等功能 本文给大家介绍如何在vue项
  • 继续发布VS2005下DataGridView 的多种样式列控件

    VS2005已经发布好久了 但对DataGridView 的使用 在网上的资料还比较少 DataGridView 无论是美观与功能方面都是DataGrid所不能比的 应该说DataGridView 不是DataGrid的升级 因为DataG
  • 大范围自动化时序软件LiCSBAS安装教程

    1 配置虚拟环境 1 1创建虚拟环境 注意随着版本的提升 python现在是3 9 装不上 需要降python改为3 8版本即可 conda create n licsbas python 3 8 13 1 2 安装LiCSBAS所需要的库
  • 华为ensp模拟校园网/企业网实例(精品拓扑图)

    文章简介 本文用华为ensp对企业网络进行了规划和模拟 也同样适用于校园 医院等场景 如有需要可联系作者 可以根据定制化需求做修改 作者简介 网络工程师 希望能认识更多的小伙伴一起交流 可私信或QQ号 1686231613 目录 摘 要 第
  • 华为发布数字资产继承功能

    在华为开发者大会2023 HDC Together 上 华为常务董事 终端BG CEO 智能汽车解决方案BU CEO余承东正式发布了数字资产继承功能 HarmonyOS提供了安全便捷的数字资产继承路径 在鸿蒙世界中 我们每个人在每台设备 应
  • AI技术进阶的75道面试题

    本文转载自AI科技大本营 整理 AI科技大本营 出品 AI科技大本营 公众号id rgznai100 导语 正值求职 跳槽季 无论你是换工作还是找实习 没有真本事都是万万不行的 可是如何高效率复习呢 之前我们给大家推荐了一份 Python
  • 如何把 Git Submodule 变成普通文件夹

    转载于此文章 记录一下 感觉最重要的是把原来的submodule中的 git删除掉 先删除 Git Submodule 删除所有相关的git配置文件即可 再把 submodule 中的文件添加到主仓库 删除 Git submodule 的命
  • MATLAB求矩阵最大、最小值

    矩阵求最大 最小值用max min函数 max A min A 返回行向量 求每列最大 最小值 max A B min A B 返回一个A B中比较大 较小元素组成的矩阵 max A dim min A dim dim 1 比较A的列 di
  • PowerOJ 2543: 赛场布置

    题目链接 对于每个点 它可以选择男或者女 如果要加上的贡献 那么相邻的一定得是异性才可以 所以 对相邻的 我们可以考虑成 然后 我们对于点坐标的的奇偶性分别讨论即可 当然 还需要考虑的贡献 然后就是全选减去最少割去的即可 include
  • iOS面试题(2.类变量的@protected,@private,@public,@package声明各有什么含义)拓展:常用框架和第三方框架

    2 类变量的 protected private public package声明各有什么含义 private 作用范围只能在自身类 protected 作用范围在自身类和继承自己的子类 默认 public 作用范围最大 可以在任何地方被访
  • nginx匹配以XXX结尾的

    匹配以do结尾的所有文件 如http 192 168 126 168 8080 delivery transportPlanData do startRelease 2019 07 06 endRelease 2019 07 06 sear
  • 初识Composer

    文章目录 依赖管理工具Composer 参考 1 简介 2 安装Composer 3 声明和安装依赖 4 自动加载 5 模块仓库 依赖管理工具Composer 参考 Composer 中文网 Packagist 中国全量镜像官方 地址htt
  • cygwin的git vscode中的使用

    背景 需要用到cygwin 编辑器是vscode 版本 vscode 版本1 55 cygwin版本2 11 2 1 cygcheck c cygwin cygwin的git2 17 cygcheck c git vscode报错 open
  • 算法篇-------贪心2

    文章目录 题目1 活动选择 题目2 无重叠区间 题目3 最多可以参加的会议数目 题目4 去除重复字母 题目5 移掉K位数字 题目6 拼接最大数 题目1 活动选择 有n个需要在同一天使用同一个教室的活动a1 a2 an 教室同一时刻只能由一个
  • linux指令_龙红云

    一 基础指令 1 ls指令 ls 列出当前目录下的所有文件 文件夹的名字 ls root 列出root下的所有文件 文件夹的名字 ls l 以详细列表的形式展示 ls la ls a 显示所有文件 文件夹 包含了隐藏文件 文件夹 ls lh
  • Spring学习总结

    因为是学习总结 所以参考了很多资料做的博客 如果有侵权 请联系我 写的不对的欢迎指出 Spring 开源的轻量级框架 Spring核心 IOC 控制反转控 制反转还有一个名字叫做DI Dependency Injection 中文意思叫依赖
  • Python轻量级Web框架Flask(9)——图书馆项目

    1 项目要求 创建一个项目 用来说明出版社 书籍和作者的关系 作者和书籍之间的关系 1对多 一本书由一个作者完成 一本书可以有多个创作者 出版社和书籍之间的关系 多对多 一个出版社可以出版多本书 一本书可以由多个出版社出版 要求 1 在书籍
  • React项目开发常用API

    记录一下React项目开发常用API 作为后续开发的参考 路由配置 配置文件形式 router index js import React lazy Suspense from react Suspense配合lazy实现懒加载 const