Next.js ts redux/toolkit状态管理

目录

介绍

安装依赖

初始化store

1、在src下创建store文件夹,

2、创建最简单的slice切片

3、创建入口文件index.ts

4、创建hooks.ts

在_app.tsx中注入store

tsx中使用store

payload

createAsyncThunk

效果


介绍

@reduxjs/toolkit是Redux 官方提供的一个工具集,旨在简化和改善 Redux 应用的开发体验。它包含一些工具函数和约定,可以帮助你更快、更轻松地构建和维护 Redux 应用。

方法:

  • configureStore: 创建Redux store
  • createSlice :用于创建state和reducer
  • createAsyncThunk:用于处理异步操作,并自动创建了三个状态(pending、fulfilled、rejected)对应于异步操作的不同阶段。
  • ...

类型:

  • PayloadAction:用于定义往reducer传入action的类型

安装依赖

npm i @reduxjs/toolkit react-redux

yarn add @reduxjs/toolkit react-redux

初始化store

1、在src下创建store文件夹,

2、创建最简单的slice切片

import { createSlice, PayloadAction, createAsyncThunk } from '@reduxjs/toolkit';
import type { RootState } from '.';
interface CounterStateProps {  // state 类型
  value: number;
}
const initialState: CounterStateProps = {  // state数据初始化
  value: 0,
};
export const counterSlice = createSlice({
  name: 'counter',
  initialState,  // state
  reducers: {
    decrementOne: (state) => {
      state.value -= 1;
    },
    incrementByAmount: (state, action: PayloadAction<number>) => {
      state.value += action.payload;
    }
  }
})
export const { decrementOne, incrementByAmount } = counterSlice.actions;  // 导出action
export const selectCount = (state: RootState) => state.count.value;  // 导出state的值
export default counterSlice.reducer;  // 导出reducer

PayloadAction定义reducer payload的传参类型

3、创建入口文件index.ts

import { configureStore } from '@reduxjs/toolkit'
import counterReducers from './counterSlice'
const store = configureStore({
  reducer: {
    count: counterReducers
  }
})
export type RootState = ReturnType<typeof store.getState>  // 导出类型被hook所使用
export type AppDispatch = typeof store.dispatch
export default store

4、创建hooks.ts

import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
import type { RootState, AppDispatch } from './'

export const useAppDispatch: () => AppDispatch = useDispatch
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector

至此store结构

在_app.tsx中注入store

import { AppProps } from 'next/app';
import { Provider } from 'react-redux';
import Header from '@/components/Header';
import store from '@/store'
export default function MyApp({ Component, pageProps } :AppProps) {
    return (
        <Provider store={store}>
            <Header/>
            <Component {...pageProps} />
        </Provider>
    )
}

tsx中使用store

import { useAppSelector, useAppDispatch } from '@/store/hooks'
import { selectCount, decrementOne ,incrementByAmount  } from '@/store/counterSlice'
export default function Redux() {
  const count = useAppSelector(selectCount)
  const dispatch = useAppDispatch()
  return (
    <>
      <div>value: {count}</div>
      <div>
        <button onClick={() => dispatch(decrementOne())}>increment</button>
        <button onClick={() => dispatch(incrementByAmount(1))}>incrementByAmount</button>
      </div>
    </>
  )
}

useAppSelector用于从store中取出数据

useAppDispatch用于派发action,对state进行操作,类似vuex里的mutation

payload

将传递给reducer的action做预处理

  reducers: {
    increment: {
      reducer(state, action: PayloadAction<{title: number; content: number; value:number}>) {
        state.value +=  action.payload.value
      },
      prepare(value: number) {
        return {
          payload: {
            title: 1,
            content: 2,
            value
          },
        };
      }
    },
 }
//tsx

<button onClick={() => dispatch(increment(1))}>increment</button>

dispatch(increment(1)) 后会先走prepare,传入参数value为1,做一些逻辑处理,return payload,

做过处理的action被reducer的action所接收。

createAsyncThunk

createAsyncThunk是 Redux Toolkit 提供的一个用于创建处理异步操作的 thunk 函数的辅助函数

import { createSlice, PayloadAction, createAsyncThunk } from '@reduxjs/toolkit';
import type { RootState } from '.';

// 异步操作
export const fetchList = createAsyncThunk('counter/fetchList', async () => {
  const response = await fetch(`http://127.0.0.1:3000/api/v1/list`);
  return await response.json();
});

interface CounterStateProps {
  listLoading: boolean;
  listError: string;
  list: any[];
}

const initialState: CounterStateProps = {
  listLoading: false,
  listError: '',
  list: [],
};

