在 vueJs 中修改使用 Apollo GraphQL 获取的属性

Posted

技术标签:

【中文标题】在 vueJs 中修改使用 Apollo GraphQL 获取的属性【英文标题】:Modifying properties fetched with Apollo GraphQL in vueJs 【发布时间】:2018-12-14 00:15:45 【问题描述】:

我希望使用 javascript Moment 库格式化通过 Apollo-GraphQL 获取的日期。我在客户端使用 VueJS Apollo 来进行 graphQL 查询:

import  ALL_EVENTS  from '../constants/graphql.js'
import Event from './Event'
import moment from 'moment'

export default 
  name: 'EventList',
  data: () => (
      events: [],
      loading: 0
    ),
  apollo: 
    events: ALL_EVENTS
  ,
  components: 
    Event
  ,

apollo 中间件返回一个包含 id、name、startDate(UTC 格式字符串)的对象列表 和 endDate(也是 UTC 格式的字符串)属性,以及 apollo 添加的其他属性供其使用。

每当我尝试使用 Apollo 的对象列表在 VueJS 中创建一个计算属性时,它都会给我一个只读错误,但在我看来我正在创建一个新对象:

  computed: 
    eventsFormatted: function () 
      var out = this.events
      for (var i in out) 
        out[i].startDate = moment(out[i].startDate)
        out[i].endDate = moment(out[i].endDate)
      
      return out
    
  

我需要做什么来复制我可以修改的数组?

【问题讨论】:

【参考方案1】:

当您执行var out = this.events 时,out 变量现在指向与this.events 相同的对象数组。

因此,如果this.events 是只读的,则需要制作数组的副本,如果数组中的每个对象都是只读的,则还需要制作每个对象的副本。

这是一个使用spread operator 复制数组和对象的示例:

computed: 
  eventsFormatted() 
    let out = [...this.events];
    for (let i in out) 
      let item = ...out[i];
      item.startDate = moment(item.startDate);
      item.endDate = moment(item.endDate);
      out[i] = item;
    
    return out;
  

上面对数组中的每个对象进行了浅拷贝。如果因为this.events、see this post的结构需要做深拷贝。

【讨论】:

以上是关于在 vueJs 中修改使用 Apollo GraphQL 获取的属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django、GraphQL、Apollo 和 VueJS 进行 URL 管理

VueJS 在渲染数据之前等待 Apollo

使用 Apollo 和 Vuejs 的反应式查询定义

身份验证Apollo Graphql for android

Apollo 客户端向错误的 uri 发送请求

我应该直接使用 Apollo 数据还是在 Redux 存储中保存/修改它?