React与Redux Toolkit的简单使用、ts环境中一些常见问题的解决方案

本文介绍了如何利用create-react-app创建一个集成Redux Toolkit、typescript的React应用,无需额外安装redux、redux-thunk等库。通过示例详细展示了如何创建子reducer、使用异步方法,并配置store,以及在React组件中使用这些功能。同时,文章提到了在TS环境中遇到的常见问题,如npm包类型问题和非代码资源导入,并给出了解决方案。

安装

创建react+redux的TS环境(最佳实践) 无须再安装redux、redux-thunk、react-redux、immer等,默认就已经集成了@reduxjs/toolkit的Redux架构。

create-react-app react-admin --template redux-typescript

使用Redux Toolkit完成react的状态管理

demo效果演示如下
在这里插入图片描述

生成一个子reducer (createAsyncThunk, createSlice)

/**
 src/store/test/testSlice.ts

*/
import {
   
    createAsyncThunk, createSlice } from '@reduxjs/toolkit';
// 异步请求
import {
   
    fetchIp } from './testAPI';

// 设置类型
export interface testState {
   
   
  value: number;
  ip: object
}
// 设置初始化state
const initialState: testState = {
   
   
  value: 1,
  ip:{
   
   }
};

// createAsyncThunk这个API可以用来设置异步方法,我们可以通过这个API来让redux支持异步。
export const getIpAsync = createAsyncThunk(
  'test/fetchIp',
  async () => {
   
   
    const response = await fetchIp();
    console.log(response)
    return response.data;
  }
);

export const testSlice = createSlice({
   
   
  name: 'test',
  initialState,
  // The `reducers` field lets us define reducers and generate associated actions
  reducers: {
   
   
    increment: (state) => {
   
   
      // Redux Toolkit允许我们在reduce中编写“突变”逻辑.  
      //它实际上不会改变状态,因为它使用Immer库, 
      //检测到“派遣状态”的变化,并产生一个全新的基于这些变化的不可变状态
      state.value 
<think>好的,我需要帮助用户了解如何在React使用Redux Toolkit进行异步操作,特别是使用asyncThunk的教程和示例。首先,我应该回忆一下Redux Toolkit的基本概念,特别是createAsyncThunk的用法。 用户已经提到他们参考了一些引用内容,其中提到了安装步骤和一些基本用法。所以,我需要结合这些引用来构建回答,同时确保符合系统级指令,比如正确使用LaTeX格式和生成相关问题。 首先,我应该解释asyncThunk的作用。createAsyncThunkRedux Toolkit中的一个函数,用于处理异步操作,比如API调用。它生成三个action types:pending、fulfilled和rejected,分别对应异步操作的不同阶段。 接下来,需要给出一个具体的示例,展示如何定义asyncThunk,如何在slice中使用extraReducers处理这些action,以及如何在组件中使用dispatch触发异步操作。同时,要确保代码示例正确,比如使用TypeScript的类型定义,这可能有助于用户理解。 然后,我应该检查是否需要涉及其他相关概念,比如配置store时使用configureStore,以及如何将slice添加到store中。不过用户的问题主要集中在异步操作上,所以可能不需要详细展开store的配置,但可能需要简要提及。 另外,根据引用中的内容,用户可能已经安装了必要的依赖,比如@reduxjs/toolkitreact-redux,所以安装步骤可能不需要重复,但可以简要提及以确保完整性。 在生成相关问题部分,需要考虑用户可能进一步想了解的内容,比如错误处理、UI库的集成、性能优化等。这些问题应该异步操作相关,帮助用户扩展他们的知识。 需要确保回答结构清晰,分步骤解释,并且代码示例正确。同时,注意引用标记的正确使用,比如在提到安装步骤时引用对应的引用源。 最后,检查LaTeX格式是否正确,所有行内数学表达式使用$...$,独立公式单独成段,虽然在这个回答中可能用不上数学表达式,但如果有涉及的话需要正确应用。不过在这个主题下,可能更多是代码示例,所以LaTeX可能不适用,但需要确保代码块正确使用反引号格式。</think>### React Redux-Toolkit asyncThunk 使用教程 在 Redux Toolkit 中,`createAsyncThunk` 是处理异步操作的核心 API。它简化了异步 action 的创建过程,并自动生成三种状态(pending/fulfilled/rejected)的 action type[^5]。以下是具体实现步骤: --- #### 1. 定义异步 Thunk 使用 `createAsyncThunk` 定义异步操作: ```typescript // features/todo/todoSlice.ts import { createAsyncThunk } from '@reduxjs/toolkit'; export const fetchTodos = createAsyncThunk( 'todos/fetchTodos', // action type 前缀 async (userId: string) => { const response = await fetch(`https://api.example.com/todos?userId=${userId}`); return await response.json(); // 返回值作为 payload } ); ``` --- #### 2. 在 Slice 中处理异步状态 通过 `extraReducers` 监听异步状态,并更新 store: ```typescript // features/todo/todoSlice.ts import { createSlice } from '@reduxjs/toolkit'; const todoSlice = createSlice({ name: 'todo', initialState: { todos: [], isLoading: false, error: null }, reducers: {}, extraReducers: (builder) => { builder .addCase(fetchTodos.pending, (state) => { state.isLoading = true; state.error = null; }) .addCase(fetchTodos.fulfilled, (state, action) => { state.isLoading = false; state.todos = action.payload; }) .addCase(fetchTodos.rejected, (state, action) => { state.isLoading = false; state.error = action.error.message || 'Failed to fetch todos'; }); } }); export default todoSlice.reducer; ``` --- #### 3. 在组件中触发异步操作 通过 `useDispatch` 触发异步操作,并通过 `useSelector` 获取状态: ```tsx // components/TodoList.tsx import { useDispatch, useSelector } from 'react-redux'; import { fetchTodos } from '../features/todo/todoSlice'; import { RootState } from '../app/store'; const TodoList = () => { const dispatch = useDispatch(); const { todos, isLoading, error } = useSelector((state: RootState) => state.todo); useEffect(() => { dispatch(fetchTodos('user123')); // 触发异步请求 }, [dispatch]); if (isLoading) return <div>Loading...</div>; if (error) return <div>Error: {error}</div>; return ( <ul> {todos.map(todo => <li key={todo.id}>{todo.text}</li>)} </ul> ); }; ``` --- #### 4. 配置 Store(参考) 确保 store 配置正确(已安装 `@reduxjs/toolkit` 和 `react-redux`[^3][^4]): ```typescript // app/store.ts import { configureStore } from '@reduxjs/toolkit'; import todoReducer from '../features/todo/todoSlice'; export const store = configureStore({ reducer: { todo: todoReducer, }, }); export type RootState = ReturnType<typeof store.getState>; export type AppDispatch = typeof store.dispatch; ``` --- ### 关键点说明 - **自动生成的 Action Types**:`fetchTodos.pending`、`fetchTodos.fulfilled`、`fetchTodos.rejected` 由 `createAsyncThunk` 自动生成。 - **错误处理**:在 `extraReducers` 中通过 `rejected` 状态捕获错误。 - **TypeScript 支持**:通过泛型可定义 payload 类型(例如 `createAsyncThunk<Todo[], string>`)。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值