簡體   English   中英

在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來幫助決定在全局狀態更改時是否重繪Component。

當一個Component即將重繪時,因為狀態(映射到props)會發生變化,所以會調用componentDidMount 通常,如果狀態依賴於遠程數據componentDidMount檢查以查看狀態是否包含遠程數據的當前表示(例如,通過shouldFetchPosts )。

你是正確的,繼續進行遠程調用是低效的,但是這是shouldFetchPosts它的shouldFetchPosts 一旦獲取了所需的數據( !posts為false)或者它正處於被提取的過程中( isFetching為true),則檢查shouldFetchPosts將返回false。

一旦狀態中有一組posts ,那么應用程序將永遠不會從服務器獲取另一組。

但是當服務器端數據發生變化時會發生什么? 該應用程序通常會提供一個刷新按鈕,它(因為組件不應該更改狀態)發出一個'Action'(例如INVALIDATE_SUBREDDIT ),它被簡化為設置一個標志( posts.didInvalidate ),指示數據是現在無效。

在狀態變化觸發部件重繪,正如所提到的,將檢查shouldFetchPosts其落入執行該子句return posts.didInvalidate現在是真實的,因此燒制到動作REQUEST_POSTS和獲取當前的服務器端數據。

因此,重申didInvalidatedidInvalidate建議需要獲取當前服務器端數據。

投票最多的答案並不完全正確。

didInvalidate用於告訴應用程序數據是否過時。 如果為true ,則應從服務器重新獲取數據。 如果為false ,我們將使用我們已有的數據。

在官方示例中,觸發INVALIDATE_SUBREDDIT會將didInvalidate設置為true。 可以通過用戶操作(單擊刷新按鈕)或其他內容(倒計時,服務器推送等)調度此Redux操作

但是, 單獨觸發INVALIDATE_SUBREDDIT不會向服務器發起新請求 它僅用於確定在調用fetchPostsIfNeeded()時是否應重新獲取數據或使用現有數據。

由於didInvalidate設置為true ,因此應用程序不會讓我們多次獲取數據。 要刷新我們的數據(例如,點擊刷新按鈕后),我們需要:

dispatch(invalidateSubreddit(selectedSubreddit))
dispatch(fetchPostsIfNeeded(selectedSubreddit))

因為我們調用了invalidateSubreddit()didInvalidate設置為truefetchPostsIfNeeded()將啟動重新獲取。

(這就是為什么danmux的答案是不完全正確的生命周期方法。 componentDidMount不會被調用時的狀態(這是映射到道具)的變化; componentDidMount只調用時首次組件坐騎所以,。在重新安裝組件之前,不會出現點擊刷新按鈕的效果,例如路線更改。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM