React + 项目(从基础到实战) -- 第十期

news2024/12/24 21:37:41

目标

学会react 状态管理工具
使用redux管理用户状态

Context

  1. 跨层级传递,不像props层层传递
  2. 类似于Vue的provide/inject
  3. 用于:切换主题颜色,切换语言

useReducer

useState 的替代方案
简化版的redux

MobX

1. MobX 介绍 · MobX 中文文档

声明式的修改数据 , 像vue
state
action
derivation 派生: computed observer

Redux

  • state/store (存储的数据)
  • action(发布的命令 类似导航让我们知道发生了什么)
  • reducer(生成新的state 联系起state与action)
  • dispatch(派发的action,产生数据)

默认支持跨组件通讯

项目实战–redux

快速开始 | Redux 中文官网

Redux 要求我们通过创建数据副本和更新数据副本,来实现不可变地写入所有状态更新。不过 Redux Toolkit createSlice 和 createReducer 在内部使用 Immer 允许我们编写“可变”的更新逻辑,变成正确的不可变更新。

引入redux

安装

npm install @reduxjs/toolkit react-redux

为 React 提供 Redux Store

import React from 'react'

import ReactDOM from 'react-dom/client'

import App from './App.tsx'

import { Provider } from 'react-redux'

import store from './store/index.ts'

ReactDOM.createRoot(document.getElementById('root')!).render(

  <React.StrictMode>

    <Provider store={store}>

      <App />

    </Provider>

  </React.StrictMode>,

)

创建Redux Store

import { configureStore } from '@reduxjs/toolkit'

import userReducer from './userReducer'

export default configureStore({

  reducer: {

    //分模块注册

    user: userReducer, // 注册userReducer

  

    // 你可以在这里注册更多的reducer

  }

})

创建 Redux State Slice

import { createSlice , PayloadAction } from "@reduxjs/toolkit";

  

export type UserStateType={

    username:string,

    nickname:string

}

  
  

const INIT_STATE:UserStateType={

    username:"",

    nickname:""

}

  
  

export const userSlice=createSlice({

    name:"user",

    initialState:INIT_STATE,

    reducers:{

        //登录保存用户信息

        loginReducer:(state,action:PayloadAction<UserStateType>)=>{

            return action.payload // 设置username nickname 到 redux store

            //用不到immer

  

        },

        //退出删除用户信息

        logoutReducer:()=>{

            return INIT_STATE // 设置username nickname 到 redux store

            //用不到immer

        }

    }

})

  
  

export const {loginReducer,logoutReducer}=userSlice.actions

export default userSlice.reducer

使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用户信息存储

自定义hook

import { useEffect , useState } from "react";

  

import { useRequest } from "ahooks";

//导入发起请求的函数

  

import { useDispatch } from "react-redux";

import { getUserInfoService } from "../services/user";

import { loginReducer } from "../store/userReducer";

import useGetUserInfo from "./useGetUserInfo";

  

function useLoadUserData() {

    const dispatch = useDispatch();

    const [waitingUserData , setWaitingUserData] = useState(true);

  

   //ajax 加载用户信息

   const {run } = useRequest(getUserInfoService , {

       manual:true,

       onSuccess: (data) => {

         const {username , nickname} = data;

         dispatch(loginReducer({

            username,

            nickname

         })) // 存储到redux store

       },

       onFinally(){

        setWaitingUserData(false);

       }

   })

  
  
  

   //判断当前的redux  store 是否存在用户信息

   const {username} = useGetUserInfo()

   useEffect(() => {

       if(username){

           setWaitingUserData(false); // redux中存在信息,则不用重新加载

           return ;

       }

       run();// 如果不存在,则进行加载

   },[username])

  
  

   return {waitingUserData};

  

}

  
  

export default useLoadUserData;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于后端有延迟,首页闪了一下,前端使用spin组件(显示加载效果)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

bug :用户登录成功后.还能访问登录注册页

预期效果:
已经登录
1. 跳转页面是登录注册页 , 重定向到我的问卷
2. 跳转页面不是登录注册页,放行
未登录
1. 跳转页面需要用户信息,重定向到登录页
2. 跳转页面不需要用户信息,放行

自定义hook

import React , {FC, useEffect} from "react";

