Reactjs Redux saga—如果Redux存储中已经存在数据,则跳过API要求的要点

Reactjs Redux saga—如果Redux存储中已经存在数据,则跳过API要求的要点,reactjs,redux,react-redux,redux-saga,Reactjs,Redux,React Redux,Redux Saga,我正在使用redux saga进行这个项目,我有一个问题要问你。近两天来,我借助谷歌的力量试图找到我的问题的答案,但毫无帮助 我们有一些函数是由saga在每个FETCH_请求操作中触发的 export function* fetchData(action) { try { const usersList = (yield select()).usersList; // makes API call only if there is no users found in the

我正在使用redux saga进行这个项目,我有一个问题要问你。近两天来,我借助谷歌的力量试图找到我的问题的答案,但毫无帮助

我们有一些函数是由saga在每个FETCH_请求操作中触发的

export function* fetchData(action) {
  try {
    const usersList = (yield select()).usersList;

    // makes API call only if there is no users found in the current state
    if(!usersList) {
      const data = yield call(Api.fetchUser)
    }

    yield put({type: "FETCH_SUCCEEDED", usersList})
  } catch (error) {
    yield put({type: "FETCH_FAILED", error})
  }
}
成功后,将触发FETCH_SUCCEED操作,并将收到的数据保存到状态。但在我看来,“是否进行API调用”的决策点并不正确。 当前的方法会导致大量无用的动作的产生,并在传奇中被跳过。如果其他一些传奇订阅了_请求操作,它们会触发另一个无用的操作等等


因此,问题是-检查数据是否需要从API或ReduxStore加载的“最佳实践”位置是什么?

我假设您从组件中分派
获取请求
操作创建者。此组件可能将
userList
作为属性接收。因此,该组件是确定是否应调度
FETCH\u请求
操作的最佳位置

大概是这样的:

class MyComponent extends React.Component {
  componentDidMount() {
    if (!this.props.userList) {
      this.props.fetchData();
    }
  }
}

...

export default connect(mapStateToProps, mapDispatchToProps)(MyComponent);

在这种情况下,您不需要在您的传奇故事中使用选择器和附加条件。

感谢您的回复。我百分之百支持你。只需稍微升级一下,我们就可以使用HOC With loadData()函数触发所有…\u请求操作。在我看来,loadData()是决策的最佳场所。当Saga中当前的决策方法是“反模式”时,你能告诉我一些想法吗?在一个典型的web应用程序中,我们在获取请求操作上设置
加载
标志并显示加载指示器。然后,在FETCH_成功或FETCH_失败时,我们将
加载
标志设置为false。因此,在没有实际获取的情况下调度FETCH_请求操作将导致加载指示器在UI中永久显示。所有事情发生得如此之快,以至于UI和加载程序图标的更新根本不会闪烁。此外,我必须承认,在当前的项目中,我们考虑了<代码>加载< /代码>阶段的数据,如果<代码> ReDux状态< /C>元素是<代码>未定义< /代码>,省略<代码>加载> <代码>标志。这是好的还是坏的做法?你对这个问题陈述有满意的答案吗?我也遇到了同样的问题,不知道该在哪里处理这个案子。我看到了在组件中处理的一些限制,因为可能有很多组件具有这种用例。选择器就是为了这个,但我在某个地方读到过,选择器应该是纯函数,等等。。。