React-Redux结合@Reduxjs/Toolkit实现函数组件化(数据持久化,刷新页面数据不丢)

news2024/11/16 6:37:15

函数式组件和类式组件的优缺点儿

函数组件(Function Component)和类组件(Class Component)是React中的两种定义组件的方式。函数组件是以一个函数的方式定义组件,而类组件则是以ES6的类继承React.Component来定义组件。

函数组件的优点:

1.更简单的代码,无需使用this关键字。
2.更容易理解和调试,因为它们是纯函数。
3.更好的性能,因为它们不支持shouldComponentUpdate生命周期钩子。
默认的性能优化,如React Fiber的diff算法会更好地处理函数组件。

函数组件的缺点:

1.缺乏状态(state),需要使用hooks API(如useState)。
2.缺乏生命周期方法,需要使用hooks API(如useEffect)或者将函数组件转换为类组件。
3.不支持refs。

类组件的优点:

1.支持更多的React特性,如状态(state),生命周期方法,refs等。
2.可以在任何生命周期中使用this.setState来更新状态,而不需要考虑是否在合成事件中。
3.类组件可以复用状态逻辑和生命周期逻辑,通过高阶组件等方式。

类组件的缺点:

1.需要使用this关键字,可能会导致this指向问题。

2.类组件在每次渲染时都会创建一个新的实例,可能会影响性能。
3.代码可能会更复杂,因为需要处理this和生命周期方法。
在新的React项目中,推荐使用函数组件,特别是对于简单的组件,因为它们更易于理解和维护。但是,当需要使用state、refs或生命周期方法时,就应该使用类组件或hooks

代码示例

主入口文件index.js 代码配置项如下:
import ReactDOM from "react-dom/client";
import React from "react";
import App from "./App";
import { Provider } from "react-redux";
//数据持久化,刷新页面数据不丢
import { PersistGate } from "redux-persist/integration/react";
//store 存储及数据持久化
import { store, persistor } from "./store/index";
const root = ReactDOM.createRoot(document.getElementById("root"));

root.render(
  <React.StrictMode>
    {/* 全局提供核心 store */}
    <Provider store={store}>
      {/* 提供持久化入口 */}
      <PersistGate loading={null} persistor={persistor}>
        <App></App>
      </PersistGate>
    </Provider>
  </React.StrictMode>
);
Store 核心文件代码配置如下:
import { configureStore, combineReducers } from "@reduxjs/toolkit";
import personReducer from "./reducers/personReducer";
import { persistStore, persistReducer } from "redux-persist";
// import storage from 'redux-persist/lib/storage'; // 使用local storage来持久化存储
import storageSession from "redux-persist/lib/storage/session"; // 使用session  storage 临时会话模式

// 定义root reducer
const rootReducer = {
  person: personReducer,
};

// 配置持久化选项,localStorage模式
const persistConfig = {
  key: "root",
  // storage:storage,//local storage 存储模式
  storage: storageSession, //session storage 会话模式存储模式存储
};
//让所有的reducer,持久化
const persistedReducer = persistReducer(
  persistConfig,
  combineReducers({ person: personReducer })
);
export const store = configureStore({
  reducer: persistedReducer,
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: false,
    }),
});
//导出持久化配置
export const persistor = persistStore(store);

store 目录下 reducer 目录下personReducer.js配置如下:
import { createSlice } from "@reduxjs/toolkit";

const personSlice = createSlice({
  name: "person",
  initialState: {
    personList: [],
  },
  reducers: {
    addPerson: (state, action) => {
      state.personList = [action.payload, ...state.personList];
    },
  },
});

//分别导出所有的工作
export const { addPerson } = personSlice.actions;
//默认导出reducer动作
export default personSlice.reducer;

####### Person.js 页面组件代码如下:

