【问题标题】:How to implement a working Graphql query in Vue with Apollo?如何使用 Apollo 在 Vue 中实现有效的 Graphql 查询?
【发布时间】:2018-06-24 03:46:06
【问题描述】:

有人可以帮助我使用 scaphold.io 处理我的第一个查询吗?

当我使用内部 GraphiQL 向我的 scaphold 查询以下内容时:

query AllPrograms {
  viewer {
    allPrograms{
      edges {
        node {
          id
          name
        }
      }
    }
  }
}

返回是这样的:

{
  "data": {
    "viewer": {
      "allPrograms": {
        "edges": [
          {
            "node": {
              "id": "UHJvZ3JhbTo2",
              "name": "Blender"
            }
          },
          {
            "node": {
              "id": "UHJvZ3JhbTo1",
              "name": "Inkscape"
            }
          },

          ...

我的组件如下所示:

<template>
  <md-card>
    <span class="md-headline">Programma's</span>
    <span class="md-headline">{{ allPrograms }}</span>
  </md-card>
</template>


<script>
import gql from 'graphql-tag'
import config from '../../config/client'

const log = console.log

const allPrograms = gql `
  query AllPrograms {
    viewer {
      allPrograms{
        edges {
          node {
            id
            name
          }
        }
      }
    }
  }
`

export default {
  props: [],
  data () {
    return {
      allPrograms: '',
    }
  },
  // Apollo GraphQL
  apollo: {
    // Local state 'posts' data will be updated
    // by the GraphQL query result
    allPrograms: { // <-- THIS allPrograms IS THE CAUSE OF THE ERROR!
      // GraphQL query
      query: allPrograms,
      // Will update the 'loading' attribute
      // +1 when a new query is loading
      // -1 when a query is completed
      loadingKey: 'loading',
    },
  }
}
</script>

我得到的错误是:结果中缺少 allPrograms 属性

我还读到了一些看起来像是正确 json-result 的一部分的内容:object: viewer: {allPrograms: Object, __typename: "Viewer"}

或者我可能误解了什么。我想我已经接近接收数据了,甚至可能已经成功了,但是拆分似乎需要一些额外的小心。

有什么想法吗?

【问题讨论】:

  • 您是否尝试将“allPrograms”命名为其他名称?我没有太多 Vue-appolo 经验,但你有一个变量和一个名为 allPrograms 的 appolo 属性,这可能会产生奇怪的行为。
  • 没有消除错误,但感谢您的建议,我现在知道 allProgramsapollo: 部分的声明是导致 Missing allPrograms 属性的原因结果错误。 (用评论标记。)这是什么意思?我没有正确初始化或解决它吗?

标签: javascript vue.js graphql apollo vue-apollo


【解决方案1】:

似乎vue-apollo 期望在服务器发送的响应中的data 下找到与您在阿波罗定义中设置的密钥匹配的密钥。换个试试

apollo: {
   allPrograms: { ... }
} 

通过

apollo: {
   viewer: { ... }
} 

你的错误消失了,但这可能不是你想要的。

改为在查询定义中添加update 选项以更改数据集。假设你想要allPrograms的内容:

apollo: {
    allPrograms: {
        query: allPrograms,
        loadingKey: 'loading',
        update: function(data) {
            return data.viewer.allPrograms;

            // or if you just want the leaf objects
            return data.viewer.allPrograms.edges.map(function(edge) {
                return edge.node;
            });
        }
    },
}

【讨论】:

  • 它有效,我现在检索 json 并返回 data.viewer.allPrograms.edges。它的形状是[ { "node": { "id": "UHJvZ3JhbTo2", "name": "Blender", "__typename": "Program" }, "__typename": "ProgramEdge" }, { "node": { "id": "UHJvZ3JhbTo1", "name": "Inkscape", "__typename": "Program" }, "__typename": "ProgramEdge" }, ...。如何将其过滤为仅 {"id": ..., "name": ...}?或者停止过度获取。欢迎任何想法,我当然会奖励你。
  • 我也收到 404(未找到)错误。不知道它以前是否在那里。
  • @Code-MonKy 我添加了数据的重新映射。为避免遍历数据,您可以设置一个新的查询服务器端来解析您想要的内容,但您必须在 scaphold.io 中挖掘以了解如何做到这一点。至于 404 错误,恐怕是来自其他地方。
  • 谢谢,我稍后会查看。是的,当我想清理结果时,我将不得不在 scaphold 的文档中进一步挖掘。我确信那里解决了过度获取问题。无论如何,对于漂亮的界面进行快速原型设计的好东西。
猜你喜欢
  • 2019-04-06
  • 2017-02-25
  • 2021-01-01
  • 2020-03-21
  • 1970-01-01
  • 2021-04-19
  • 2019-06-13
  • 2020-08-20
  • 2016-11-30
相关资源
最近更新 更多