GraphQL vue apollo查询和变异相同的视图

时间:2017-08-24 04:13:10

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

我刚刚开始将GraphQL与Apollo和Vue一起使用,所以它可能是一个"愚蠢的"问题,但我无法知道该怎么做。

如何在同一视图中执行,查询以获取一个对象,并使用突变更新它

我们说我有一个简单的架构

type Product {
   id: ID!
   title: String!
   description: String
}

和vue组件

<script>

  // GraphQL query
  const ProductQuery = gql `
    query($id: ID){
      Product(id: $id) 
      {
        id
        title
        description
      }
    }
  `;

  const UpdateProductQuery = gql `
    mutation updateProduct($id: ID!, $title: String!, $description: String) {
      updateProduct(
        id: $id,
        title: $title,
        description: $description,
      ) {
        id
      }
    }
  `;

export default {
    data() {
      return {
        Product: {},
      };
    },
    apollo: {
        Product: {
            query: ProductQuery,
            variables() {
                  id: 1234,
           };
        },
    },
    methods: {
        updateProduct() {

          this.$apollo.mutate({
             mutation: UpdateProductQuery,
             variables: {
                id: this.Product.id,
                title: this.Product.title,
                description: this.Product.description,
            },
          })
        }
   }
};
</script>

现在我该怎么写模板部分?我可以将Product对象链接到输入中的v模型吗?

<template>
   <section>
       <input v-model="product.title"></input>
       <input v-model="product.description"></input>
      <button @click="updateProduct">Update</button>
   </section>
</template>

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

你肯定是在正确的轨道上! 我注意到的一件事是Product在你的JS中大写,但在你的模板中没有。所以要么像这样更新你的模板:

<template>
  <section>
    <input v-model="Product.title"></input>
    <input v-model="Product.description"></input>
    <button @click="updateProduct">Update</button>
  </section>
</template>

...或者在你的JS中使product小写(我个人更喜欢)。

另外,我认为在这种情况下您需要使用reactive parametersvariables需要是一个函数而不是一个对象。

variables() {
  return {
    id: this.Product.id,
    title: this.Product.title,
    description: this.Product.description
  }
}

答案 1 :(得分:0)

好的,我终于发现查询中的数据是不可变的,这就是为什么我无法更新它们。

解决方案是使用Object.assign或lodash cloneDeep创建一个新对象。