man*_*ain 2 javascript xmlhttprequest reactjs react-redux
我正在学习中间件上的react-redux文档,并且didInvalidate
在reddit示例中无法理解属性的用途.这似乎是例如经过中间件,让现在店里做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)
您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
建议需要获取当前服务器端数据.
投票最多的答案并不完全正确。
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
只有在组件第一次挂载时才会调用。所以,效果在重新安装组件之前,不会出现点击刷新按钮,例如从路由更改中。)
归档时间: |
|
查看次数: |
945 次 |
最近记录: |