如何使用Redux传奇加载单个对象



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

现在我需要从后端加载一个对象。我想过不使用sagas来处理这个请求,但我想使用sagas并将这个对象存储在redux上是有意义的。

我不知道如何让rootSaga函数接受以"id"为参数的函数

为了挫败这种情况,这里有一些代码:

这是根传奇函数,它会发出API请求并调用该操作以存储在redu

export function* loadEvent({ id: number }) {
try {
console.log('load single event');
yield put(loadEventSuccess(event));
} catch (err) {
yield put(loadFailure());
}
}

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

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

当然,在此之前,我从我的功能组件发出了一个操作。

另一件让我困惑的事情是,我一直使用的方法是否可以。我可以从我的功能组件发出这个请求,并将数据存储在它的状态中。通过这样做,我既不会涉及redux也不会涉及sagas。这有道理吗?

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

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";

相关内容

最新更新