react的action中异步操作遇到的问题

最近做了一个需求,就是一个很简单的tabs分页,大致是这个样子

在这里插入图片描述

我想将这个组件更加细化的抽出来做成更加容易扩展的组件,父组件只提供了子组件出现的x,y轴的坐标,其余的数据都由redux控制,虽然这样做过于笨重,但是这是个人尝试,在项目中当然是怎么轻量怎么来。

遇到的问题:
1.我想在页面初始化的时候就走接口获取tabs顶部的按钮名称以及对应的编码,并且利用的这个编码再去请求另一个接口第一次初始化对应的表格,简单来说就是页面初始化的时候需要走两个接口,而且这两个接口必须按照我想要的顺序去执行,然后我是这么做的,贴出代码

这个我想要第一个执行的接口,就是获取tabs各个按钮名称以及编码的接口
在这里插入图片描述

是这是我想要第二个执行的接口在这里插入图片描述
当然按照redux的规范,我们并不能在action中直接操作state,所以想在第一个方法执行结束直接获取state是不行的,那么我们就要考虑怎么让他们按照顺序执行,我的思路是:将第一个方法返回一个promise,然后利用then再来执行第二个函数,当然这一些列操作是在组件中完成的
在这里插入图片描述

以上我只为大家提供一种思路,实现这个需求很简单,但是怎么样实现它最合理,最简洁,大家多多思考
总结:
1、redux的action中可以使用promise来解决异步问题
2、只执行一次的方法或者请求,我们最好放在组件的componentDidMount中,请不要尝试放在getDerivedStateFromProps比较新旧porps或者state,相信我,你可能会让这个请求或者方法执行两次甚至多次,及时你根据一些判断限制了请求次数,也会让你的代码变得难维护

看完以上内容如果对你有所帮助,请给小编一个赞支持一下吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
React Redux Toolkit 提供了一个名为 `createAsyncThunk` 的工具函数来处理异步操作,它可以帮助我们更轻松地编写异步逻辑。 `createAsyncThunk` 的使用非常简单,我们只需要传入两个参数:一个字符串类型的 action 名称和一个异步函数。例如: ```javascript import { createAsyncThunk } from '@reduxjs/toolkit'; export const fetchUserById = createAsyncThunk( 'users/fetchByIdStatus', async (userId, thunkAPI) => { const response = await fetch(`https://jsonplaceholder.typicode.com/users/${userId}`); return response.json(); } ); ``` 在这个例子,我们创建了一个名为 `fetchUserById` 的异步 action,它会发起一个网络请求,然后将返回的数据作为 payload 返回。 当我们调用 `fetchUserById` 时,Redux Toolkit 会自动创建三个 action:`fetchUserById/pending`、`fetchUserById/fulfilled` 和 `fetchUserById/rejected`。这些 action 会根据异步操作的状态分别被触发,我们可以在 reducer 处理它们。 例如,我们可以在 reducer 处理 `fetchUserById/pending` action,将 `loading` 状态设置为 `true`: ```javascript import { createSlice } from '@reduxjs/toolkit'; import { fetchUserById } from './actions'; const userSlice = createSlice({ name: 'user', initialState: { loading: false, user: null, error: null, }, reducers: {}, extraReducers: (builder) => { builder.addCase(fetchUserById.pending, (state) => { state.loading = true; }); builder.addCase(fetchUserById.fulfilled, (state, action) => { state.loading = false; state.user = action.payload; }); builder.addCase(fetchUserById.rejected, (state, action) => { state.loading = false; state.error = action.error.message; }); }, }); export default userSlice.reducer; ``` 在这个例子,我们在 `extraReducers` 处理了三个 action,并根据它们的状态更新了 state。当 `fetchUserById/pending` 被触发时,我们将 `loading` 状态设置为 `true`;当 `fetchUserById/fulfilled` 被触发时,我们将 `loading` 状态设置为 `false`,并将返回的数据保存到 state ;当 `fetchUserById/rejected` 被触发时,我们将 `loading` 状态设置为 `false`,并将错误信息保存到 state 。 需要注意的是,`createAsyncThunk` 返回的是一个 Redux action creator,我们可以像普通的 action creator 一样调用它,并且将返回的 action 传递给 `dispatch` 函数来触发异步操作。例如: ```javascript import { useDispatch } from 'react-redux'; import { fetchUserById } from './actions'; function User(props) { const dispatch = useDispatch(); useEffect(() => { dispatch(fetchUserById(1)); }, [dispatch]); return <div>User Component</div>; } ``` 在这个例子,我们使用 `useDispatch` 钩子获取 `dispatch` 函数,并在 `useEffect` 调用 `fetchUserById` 来触发异步操作。注意,我们传递的参数是 `1`,这是我们要获取的用户的 ID。当异步操作完成时,Redux Toolkit 会自动触发相应的 action,并将返回的数据保存到 state ,我们可以在组件使用 `useSelector` 钩子来获取 state 的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值