我使用的是graphql、Vue.js和apollo
这是我的数据库
const sensorsdb = [
{
name: "sensor 1",
id: "s-1",
timestamp: 1582021371,
value: 100
},
{
name: "sensor 1",
id: "s-1",
timestamp: 1579451703,
value: 150
},
{
name: "sensor 2-1",
id: "s-2-1",
timestamp: 1582021371,
value: 200
},
{
name: "sensor 2-2",
id: "s-2-2",
timestamp: 1579451703,
value: 350
},
{
name: "sensor 2-2",
id: "s-2-2",
timestamp: 1582021371,
value: 300
},
{
name: "sensor 3",
id: "s-3",
timestamp: 1582021371,
value: 400
},];
我想根据对象id获取所有对象。sensorId是一个数组。因为我想获取具有多个id的多个对象。
下面是我用来获取对象的API函数。
async getDataById({ sensorId }) {
let sensorsData = [];
for (let i = 0; i < sensorId.length; i++) {
let sensorData = this.sensorDataStore.sensors.filter(sensor => sensor.id === sensorId[i]);
sensorsData = sensorsData.concat(sensorData);
}
return sensorsData;
}
在前端,gql文件如下:
query sensorData($id: [String]){
sensorData(id: $id){
name
id
value
timestamp
}}
使用vue.js中的apollo查询代码,在本例中selectedSensorId为[“s-2-1”,“s-2-2”]
<ApolloQuery :query="require('../graphql/sensorDataById.gql')" :variables="{ id: selectedSensorId }">
<template v-slot="{ result: { loading, error, data } }">
<b-loading :is-full-page=true :active.sync=loading :can-cancel="false"/>
<div v-if="error">
<no-data-error />
</div>
<div v-if="data">
{{ data }}
<bar-chart-view :sensorInfo="data.sensorData"/>
</div>
</template>
</ApolloQuery>
但我得到了如下不同的结果:具有正确结果的GraphqlPlayground重复传感器的前端结果-s-2 x1c 0d1x
2条答案
按热度按时间qv7cva1a1#
Apollo Client根据文档中描述的
id
和__typename
字段对结果进行规范化。如果数组返回多个具有相同id
的项,默认情况下它们将共享相同的缓存键,这意味着客户端返回的将是同一个对象。您应该为
InMemoryCache
构造函数提供一个自定义的dataIdFromObject
函数,以适应您的特定用例。请注意,如果在其他地方使用相同的类型,可能会遇到该高速缓存在发生变化后正确更新的问题,因为我们现在同时关闭了
value
和id
。甚至更好
zd287kbt2#
我知道这已经有一段时间了,但正如丹尼尔Rearden上面提到的,我将
{ addTypename: false }
作为InMemoryCache的选项