import useGetUserInfo from "./useGetUserInfo";

import { useNavigate ,useLocation } from "react-router-dom";

import useLoadUserData from "./useLoadUserData";

import { isLoginOrRegiter, isNeedUserInfo, LOGIN_PATH, MANAGE_PATH } from "../router";

  

function useNavPage() {

    const {waitingUserData} = useLoadUserData();

    const {username} = useGetUserInfo();

    const {pathname} = useLocation();

  

    const nav = useNavigate();

    useEffect(()=>{

        if(waitingUserData) return ;

  

        //已经登录了

        if(username){

            //跳转的页面是login/register

            if(isLoginOrRegiter(pathname))

             {

                nav(MANAGE_PATH)

             }

            return

        }

  

        //没有登录

        if(isNeedUserInfo(pathname))

        {

            nav(LOGIN_PATH);

        }

  
  
  

    },[username,pathname])

  

}

  
  
  

export default useNavPage;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结

自定义hook使用
useGetUserInfo
useLoadUserData
useNavPage

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1634329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构-AVL树

目录 什么是 AVL 树 ASL 度量查找效率 结构体定义 平衡调整 调整类型 左旋和右旋 右旋 左旋 左、右平衡调整 左平衡调整 右平衡调整 插入数据 模拟建立 AVL 树 什么是 AVL 树 二叉排序树的形状取决于数据集&#xff0c;当二叉树的高度越小、结构越合理&#xff0c…

利用GaussDB的可观测性能力构建故障模型

D-SMART高斯专版已经开发了几个月了&#xff0c;目前主要技术问题都已经解决&#xff0c;也能够初步看到大概的面貌了。有朋友问我&#xff0c;GaussDB不已经有了TPOPS了&#xff0c;为什么你们还要开发D-SMART高斯专版呢&#xff1f; 实际上TPOPS和D-SMART虽然都可以用于Gaus…

Qt客服端开发的组件库

Qt 是一个功能丰富的跨平台 C 应用程序框架&#xff0c;它包含了许多用于不同目的的组件库。以下是一些主要的 Qt 组件库&#xff0c;这些库为开发者提供了广泛的工具和功能&#xff0c;以便构建复杂的应用程序。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&a…

前端页面单元测试最佳策略:全面涵盖逻辑、组件、流程、UI及性能优化测试,全面保障软件应用的质量

页面级别的测试要求我们从更宏观的角度审视应用&#xff0c;不仅关注单个组件的正确性&#xff0c;还要确保组件间的协作无误&#xff0c;以及用户在应用中的完整体验。通过集成测试、E2E测试和场景测试&#xff0c;我们可以更全面地覆盖应用的各种使用情况&#xff0c;提高软件…

实战干货|Spark 在袋鼠云数栈的深度探索与实践

Spark 是一个快速、通用、可扩展的大数据计算引擎&#xff0c;具有高性能、易用、容错、可以与 Hadoop 生态无缝集成、社区活跃度高等优点。在实际使用中&#xff0c;具有广泛的应用场景&#xff1a; 数据清洗和预处理&#xff1a;在大数据分析场景下&#xff0c;数据通常需要…

解决React报错Encountered two children with the same key

当我们从map()方法返回的两个或两个以上的元素具有相同的key属性时&#xff0c;会产生"Encountered two children with the same key"错误。为了解决该错误&#xff0c;为每个元素的key属性提供独一无二的值&#xff0c;或者使用索引参数。 这里有个例子来展示错误是…

学习【Mysql运维篇】这一篇就够了

运维篇 1. 日志1-1. 错误日志1-2. 二进制日志1-3. 查询日志1-4. 慢查询日志 2. 主从复制2-1. 概述2-2. 原理2-3. 搭建 3. 分库分表3-1. 介绍3-2. Mycat概述3-3. Mycat入门3-4. Mycat配置3-5. Mycat分片3-6. Mycat管理及监控 4. 读写分类 1. 日志 1-1. 错误日志 错误日志是MyS…

【hackmyvm】vivifytech靶机

