2016-11-04 199 views
2

我剛剛開始在React應用程序上使用apollo客戶端,並且我停留在緩存中。 我有一個主頁,其中包含查詢產品的ID和名稱以及查詢ID,名稱,說明和圖像的產品頁面的產品列表。Apollo客戶端緩存

我想,如果用戶訪問主頁的拳頭,然後一個特定的產品頁面只做該產品的描述和圖像的查詢,也顯示加載過程中的名稱(因爲我應該已經緩存它)。 我遵循文檔(http://dev.apollodata.com/react/cache-updates.html)的「控制商店」部分,但仍無法解決問題。

當我們進入產品頁面時,完成的查詢仍然要求產品的ID和名稱,而他們應該被緩存,因爲我已經要求他們。

我想我失去了一些東西,但我無法弄清楚。 這裏有點代碼:

// Create the apollo graphql client. 
const apolloClient = new ApolloClient({ 
    networkInterface: createNetworkInterface({ 
     uri: `${process.env.GRAPHQL_ENDPOINT}` 
    }), 
    queryTransformer: addTypename, 
    dataIdFromObject: (result) => { 
     if (result.id && result.__typename) { 

      console.log(result.id, result.__typename); //can see this on console, seems okey 
      return result.__typename + result.id; 
     } 

     // Make sure to return null if this object doesn't have an ID 
     return null; 
    }, 
}); 

// home page query 
// return an array of objects (Product) 
export default graphql(gql` 
    query ProductsQuery { 
     products { 
      id, name 
     } 
    } 
`)(Home); 

//product page query 
//return an object (Product) 
export default graphql(gql` 
    query ProductQuery($productId: ID!) { 
     product(id: $productId) { 
      id, name, description, image 
     } 
    } 
`,{ 
    options: props => ({ variables: { productId: props.params.id } }), 
    props: ({ data: { loading, product } }) => ({ 
     loading, 
     product,}) 
})(Product); 

我的控制檯輸出:

console output

回答

3

的回答你的問題實際上有兩個部分:

  1. 客戶端不能實際上確實告訴這些查詢解析爲緩存中的同一對象,因爲它們具有不同的路徑。一個以products開頭,另一個以product開頭。對於客戶端解析器,有一個open PR,即使您沒有明確查詢它們,它也可以讓您提供有關在緩存中查找內容的位置的客戶端提示。我希望我們會在一兩週內發佈該功能。

  2. 即使使用客戶端解析器,Apollo客戶端也不會完全按照上面所述進行操作,因爲Apollo客戶端自0.5版以來不再執行查詢區分。相反,所有查詢現在都是完全靜態的。這意味着即使您的查詢部分位於緩存中,完整查詢也會發送到服務器。這在blog post中有很多優點。

通過在選項中設置returnPartialData: true,您仍然可以首先顯示緩存中的零件。

+1

要給出答案的第1點的更新:這件事已經可用:http://dev.apollodata.com/react/cache-updates.html#cacheRedirect –

+0

我相信'returnPartialData'不再存在,相反,您必須按照這裏實現兩個查詢,一個摘要和一個完整的查詢:http://dev.apollodata.com/react/migration.html#returnPartialData –