如何组织或重用Redux应该获取*动作?

时间:2016-01-18 08:10:34

标签: reactjs redux

在redux document中,它们提供了一种操作方法来防止重新获取现有数据。

像这样:

function receivePosts(subreddit, json) {
  return {
    type: RECEIVE_POSTS,
    subreddit,
    posts: json.data.children.map(child => child.data),
    receivedAt: Date.now()
  }
}

function fetchPosts(subreddit) {
  return dispatch => {
    dispatch(requestPosts(subreddit))
    return fetch(`http://www.reddit.com/r/${subreddit}.json`)
      .then(req => req.json())
      .then(json => dispatch(receivePosts(subreddit, json)))
  }
}

function shouldFetchPosts(state, subreddit) {
  const posts = state.postsBySubreddit[subreddit]
  if (!posts) {
    return true
  } else if (posts.isFetching) {
    return false
  } else {
    return posts.didInvalidate
  }
}

export function fetchPostsIfNeeded(subreddit) {
  return (dispatch, getState) => {
    if (shouldFetchPosts(getState(), subreddit)) {
      return dispatch(fetchPosts(subreddit))
    }
  }
}

我知道该方法可以阻止再次获取。

但是,如果我有更多api,我需要编写更多函数来判断获取情况。

这样会使我的代码更复杂,更难维护。

是否有人建议将shouldfetch*IfNeeded / shouldFetch* / fetch*合并以使其更具可重复性?

1 个答案:

答案 0 :(得分:0)

我推荐Sebastian Markbage(其中一个React开发者)发表这篇文章:https://www.youtube.com/watch?v=4anAwXYqLG8

除非有可能避免错误,否则基本信息不是为了避免重复代码而不是抽象的。

在这种情况下,<hr width="1" size="100" style="position: absolute; left: 30px; top: 30px; border:1px solid #717171;z-index:20" > 类型函数非常简单 - 它是一个纯函数,它接受存储状态,并进行简单检查以查看状态是否有效,并返回一个布尔值

在我看来,真的没有抽象。您可以假设您的所有异步状态都具有此形状:

shouldUpdatestate.<asnycPartOfState>.isFetching

但是试图将其抽象出来似乎没有多大用处,并且限制了API的灵活性(约定优于配置)。虽然我认为惯例有时很好,但在这种情况下,我认为它不会提供很多价值。

有时候你的状态会像state.<asnycPartOfState>.didInvalidate这样的数组,有时它只会是postsBySubreddit[<userID>]这样的单个对象。然后它可能还需要user,甚至可能_.findWhere(postsBySubreddit, { _id: <someID> })

在这种情况下,我认为最好通过避免抽象来使代码易于遵循和阅读,直到您发现需要它为止。