const counterSlice = createSlice({
  name: 'counter',
  initialState,
  reducers: {
    cleartListError: (state) => {
      state.listError = '';
    },
  },
  extraReducers(builder) {
    builder.addCase(fetchList.pending, (state) => {
      state.listLoading = true;
    })
    builder.addCase(fetchList.fulfilled, (state, action: PayloadAction<{data?: any, message?: string}>) => {
      const { data, message } = action.payload
      message ? state.listError = message : state.list = data.data;
      state.listLoading = false;
    })
    builder.addCase(fetchList.rejected, (state) => {
      state.listLoading = false;
    });
  },
})
export const { cleartListError } = counterSlice.actions;
export const selectList = (state: RootState) => state.counter.list;
export const selectListLoading = (state: RootState) => state.counter.listLoading;
export const selectListError = (state: RootState) => state.counter.listError;

export default counterSlice.reducer;

用createAsyncThunk创建异步操作,第一个参数是标识符,用于被Redux DevTools所记录

第二个异步回调的返回值传递给

用builder.addCase监听fetchList 异步操作,有三个状态pending、fulfilled、rejected,根据三种状态设置loading和error

在tsx中应用

import { useAppSelector, useAppDispatch } from '@/store/hooks'
import { selectListLoading, selectListError, selectList, fetchList, cleartListError  } from '@/store/counterSlice'
import { Skeleton, message } from 'antd'
import { useEffect } from 'react'
export default function Redux() {
  const [messageApi, contextHolder] = message.useMessage();
  const listLoading = useAppSelector(selectListLoading)
  const listError = useAppSelector(selectListError)
  const list = useAppSelector(selectList)
  const dispatch = useAppDispatch()
  const warning = (msg: string) => {
    messageApi.open({
      type: 'warning',
      content: msg,
    });
  };
  useEffect(() => {
    if(listError) {
      warning(listError)
      dispatch(cleartListError())
    }
  }, [listError])

  return (
    <>
      { contextHolder }
      <div>
        <button onClick={() => dispatch(fetchList())}>获取List</button>
      </div>
      <div>
        {
          listLoading ? 
          <Skeleton active /> :
          list.map((item, idx) => (
            <div key={idx}>{item.name}: {item.counter}</div>
          ))
        }
      </div>
    </>
  )
}

效果

success

error

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Axure元件基本介绍进阶

Axure元件基本介绍进阶 1.Axure元件基本介绍1.在 Axure 中&#xff0c;元件是构建原型的基本构成单元&#xff0c;能够帮助设计师快速创建、重复使用和管理设计元素。以下是 Axure 中元件的基本介绍&#xff1a;1.基本元件&#xff1a; 2.基本元件的使用一.【举例说明】积木&am…

Python提取速率

Python提取速率 需求&#xff1a;提取速率需要有M提取到M前数值并添加回原始数据如果是0只能为空白 Python实现 import pandas as pd import os# 提取速率函数 def extract_broadband_speed(speed):if pd.notnull(speed) and M in str(speed):return str(speed).split(M)[0] …

(第8天)保姆级 PL/SQL Developer 安装与配置

PL/SQL Developer 安装与配置(第8天) 咱们前面分享了很多 Oracle 数据库的安装,但是还没有正式使用过 Oracle 数据库,怎么连接 Oracle 数据库?今天就来讲讲我学习中比较常用的 Oracle 数据库连接工具:PL/SQL DEVELOPER。 PL/SQL Developer 的安装和配置对于新手来说还是…

lwIP 细节之四:recv 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程&#xff0c;其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数&#xff0c;注册到协议栈&#xff0c;在适当的时候&#xff0c;由协议栈自动调用&#xff0c;所以称为回调。 注&#xff1a;除非特别说明&#xff0c;以下内…

linux(6):linux用户和权限

在linux基础命令第五弹中http://t.csdnimg.cn/Fu5cJ我们学到了关于如何查看命令选项的帮助手册&#xff0c;到此&#xff0c;基础命令的学习先告一段落&#xff0c;我们来学习linux有关用户和权限的问题&#xff0c;这是很有必要的&#xff0c;如果任何人都可以修改我们的文件内…

SSL证书验证域名所有权

SSL证书申请时需要进行验证&#xff0c;这是因为SSL证书的主要目的是为了确保网络通信的安全性和数据的完整性。通过验证&#xff0c;证书颁发机构&#xff08;CA&#xff09;可以确认申请者对特定域名或资源的所有权&#xff0c;并确保他们有权使用该证书来加密和保护用户与网…

SpringBoot应用开发指南(01)

目录 引言1. SpringBoot简介1.1 什么是SpringBoot1.1.1 背景1.1.2 优势1.1.3 核心概念 1.1.3 特点 2. SpringBoot入门2. SpringBoot集成MyBatis3. SpringBoot集成PageHelper3.1 什么是PageHelper 通过切面实现分页4. SpringBoot集成Druid总结 引言 在当今软件开发领域&#xf…