import { useRef, useState } from "react";
import { useSelector, useDispatch } from "react-redux";
import { nanoid } from "nanoid";
import { addPerson } from "../../store/reducers/personReducer";
export default function Person() {
  //通过ref 方式获取用户名称
  const userNameRef = useRef();
  //通过受控组件模式获取年龄
  const [age, setAge] = useState(0);
  //通过useSelect获取state
  const personList = useSelector((state) => state.person.personList);
  //通过调用useDispatch 分发action
  const dispatch = useDispatch();

  //添加用户
  function addUser() {
    const obj = { userName: userNameRef.current.value, age: age, id: nanoid() };
    //分派,分发
    dispatch(addPerson(obj));
  }
  //通过受控组件的模式获取年龄的值
  function getAgeValue(e) {
    setAge(e.target.value);
  }
  return (
    <div>
      <div>
        <label htmlFor="userName">用户名:</label>
        <input type="text" id="userName" name="userName" ref={userNameRef} />
      </div>
      <div>
        <label htmlFor="age">年龄:</label>
        <input type="text" id="age" name="age" onChange={getAgeValue} />
      </div>
      <div>
        <button onClick={addUser}>添加用户</button>
        <button>异步获取用户信息</button>
      </div>
      <hr />
      <div>用户信息显示:</div>
      <ul>
        {personList.map((item) => {
          return (
            <li key={item.id}>
              {item.userName}-{item.age}-{item.id}
            </li>
          );
        })}
      </ul>
    </div>
  );
}

页面效果如下:

在这里插入图片描述

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

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

相关文章

后端企业级开发之yaml数据序列化格式文件详解2024

yaml格式 数据格式 yaml 是一种数据序列化的格式 容易阅读 容易与脚本语言交互 以数据为核心 重数据轻格式 我们要知道他怎么书写 大小写敏感 属性层级关系使用多行描述 每行结尾使用冒号结束 使用缩进表示层级关系 同层级左侧对其 只运行使用空格 属性前面添加空格 #表…

《Ai企业知识库》-rasa-初步使用

根据上面的环境准备之后&#xff1a; 《Ai企业知识库》-模型实践-rasa开源学习框架-搭建简易机器人-环境准备(针对windows)-02-CSDN博客 基础的使用&#xff1a; rasa项目初始化&#xff1a; rasa init 首先进入目标文件夹 在dos窗口&#xff08;目标文件夹下&#xff09…

智能合约革命:Web3引领智能化商业的未来

随着区块链技术的日益成熟和普及&#xff0c;智能合约作为其重要应用之一&#xff0c;正在逐渐改变着商业世界的面貌。Web3作为下一代互联网的代表&#xff0c;以其去中心化、加密安全的特性&#xff0c;为智能合约的发展提供了无限可能&#xff0c;将智能合约应用于商业领域的…

海云安两大金融案例入编行业典范,七大安全领域实力登榜《2024中国金融网络安全全景图》

近日&#xff0c;数说安全与《中国信息安全》杂志联合编写并发布了《2024年中国金融行业网络安全研究报告》&#xff08;以下简称报告&#xff09;、《2024年中国金融行业网络安全案例集》&#xff08;以下简称案例集&#xff09;、《2024年中国金融行业网络安全市场全景图》&a…

apexcharts数据可视化之雷达图

