随着父数据的更改,Vuejs2组件未更新

时间:2017-02-27 03:54:55

标签: vuejs2

我正在尝试使用vuejs2创建一个简单的产品目录。

我的所有数据都存储在一个对象数组中,然后我有一个数据的子集,这是产品目录用来显示每个产品的部分。该子集用于分页。

当用户切换页面时,它会清除并将下一组数据推送到数组中。

这会自动使产品组件显示新数据。

我遇到以下问题,每个产品都有多种颜色,存储为逗号分隔的字符串,例如(白色,蓝色,红色)

我正在努力使这些信息显示为每个产品旁边的选项下拉列表。

这一直有效,直到我切换到下一页数据,所有其他细节都会更新,但颜色下拉除外,它只反映上一组数据。

我的产品列表存储在对象数组中,如:

 var obj = {
           productID: productID,
           product: title,
           gender: gender,
           colour: colour,
           cost: cost,
           size: size,
           description: description
          }
  productArray.push(obj);

然后我有几个组件显示这个数据数组:

Vue.component('product-list', {
 template: '<ul id="productList">'+
        '<product :productID="product.productID" v-for="product in products">'+
        '<h4>Colour</h4><colourSelect :colours="product.colour" :productID="product.productID"></colourSelect>' +
        '<h4>Gender</h4><span class="genderSpan"><p v-bind:id="getID(product.productID)">{{product.gender}}</p></span>' +

    '</product></ul>',
data: function() {
    return {
        products:
          paginatedArray

    };
},

Vue.component('colourSelect', {
 props: ['productID', 'colours'],
 template: '<select  v-bind:id="getID()" class="form-control input-xs"><colourOption v-for="colourItem in colourArray"></colourOption></select>',
data: function () { //split string based into array
    var newArray = [];
    var optionsArray = this.colours.split(',');


    for (i = 0; i < optionsArray.length; i++) {
        var obj = {
            colour: optionsArray[i]
        }
        newArray.push(obj)
    }
    return {
        colourArray: newArray

    };
},
methods: {
    getID: function (test) {
        return 'colourSelect' + this.productID;
    }
  }
});

Vue.component('colourOption', {
 props:['options'],
 template: '<option><slot></slot></option>'
});

在vuejs的app部分中,我有以下方法进行分页:

        buildPages: function () {

        for (i = 1; i < this.listLength() /this.totalPage ; i++) {
            this.pages.push(i);
        }
        var page = this.currentPage * this.totalPage;

        for (i = page; i < page +  this.totalPage ; i++) {
            paginatedArray.push(productArray[i]);
        }


    },
    listLength: function () {
        var listTotal = productArray.length;
        return listTotal
    },
    changePage: function (number) {
        this.currentPage = number
        var page = this.currentPage * this.totalPage;
        //paginatedArray = [];

        var count = 0;
        for (i = page; i < page + this.totalPage ; i++) {
            if (typeof productArray[i] !== 'undefined') {
                paginatedArray.splice(count, 1, productArray[i])
            }

            count++
        }
    },

productArray是存储数据的主要数组,paginatedArray是产品组件处理的数据子集。

问题似乎在colourSelect组件中,在其“数据”部分中,它会分割颜色数据并将其作为colourOption组件返回到select中,但在paginatedArray更改时不会更新。

然而,当getID方法正确更新时,colourSelect组件似乎实际上传递了正确的数据。它只是没有重新运行的数据部分。

这是我的第一个vuejs网站,任何人对此有什么想法?

由于

1 个答案:

答案 0 :(得分:0)

您应该将colourArray作为计算属性,因为组件的data块只执行一次,以后更改道具不会更新colourArray

Vue.component('colourSelect', {
  props: ['productID', 'colours'],
  template: '<select  v-bind:id="getID()" class="form-control input-xs"><colourOption v-for="colourItem in colourArray"></colourOption></select>',
  computed:{
    colourArray: function () { //split string based into array
      var newArray = [];
      var optionsArray = this.colours.split(',');


      for (i = 0; i < optionsArray.length; i++) {
         var obj = {
            colour: optionsArray[i]
        }
        newArray.push(obj)
      }
      return newArray
  }
},
methods: {
    getID: function (test) {
        return 'colourSelect' + this.productID;
    }
  }
});