2017-08-16 66 views
1

我试图使用update:在执行突变后更新查询。问题是,商店中的查询有几个不同的变量应用,我想更新查询并返回相同的变量。Apollo无法在更新中访问queryVariables:突变后

我在文档中发现updateQueries有一个选项来包含查询变量,这是最后执行查询的一组变量。

我还没有找到任何描述如何从更新内部检索queryVariables或类似的东西。

内更新:我可以用

lastQuery = Object.keys(store.data.ROOT_QUERY).slice(-1)[0] 

将返回像"userRecipes({"first":20,"minTime":0,"maxTime":500,"filterType":"Explore","searchTerm":""})"

的哈克的方式,我现在正在做的这个就是解析字符串中拉出的变量,所以我的结果终于可以用readQuery像这样:

 const lastQuery = Object.keys(store.data.ROOT_QUERY).slice(-1)[0] 
     const searchPosition = lastQuery.search("searchTerm") 
     const searchTerm = lastQuery.slice((searchPosition + 13),-3) 

     // also parsing the lastQuery string for filterType, minTime, maxTime 

     const data = store.readQuery({ 
     query: QUERY_USER_RECIPES, 
     variables: { 
       filterType: filterType, 
       searchTerm: searchTerm, 
       minTime: minTime, 
       maxTime: maxTime, 
     } 
     }); 

这不可能做到这一点的最好办法。有更简单的方式来访问更新内的变量吗?

似乎应该有一种方法来读取存储中的现有查询和变量,而不用readQuery传递变量。

感谢您看看这个问题!

版本

[email protected] [email protected]

回答

0

阿波罗2,而应该在1.x中

In the docs相同,你会发现你也可以将变量传递给readQuery。

下面是一个例子,用户可以预订点击BookEvent组件的事件,如果突变成功,它会自动反映在上面的组件EventDetail中。

在这种跳跳虎突变(BookEvent),我通过storeeventId在上部件(EventDetail)声明的函数,并通过子组件的道具通过组件:

const onClick =() => createEventTicketMutation({ 
    variables: { eventId: event.id }, 
    update: (store, { data: { createEventTicket } }) => { 
    updateStoreAfterBooking(store, event.id) 
    }, 
}) 

这里是功能,在所述上部部件执行高速缓存更新:

const updateCacheAfterBooking = (store, eventId) => { 
    const data = store.readQuery({ 
    query: EVENT_DETAIL_QUERY, 
    variables: { id: eventId }, 
    }) 
    data.eventDetail.bookings += 1 
    store.writeQuery({ 
    query: EVENT_DETAIL_QUERY, 
    variables: { id: eventId }, 
    data, 
    }) 
} 

它被传递像这样<BookEvent updateStoreAfterBooking={updateCacheAfterBooking} ... />

不要忘记还要将所需的变量传递给writeQuery。