如何使用Redux Sagas加载单个对象?

问题描述 投票:0回答:1

我一直在使用redux和sagas进行React项目。到目前为止,我已经能够创建一个结构,在该结构中,我的组件将调度一个请求列表的操作,然后sagas采取此操作并调用一个将请求发送到后端的函数。然后,我将该列表存储在redux上,并且我的组件从redux读取列表。

现在,我需要从后端加载单个对象。我曾考虑过不对该请求使用sagas,但我想使用sagas进行此请求并将此单个对象存储在redux上是有意义的。

我不知道如何使rootSaga函数接受以'id'作为参数的函数。

为了说明情况,下面是一些代码:

这是根传奇函数,它将发出API请求并调用操作以存储在redux上

export function* loadEvent({ id: number }) {
  try {
    console.log('load single event');

    yield put(loadEventSuccess(event));
  } catch (err) {
    yield put(loadFailure());
  }
}

这是rootSaga函数,应该可以获取我调度的动作并触发我的saga函数。问题在于它不接受我使用参数调用该函数。即使可以,我也不知道如何将参数传递给它。

export default function* rootSaga() {
  return yield all([
    takeLatest(EventsTypes.LOAD_EVENT_REQUEST, loadEvent),
  ]);
}

当然,在从功能组件中分派所有动作之前。

使我感到困惑的另一件事是,如果我一直使用的方法还可以。我可以从我的功能组件发出此请求,并以其状态存储数据。这样我就不会涉及redux或sagas。这有意义吗?

javascript reactjs redux react-redux redux-saga
1个回答
0
投票

您的方法是完全正确的,因为您应该尝试使每个api调用都抛出错误,但您只是犯了一个小错误

function* loadEvent({ payload }) {
const { id } = payload;
  try {
    const response = yield call(api.get, `localhost:4000/api/${id}`);
    yield put(loadEventSuccess(event));
  } catch (err) {
    yield put(loadFailure());
  }
};

您也不需要导出生成器函数,在我的示例中,我正在使用axios模拟api get调用。并且不要忘记import { call } from "redux-saga/effects";

© www.soinside.com 2019 - 2024. All rights reserved.