首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用redux-toolkit登录createAsyncThunk和编写reducer

使用redux-toolkit登录createAsyncThunk和编写reducer
EN

Stack Overflow用户
提问于 2020-05-26 18:59:55
回答 1查看 1.4K关注 0票数 5

我正在阅读createAsyncThunk文档,对流程感到有点困惑。这是文档中的内容:

代码语言:javascript
复制
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
import { userAPI } from './userAPI'

// First, create the thunk
const fetchUserById = createAsyncThunk(
  'users/fetchByIdStatus',
  async (userId, thunkAPI) => {
    const response = await userAPI.fetchById(userId)
    return response.data
  }
)

// Then, handle actions in your reducers:
const usersSlice = createSlice({
  name: 'users',
  initialState: { entities: [], loading: 'idle' },
  reducers: {
    // standard reducer logic, with auto-generated action types per reducer
  },
  extraReducers: {
    // Add reducers for additional action types here, and handle loading state as needed
    [fetchUserById.fulfilled]: (state, action) => {
      // Add user to the state array
      state.entities.push(action.payload)
    }
  }
})

// Later, dispatch the thunk as needed in the app
dispatch(fetchUserById(123))

我需要在reducersextraReducers中写些什么?标准的reducer逻辑?

我有这个CodeSandbox,我用旧的redux方式实现了它。现在,需要在其中实现redux-toolkit

EN

回答 1

Stack Overflow用户

发布于 2021-04-23 13:56:06

createSlicereducers属性允许您创建一个操作创建器函数,并在一个步骤中响应这些操作。您可以使用extraReducers来响应已在别处创建的操作,例如在异步thunk中。extraReducer只是响应一个动作,而不是创建一个动作创建器函数。

该示例说明,除了extraReducers之外,您还可以拥有一些常规的reducers。但我查看了您的CodeSandbox,在您的情况下,您不需要任何其他reducers,因为您正在响应的唯一操作是来自async thunk的三个操作。

由于您的createSlice不会创建任何操作创建器,因此您实际上不需要使用createSlice。您可以使用它,但也可以只使用createReducer

代码语言:javascript
复制
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
import { userAPI } from './userAPI'

export const fetchUserFromGithub = createAsyncThunk(
  'users/fetch',
  async (username) => {
    const response = await axios.get(
      `https://api.github.com/users/${username}`
    );
    return response.data
  }
)

const usersSlice = createSlice({
  name: 'users',
  initialState: {
    user: null,
    fetchingUser: false,
    fetchingError: null
  },
  reducers: {},
  extraReducers: {
    [fetchUserFromGithub.pending]: (state, action) => {
      state.fetchingUser = true;
      state.fetchingError = null;
    },
    [fetchUserFromGithub.rejected]: (state, action) => {
      state.fetchingUser = false;
      state.fetchingError = action.error;
    }
    [fetchUserFromGithub.fulfilled]: (state, action) => {
      state.fetchingUser = false;
      state.user = action.payload;
    }
  }
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62020623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档