渗透思路 信息收集端口扫描端口服务信息目录扫描爆破hydra--sshgit提权 信息收集 ┌──(kali㉿kali)-[~] └─$ fping -ag 192.168.9.0/24 2>/dev/null 192.168.9.119 --主机 192.168.9.164 --靶机个人习惯&#xff0c;也方便后续操作&#xff0c;将IP地址赋值给一个变…

IDEA 创建Servlet-HelloWorldServlet

servlet 1.创建空项目2.配置web项目3.配置Tomcat4.加载Tomcat包5.创建HelloWorldServlet类6.配置web.xml7.运行get与post请求 1.创建空项目 2.配置web项目 3.配置Tomcat 4.加载Tomcat包 5.创建HelloWorldServlet类 public class controller extends HttpServlet {Override//get…

【Hadoop】MapReduce (五)

MapReduce 入门案例练习 统计文件中每一个单词出现的次数(文件&#xff1a;words.txt)对IP去重(文件&#xff1a;ip.txt) 组件 序列化 - Writable 统计每一个人花费的上行流量、下行流量以及总流量(文件&#xff1a;flow.txt) 在MapReduce中&#xff0c;各个节点之间基本上…

【面试经典 150 | 图的广度优先搜索】最小基因变化

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;广搜 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

Java使用SpringBoot和EasyExcel 实现动态数据导出实战

Java使用SpringBoot和EasyExcel 实现动态数据导出实战 1、前言2、【资源地址】3、代码示例(demo)4、目前Java实现数据导出为Excel方式5、依赖6、总结 1、前言 工作中有用到将数据导出为Excel的场景&#xff0c;在此记录下。在日常开发中&#xff0c;Excel文件处理是一项常见的…

部署(Deployment)

Today you’ll be designing your own machine learning project, creating your own dataset, training a model using your data, and finally deploying an application on the web. We’ll be using a particular deployment target called Hugging Face Space with Gradio…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 4月30日,星期二

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年4月30日 星期二 农历三月廿二 1、 气象台&#xff1a;五一假日前期全国大部地区晴好为主&#xff0c;假日后期中东部地区需警惕大范围强降雨。 2、 交通运输部&#xff1a;5月1日0时至5日24时&#xff0c;收费公路小客车免…

通过AI助手实现一个nas定时任务更新阿里云域名解析

一.通过AI助手实现一个ip-domain.py的脚本 起一个Python脚本&#xff0c;ip-domain.py&#xff1b;注意已安装Python3.的运行环境&#xff1b;将下面阿里云相关配置添加&#xff0c;注意这里引用了两个包&#xff0c;requests和alibabacloud_alidns20150109&#xff1b;执行前…

【优质书籍推荐】Vue.js 3.x+Element Plus从入门到精通

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

袁庭新ES系列17节|Spring Data Elasticsearch基础

前言 为了简化对Elasticsearch的操作Spring Data提供了Spring Data Elasticsearch。Spring Data Elasticsearch是Spring Data技术对Elasticsearch原生API封装之后的产物&#xff0c;它通过对原生API的封装&#xff0c;使得程序员可以简单的对Elasticsearch进行各种操作。接下来…

华为 huawei 交换机 配置 MUX VLAN 示例(汇聚层设备)

组网需求 在企业网络中&#xff0c;企业所有员工都可以访问企业的服务器。但对于企业来说&#xff0c;希望企业内部部分员工之间可以互相交流&#xff0c;而部分员工之间是隔离的&#xff0c;不能够互相访问。 如 图 6-4 所示&#xff0c; Switch1 位于网络的汇聚层&#xff0…

STM32F103学习笔记 | 4.STM32F103芯片介绍

STM32F1入门学习将使用STM32F103C8T6开发板最小系统板。小R为什么选择它来入门呢&#xff1f;咳咳~首先&#xff0c;ST官方提供强大且易用的标准库函数&#xff0c;使得开发过程方便快捷&#xff1b;其次&#xff0c;网上的教程资料多也十分详细。所以呢&#xff0c;它对高校学…

SQLite的扩展函数Carray()表值函数(三十八)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite如何处理CSV 虚拟表 下一篇&#xff1a;SQLite—系列文章目录 ​ 1. 概述 Carray()是一个具有单列的表值函数(名为 “value”)和零行或多行。 carray() 中每一行的“值”取自 C 语言数组 由应用程序通过参数绑定提…