【发布时间】:2022-01-13 03:22:06
【问题描述】:
如何将 React 上下文中的内容传递到我的 Redux Saga 函数中?
我有一个上下文值,我可以用类似这样的东西在反应组件中检索它
const { connectionObject } = useMyContext();
这将允许我从上下文中获取 connectionObject 实例。
不过,我还在我的应用程序的其他一些部分使用了 redux saga。这些 redux sagas 之一将需要使用上下文中的 personObject。
由于 Redux-Sagas 本身在技术上只是常规的生成器函数,因此我不能在其中使用 useMyContext() 来检索 connectionObject。例如,这是行不通的
export function* saveData() {
const { connectionObject } = useMyContext(); // This will not work
yield performSaveSomething(connectionObject);
}
Redux Saga 是由我从 react 组件中调度 redux 操作触发的。一种可能的解决方法当然是从 react 组件的上下文中获取 connectionObject,然后使用 connectionObject 作为有效负载的一部分分派操作,然后将其传递给 saga。但这感觉完全是反模式并且并不优雅,尤其是当有效载荷应该更新到状态但在这种情况下仅用于传递给 saga 时。下面是一个例子来说明尴尬:
// In the React component
export const myReactComponent = (props) => {
const { connectionObject } = useMyContext();
dispatch(saveDataAction({
data: 'some data here to be put in the redux store',
connection: connectionObject
}));
}
// In the reducer
function reducer (state, action) {
switch (action.type) {
case SAVE_DATA_ACTION_TYPE:
// action.payload has 2 attributes in this case: data and connection
// But I am throwing away the connection one here in this reducer because that is only meant for the saga. Feels weird here.
return {
...state,
data: action.payload.data. // Instead of using the whole payload, I've to use only the "data" attribute of the payload because only this mattered to the store. I can't use the whole payload because it has the connectionObject in there. Doesn't look elegant.
}
}
}
// And finally in the saga function
export function* saveData({ payload: { connection } }) {
// Good thing here is I could finally access the connectionObject which came from the react context
// However, it's also doesn't seem right that I'm passing the connectionObject through the payload which isn't a piece of data but as a dependency
yield performSaveSomething(connection);
}
有没有一种方法可以优雅而轻松地传递从 React 上下文中检索到的值,并以某种方式将其传递给我的 Redux-Saga 函数以便它可以使用它?
【问题讨论】:
-
两个旁注:首先,基于那个 reducer 示例,看起来您正在“手动”编写 Redux 逻辑。我们强烈建议改用our official Redux Toolkit package,这将大大简化您的 Redux 代码。其次,我们实际上建议反对在大多数用例中使用 saga。它们是复杂异步工作流的绝佳工具,但大多数 Redux 应用不需要它们——尤其是对于基本的数据获取场景。
-
@markerikson 感谢您的提示!只是想知道,对于大多数用例,您建议使用什么来代替 saga?那会是 redux thunk 吗?
-
是的,我们通常建议使用 thunk 作为 API 调用的标准方法,或者我们新的 RTK 查询数据获取 API。请参阅the "Redux Essentials" docs tutorial 了解这两种情况的示例。
标签: javascript reactjs redux redux-saga react-context