Vue Apollo Query 不覆盖本地数据

Posted

技术标签:

【中文标题】Vue Apollo Query 不覆盖本地数据【英文标题】:Vue Apollo Query not overwritting local data 【发布时间】:2019-03-29 13:40:45 【问题描述】:

我有一个使用 import() 动态呈现内容的模式。 modal 有一个表单,它的字段由 Query 填充。数据显示正确。如果我修改数据并关闭模式并返回它,我的更改仍然存在。

因此,几乎就像在组件初始渲染后查询没有运行一样。我想销毁所做的任何更改。

这里是组件

<template>
  <div class="modal-content">

    <loader v-if="$apollo.loading"
      :
      :></loader>

    <div class="modal-header justify-content-center">
      <button type="button"
        class="close"
        @click="closeModal()">
        <i class="nc-icon nc-simple-remove"></i>
      </button>
      <h4 class="title title-up">Edit User</h4>
    </div>

    <div class="modal-body">
      <form>

        <fg-input
          label="Name"
          v-model="user.name"
          v-validate="modelValidations.name"
          :error="getError('name')"
          name="name"
          type="text">
        </fg-input>

        <fg-input
          label="Email"
          v-model="user.email"
          v-validate="modelValidations.email"
          :error="getError('email')"
          name="email"
          type="email">
        </fg-input>

        <fg-input
          label="Role">
          <el-select class="select-default"
                    v-model="user.role"
                    placeholder="Select Role">
            <el-option v-for="option in roles"
                      class="select-default"
                      :value="option.name"
                      :label="option.name"
                      :key="option.name">
            </el-option>
          </el-select>
        </fg-input>

        <fg-input
          label="Active">
          <p-switch v-model="user.active" type="success" on-text="ON" off-text="OFF" ref="active"></p-switch>
        </fg-input>

      </form>
    </div>

    <div class="modal-footer">
      <div class="left-side">
        <p-button type="neutral" @click="validate()">Submit</p-button>
      </div>
      <div class="divider"></div>
      <div class="right-side">
        <p-button type="neutral" @click.native="closeModal()">Close</p-button>
      </div>
    </div>
  </div>
</template>
  //Components
  import Switch from '@/components/UIComponents'

  //Mixins
  import notification from '@/mixins/notification.js'
  import validation from '@/mixins/form-validation.js'
  import userValidation from '@/mixins/users/user-validation.js'

  //Queries
  import editUser from '@/queries/users/edit-user-mutation.gql'
  import users from '@/queries/users/users-query.gql'
  import getUser from '@/queries/users/user-query.gql'
  import getRoles from '@/queries/roles/roles-query.gql'

    export default 
        name: 'edit-user',
        components: 
          [Switch.name]: Switch
        ,
        mixins: [notification, validation, userValidation],
        props: 
          'modalData': 
            required: true
          
        ,
        data()
          return 
            user: 
              id: -1,
              name: '',
              active: false,
              role: '',
              email: ''
            ,
            roles: []
          
        ,
        apollo: 
          user: 
            query: getUser,
            variables() 
              return 
                id: this.modalData
              
            ,
            fetchPolicy: 'cache-and-network',

            //Error
            error(error) 
              console.log(error)
              this.notification('danger', this.messages.error)
            

          ,
          roles: 
            query: getRoles,

            //Error
            error(error) 
              console.log(error)
              this.notification('danger', this.messages.error)
            
          
        ,
        created() 
          console.log('EditUser Created')
        ,
        destroyed() 
          console.log('EditUser Destroyed')
        ,
        methods: 
          submit() 
            this.$apollo.mutate(
              mutation: editUser,
              variables: this.user,
            )
            .then(response => 
              this.notification('success', this.messages.success)
              this.closeModal()
            )
            .catch(error => 
              console.log(error)
              this.notification('danger', this.messages.error)
            )
          ,
          closeModal() 

            //Reset local data
            //this.resetLocal()

            this.$emit('close')

          
        
      

【问题讨论】:

我需要用 Apollo 缓存值覆盖数据属性吗?我可能可以在mounted() 钩子中做到这一点。您可能会认为,由于向组件中添加了查询,因此每次创建组件时都会运行 【参考方案1】:

您可以通过添加created 钩子在每次创建组件时重新获取查询:

created() 
    this.$apollo.queries.user.refetch();

这里,user 是查询的名称,它是您的 apollo: 对象中的标识符。

【讨论】:

以上是关于Vue Apollo Query 不覆盖本地数据的主要内容,如果未能解决你的问题,请参考以下文章

当我在 Vue-apollo 中使用本地状态时如何获取远程 GraphQL 数据

linux安装apollo;以及springcloud采用apollo配置时使用本地配置覆盖;springboot从apollo拉取配置

Vue Apollo 重新获取事件查询

Nuxt 和 Vue Apollo。如何通过重定向到 404/400/500 错误页面来处理 Smart Query 中的错误?我们能捕捉到这样的错误吗?

如何从 vue-apollo 中访问 this.$route?

Vue Apollo 订阅未更新查询