在react-redux应用程序的状态的数据结构中使用didInvalidate属性的目的是什么?

man*_*ain 2 javascript xmlhttprequest reactjs react-redux

我正在学习中间件上的react-redux文档,并且didInvalidatereddit示例中无法理解属性的用途.这似乎是例如经过中间件,让现在店里做API调用开始的过程INVALIDATE_SUBREDDIT然后REQUEST_POSTS再到RECEIVE_POSTS.为什么有INVALIDATE_SUBREDDIT必要?看看下面的操作,我只能猜测,如果用户非常快速地点击"刷新",它会阻止多次抓取.这是这个房产的唯一目的吗?

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))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

dan*_*mux 8

didInvalidate与减少服务器请求有关,但它与防止提取相反.它通知应该去的应用程序并获取新数据; 目前的数据确实"无效".

了解生命周期将有助于进一步解释.Redux用于mapStateToProps帮助确定在全局状态更改时是否重绘Component.

当一个Component即将被重绘时,因为状态(映射到props)发生了变化,所以会componentDidMount被调用.通常,如果状态依赖于远程数据componentDidMount检查以查看状态是否包含远程数据的当前表示(例如,通过shouldFetchPosts).

你是正确的,继续拨打远程电话是没有效率的,但这是shouldFetchPosts防范这一点.一旦获取了所需的数据(!posts为假)或者正在获取所需的数据(isFetching是真的),则检查shouldFetchPosts返回false.

一旦有一组posts状态,那么应用程序永远不会从服务器获取另一组.

但是当服务器端数据发生变化时会发生什么?应用程序通常会提供一个刷新按钮,它(因为组件不应该更改状态)发出一个'Action'(INVALIDATE_SUBREDDIT例如),它被简化为posts.didInvalidate在指示数据现在无效的状态下设置flag().

状态的改变触发了组件重绘,如上所述,shouldFetchPosts它会检查哪些属于return posts.didInvalidate现在执行的子句,从而触发操作REQUEST_POSTS并获取当前服务器端数据.

因此,重申一下:didInvalidate建议需要获取当前服务器端数据.


nic*_*oqh 5

投票最多的答案并不完全正确。

didInvalidate用于告诉应用程序数据是否过时。如果true,则应从服务器重新获取数据。如果false,我们将使用我们已有的数据。

在官方示例中, fireINVALIDATE_SUBREDDIT将设置didInvalidate为 true。此 Redux 操作可以作为用户操作(单击刷新按钮)或其他操作(倒计时、服务器推送等)的结果进行调度。

但是,单独触发INVALIDATE_SUBREDDIT不会向服务器发起新请求。它仅用于确定调用 时是应该重新获取数据还是使用现有数据fetchPostsIfNeeded()

因为didInvalidate设置为true,应用程序不会让我们多次获取数据。要刷新我们的数据(例如在单击刷新按钮后),我们需要:

dispatch(invalidateSubreddit(selectedSubreddit))
dispatch(fetchPostsIfNeeded(selectedSubreddit))
Run Code Online (Sandbox Code Playgroud)

因为我们调用了invalidateSubreddit(),didInvalidate设置为true并且fetchPostsIfNeeded()将启动重新获取。

(这就是为什么 danmux 的答案不完全正确。componentDidMount当状态(映射到道具)发生变化时,生命周期方法不会被调用;componentDidMount只有在组件第一次挂载时才会调用。所以,效果在重新安装组件之前,不会出现点击刷新按钮,例如从路由更改中。)