在 react-redux 应用程序状态的数据结构中具有 didInvalidate 属性的目的是什么?
What is the purpose of having a didInvalidate property in the data structure of a react-redux app's state?
我正在从中间件上的 react-redux 文档中学习,但很难理解 reddit 示例中 didInvalidate
属性的用途。似乎该示例通过中间件让商店现在进行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))
}
}
}
您很接近didInvalidate
与减少服务器请求有关,但是它与阻止获取相反。它通知应用程序它应该去获取新数据;当前数据确实"无效"。
了解一些生命周期将有助于进一步解释。Redux 使用mapStateToProps
来帮助决定是否在全局状态更改时重绘组件。
当组件即将被重绘时,例如,由于状态(映射到 props(发生变化,因此调用componentDidMount
。通常,如果状态依赖于远程数据componentDidMount
则检查状态是否包含远程数据的当前表示(例如通过shouldFetchPosts
(。
您是正确的,继续进行远程调用效率低下,但shouldFetchPosts
可以防止这种情况。一旦所需的数据被获取(!posts
为假(或正在获取(isFetching
为真(,则检查shouldFetchPosts
返回假。
一旦有一组posts
处于该状态,那么应用程序将永远不会从服务器获取另一组。
但是,当服务器端数据更改时会发生什么?该应用程序通常会提供一个刷新按钮,该按钮(因为组件不应更改状态(发出"操作"(例如INVALIDATE_SUBREDDIT
(,该操作简化为在指示数据现在无效的状态中设置标志(posts.didInvalidate
(。
状态的更改会触发组件重绘,如前所述,该重绘会检查shouldFetchPosts
哪个属于执行return posts.didInvalidate
子句,现在为 true,因此触发操作以REQUEST_POSTS
并获取当前服务器端数据。
所以重申一下:didInvalidate
建议需要获取当前的服务器端数据。
最多的答案并不完全正确。
didInvalidate
用于告诉应用数据是否过时。如果true
,则应从服务器重新获取数据。如果false
,我们将使用已有的数据。
在官方示例中,触发INVALIDATE_SUBREDDIT
将didInvalidate
设置为 true。此 Redux 操作可以作为用户操作(单击刷新按钮(或其他操作(倒计时、服务器推送等(的结果进行调度。
但是,仅触发INVALIDATE_SUBREDDIT
不会向服务器发起新请求。它仅用于确定我们是否应该重新获取数据或在调用时使用现有数据 fetchPostsIfNeeded()
.
因为 didInvalidate
设置为 true
,该应用程序不会让我们多次获取数据。要刷新我们的数据(例如,在单击刷新按钮后(,我们需要:
dispatch(invalidateSubreddit(selectedSubreddit))
dispatch(fetchPostsIfNeeded(selectedSubreddit))
因为我们调用了invalidateSubreddit()
,所以didInvalidate
设置为true
,fetchPostsIfNeeded()
将启动重新获取。
(这就是为什么 danmux 的答案并不完全正确。当状态(映射到 props(更改时,不会调用生命周期方法componentDidMount
; 仅当组件首次挂载时,才会调用 componentDidMount
。因此,在重新挂载组件之前,点击刷新按钮的效果不会出现,例如从路由更改开始。
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 全局变量和全局对象的属性之间有什么区别吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 序列化数据属性中对象的最可靠方法
- 分析高度属性时出现意外值{{specs.height}}.index.html
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- AngularJS-使用'true'属性
- 可以't使用JavaScript获取width属性
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- JavaScript Pub/Sub属性访问问题
- 从JavaScript访问struts操作中的属性
- 是否可以从父类访问子类的属性
- 如何更改reactjs中外部/独立组件的状态或属性
- 如何在选项卡上定义属性'的主窗口对象
- 锚点元素的href属性自动更改
- jQuery最近父级的数据属性选择器
- 在 react-redux 应用程序状态的数据结构中具有 didInvalidate 属性的目的是什么?