VueJs Ajax数据映射

时间:2019-02-23 20:10:37

标签: javascript ajax vue.js

在Vue页面中,调用了mount()事件时,我使用Ajax调用获取数据。该代码使用一个新的Pager对象重新创建了现有的Pager对象,该对象必须传入构造函数中的所有参数以对其进行重构。

如果我不这样做,则vm.Pager只是一个对象,没有某些所需的方法,并且无法传递它的prop类型检查。

        axios.post("/Home/GetList", vm.Pager)
        .then(function (result)
        {
           var p = result.data.Pager;
           vm.Pager = new Pager(p.PageSize, p.CurrentRecord, p.TotalCount);
           // etc. (Pager has additional fields...)
           vm.ItemList = result.data.ListItems;        
        })
        .catch(function (error)
        {
            alert(error); 
        });

在淘汰表中,有一个映射函数,您可以告诉它要映射什么类型,而不必重新创建对象。这很方便,特别是对于更复杂或嵌套的Ajax数据。

在Vue(或javascript)中,有没有更好的方法可以在其中从Ajax映射类型而不必重新创建它呢?

2 个答案:

答案 0 :(得分:0)

您可以创建自己的映射器功能。

methods: {
  mapTypesToData (responseData, map) {
     responseData.forEach((item, key) => {
       let mapperVal = map[key]
       if (typeof mapperVal === 'string') {
         this.$set(this, map[key], item)
       } else if (typeof mapperVal === 'function') {
         this.$set(this, key, map[key](item))
       }
     })
  }
}

然后在您的ajax请求中

        axios.post("/Home/GetList", vm.Pager)
        .then(function (result)
        {
          this.mapTypesToData(result.data, {
            ItemList: 'ListItems',
            Pager: (p) => new Pager(p.PageSize, p.CurrentRecord, p.TotalCount)
          })      
        })

答案 1 :(得分:0)

我发现我可以使用:

Object.assign(vm.Pager, result.data.Pager);

// import _ from 'lodash'
_.merge(vm.Pager, result.data.Pager);

...而且两者似乎都正确更新了视图模型。不幸的是,当我使用这两种方法时,嵌套的ListPager控件(接收Pager对象)中的watch方法不会触发。

为使其正常工作,在查看本文档VueJs: Reactivity in Depth - Change Detection Caveats之后,我找到了以下解决方案。

 vm.Pager = Object.assign(new Pager(), vm.Pager, result.data.Pager);

这实际上创建了一个新的Pager,但似乎正确填充了它并保留了Vue反应性。希望如果需要,可以扩展到更详细的解决方案。