apexcharts数据可视化之雷达图 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基础雷达图多组数据雷达图雷达图标记点 基础雷达图 import ApexChart from react-apexcharts;export function BasicRadar() {// 数据序列const series [{name…

Pytorch Lighting 库的学习 mvsplat 的笔记

变量理解&#xff1a; context_image&#xff1a; 表示投影的 refrence image Epipolar Transformer vs Swin Transformer : 不同于 Pixel Splat 使用的是 Epipolar Transformer. MVspalt 使用的是 Swin Transformer&#xff0c; 但是作者在 Code 里面 也使用了 Epipolar Tran…

新能源汽车推行精益生产:绿色动力下的效率革命

在新能源汽车行业迅猛发展的当下&#xff0c;推行精益生产已成为提升竞争力的关键所在。精益生产&#xff0c;作为一种以客户需求为导向、追求流程最优化和浪费最小化的管理理念&#xff0c;正逐步在新能源汽车领域展现出其独特的魅力。 新能源汽车的兴起&#xff0c;不仅代表了…

人工智能——什么是摩尔定律以及它如何影响人工智能?

1. 概述 摩尔定律是现代技术发展中一个至关重要的基石。它预言了微芯片上晶体管的数量大约每两年翻一番&#xff0c;这一现象导致了计算能力的指数级增长。在过去的50多年里&#xff0c;这一定律一直是推动技术进步的强大动力&#xff0c;并且对人工智能领域产生了深远的影响。…

基于h5和大数据的游戏数据型网站-计算机毕业设计源码30844

摘 要 在目前的形势下&#xff0c;科技力量已成为我国的主要竞争力。而在科学技术领域&#xff0c;计算机的使用逐渐达到成熟&#xff0c;无论是从国家到企业再到家庭&#xff0c;计算机都发挥着其不可替代的作用&#xff0c;可以说计算机的可用领域遍及生活、工作的各个方面。…

windows web提权

#Web到Win-系统提权-人工操作 如果提权中无法执行命令的话&#xff0c;可以尝试上传cmd.exe到可读写目录再调用 优点&#xff1a;解决实时更新不集成的EXP 缺点&#xff1a;操作繁琐&#xff0c;需要各种复现调试 1、信息收集 参考常见命令&#xff08;见上图&#xff09; …

YOLOv10最详细全面讲解2- 目标检测-环境搭建、训练自己的数据集

YOLOv10没想到出来的如此之快&#xff0c;作为一名YOLO的爱好者&#xff0c;以YOLOv5和YOLOv8的经验&#xff0c;打算出一套从数据集装备->环境配置->训练->验证->目标追踪全系列教程。请大家多多点赞和收藏&#xff01;&#xff01;&#xff01; 系列文章&#xf…

在table表格中如何给tr的每一个子元素加haver效果

效果图&#xff1a; 核心代码&#xff1a; tbody tr :hover {background-color: #d5d5d5; } 改变子元素 tbody tr:hover {background-color: #d5d5d5; } 改变父元素 两段代码看起来一样&#xff0c;其实不一样&#xff0c;其中差了一个空格字符 希望可以帮到大家

企业内部聊天软件Riot部署

ubuntu docker 简介 Riot(原Vector)是使用Matrix React SDK构建的Matrix网络聊天客户端,开源免费,功能丰富,支持私人对话,团队对话,语言视频对话,上传文件,社区互动。支持在聊天界面添加各种有趣的插件,比如RSS等各种机器人、虚拟币实时监控等。并且所有通过Riot传…

java版本数字化时代的智能ERP管理系统:引 领企业高 效管理与创新发展

随着数字化浪潮的席卷&#xff0c;现代企业对于高 效、稳定、易于扩展的管理系统需求愈发迫切。为了满足这一需求&#xff0c;我们倾力打造了一款基于Java技术的企业级资源规划&#xff08;ERP&#xff09;管理系统。该系统以Spring Cloud Alibaba、Spring Boot、MybatisPlus、…

Power Bi 自定义进度条,圆角框,矩阵图标的实现

最近项目在做Power BI&#xff0c;我总结了几个常用的自定义样式&#xff0c;分享一下做法。 比如我们要实现如图这样的一个样式&#xff1a; 这包含了一个带文字的自定义进度条&#xff0c;矩阵有树型展开以及图标显示&#xff0c;最外面有圆角框包围。我觉得这几个样式出现…

【Unity iOS打包】Library not loaded: ‘@rpath/AdjustSdk.framework/AdjustSdk‘

Unity打包iOS&#xff0c;XCode运行App黑屏卡死&#xff0c;报错&#xff1a; dyld[8412]: Library not loaded: rpath/AdjustSdk.framework/AdjustSdkReferenced from: /private/var/containers/Bundle/Application/C019F943-138F-4B33-AAC1-F18453F942D9/AnimalsBAMBAM.app/…

SAP ABAP MD04屏幕增加:增加列

需求:增加显示销售订单送达方 主要使用二代增强出口:M61X0002 事务码T-code:CMOD 填写描述,保存到对应的包下 分配增强到项目下 激活组件,激活后效果如下 编写ZXM61U04 SAP留出的按钮,填写描述 button1_ez = 送达方. 编写ZXM61U03 *&-------------------------…

从零到一建设数据中台 - 数据可视化

从零到一建设数据中台(八)- 数据可视化 一、数据可视化大屏 数据可视化是借助于图形化手段,清晰有效地传达与沟通信息。 将一些业务的关键指标通过数据可视化的方式展示到一块或多块LED大屏上,以大屏为主要展示载体的数据可视化设计。 在数据可视化大屏构建过程中,为了…

50道题目!Python、SQL数据库、AB测试、业务分析、机器学习都在这里了!

介绍 每日一题系列已经更新了50道题目啦&#xff01; 题目难度为初级到中级&#xff0c;涵盖了Python、SQL数据库、AB测试、业务分析、机器学习五大主题&#xff0c;适合初学者和有一定基础的朋友。 原文链接: 50道题目&#xff01;Python、SQL数据库、AB测试、业务分析、机器…

前端使用XLSX导出表格多出一倍数据

问题原因&#xff1a;被导出的表格中含有 fixed 解决方法&#xff1a; 使用新的table标签导出&#xff0c;去除fixed