外汇天眼:心理素质决定交易成败!

在交易市场中&#xff0c;参与者非常多&#xff0c;成功的却极少。 成功的交易者几乎完全凭借个人的聪明才智&#xff0c;迎难而上&#xff0c;依靠顽强的毅力、坚韧不拔的性格以及冒险精神&#xff0c;战胜自己交易路上的一切挫折。 而这其中交易者的心理素质与其盈亏紧密相关…

el-tree-select 如何使用不规则的数据作为数据来源

el-tree-select 如何使用不规则的数据作为数据来源 在项目中可能使用的 tree 数据并不是那么标准&#xff0c;这样不要紧&#xff0c;只要我们通过 props 指定一下数据结构即可。 比如&#xff0c;项目中的数据结构是这样的&#xff1a; 我们只需要使用 pros 字段指定 tree …

python利用requests库进行接口测试的方法详解

前言 之前介绍了接口测试中需要关注得测试点&#xff0c;现在我们来看看如何进行接口测试&#xff0c;现在接口测试工具有很多种&#xff0c;例如&#xff1a;postman,soapui,jemter等等&#xff0c;对于简单接口而言&#xff0c;或者我们只想调试一下&#xff0c;使用工具是非…

做数据分析为何要学统计学(7)——什么问题适合使用方差分析?

方差分析&#xff08;ANOVA&#xff0c;也称变异数分析&#xff09;是英国统计学家Fisher&#xff08;1890.2.17&#xff0d;1962.7.29&#xff09;提出的对两个或以上样本总体均值进行差异显著性检验的方法。 它的基本思想是将测量数据的总变异&#xff08;即总方差&#xff…

鱼fish数据集VOC+yolo-1400张(labelImg标注)

鱼类&#xff0c;是最古老的脊椎动物。易蓄积重金属。 部分不同染色体数目的杂交的后代依然有生育能力。它们几乎栖居于地球上所有的水生环境&#xff0c;从淡水的湖泊、河流到咸水的大海和大洋。 今天要介绍鱼的数据集。 数据集名称&#xff1a;鱼 fish 数据集格式&#xf…

Python 自动化之修理PDF文件(二)

PDF文件_合并与拆分PDF文档Pro版本 文章目录 PDF文件_合并与拆分PDF文档Pro版本前言一、要做成什么样子二、主要用到的函数三、基本思路1.引入库2.创建用户输入模块3.确定主框架 四、文档合并代码模块1.用户输入和函数调用2.引导用户输入文档信息3.合并文档内容4.命名新文档生成…

python+requests+unittest API接口测试实例(详解)

我在网上查找了下接口测试相关的资料&#xff0c;大都重点是以数据驱动的形式&#xff0c;将用例维护在文本或表格中&#xff0c;而没有说明怎么样去生成想要的用例&#xff0c; 问题&#xff1a; 测试接口时&#xff0c;比如参数a&#xff0c;b&#xff0c;c&#xff0c;我要…

rk3568 RGMII KSZ8795 MAC TO MAC

RK3568与KSZ8795交换机芯片连接&#xff0c;直接MAC TO MAC方式&#xff0c;这样一下就扩展会4路网口&#xff0c;应该场合比较多&#xff0c;移植过程如下&#xff1a; 参考《Rockchip_Developer_Guide_Linux_MAC_TO_MAC_CN.pdf》 《rockchip RGMIImv88e6390 管理型交换机功…

【设计模式--行为型--命令模式】

设计模式--行为型--命令模式 命令模式定义结构案例优缺点使用场景 命令模式 定义 将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行存储&#xff0c;传递&#xff0c;调用…

基于ssm的前后端分离鲜花销售系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本鲜花销售系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

几本学习中整理和面试的PDF,以及精选面试资料

今天和大家分享我在学习过程中整理的笔记&#xff0c;以及我在准备面试中&#xff0c;阅读的PDF&#xff0c;包括Spring Cloud学习手册、Docker学习手册、RabbitMQ学习手册、Spring 6手册、Maven手册、22w字面试手册等等&#xff0c;包括了大部分后端技术以及大部分高频面试题&…

大数据湖体系规划与建设方案:PPT全文51页,附下载

关键词&#xff1a;大数据解决方案&#xff0c;数据湖解决方案&#xff0c;数据数仓建设方案&#xff0c;大数据湖建设规划&#xff0c;大数据湖发展趋势 一、大数据湖体系规划与建设背景 在传统的企业信息化建设中&#xff0c;各个业务系统通常是独立建设的&#xff0c;导致…

【数据结构—栈的实现(数组栈)】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、栈 1.1栈的概念及结构 二、栈的实现 2.1头文件的实现—Stack.h 2.2源文件的实现—Stack.c 2.3源文件的测试—test.c 三、栈的实际测试数据展示 3.1正常的出…