Vuejs2 组件不会随着父数据的更改而更新
Vuejs2 component not updating as parent data changes
我正在尝试使用 vuejs2 制作一个简单的产品目录。
我所有的数据都存储在一个对象数组中,然后我有这个数据的一个子集,这是产品目录用来显示每个 product.The 子集用于分页的内容。
当用户切换页面时,它会清除并将下一组数据推入数组。
这会自动使产品组件显示新数据。
我遇到以下问题,每个产品都有多种颜色,这些颜色存储为逗号分隔的字符串,例如(白色、蓝色、红色)
我试图让该信息显示为每个产品旁边的选项下拉列表。
这一直有效,直到我切换到下一页数据,所有其他细节都会更新,除了颜色下拉菜单,它只反映上一组数据。
我的产品列表存储在一个对象数组中,例如:
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 的应用程序部分中,我有以下方法进行分页:
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 组件中,在其 "data" 部分中,它拆分了颜色数据,returns 它作为 colourOption 组件进入 select,但不会t 在 paginatedArray 更改时更新。
然而,colourSelect 组件似乎确实传递了正确的数据,因为 getID 方法正确更新。它只是没有重新运行的数据部分。
这是我的第一个 vuejs 站点,有人对此有任何想法吗?
谢谢
你应该将 colourArray
作为一个计算 属性,因为组件的 data
块只执行一次,以后的 props 更改不会更新 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;
}
}
});
我正在尝试使用 vuejs2 制作一个简单的产品目录。
我所有的数据都存储在一个对象数组中,然后我有这个数据的一个子集,这是产品目录用来显示每个 product.The 子集用于分页的内容。
当用户切换页面时,它会清除并将下一组数据推入数组。
这会自动使产品组件显示新数据。
我遇到以下问题,每个产品都有多种颜色,这些颜色存储为逗号分隔的字符串,例如(白色、蓝色、红色)
我试图让该信息显示为每个产品旁边的选项下拉列表。
这一直有效,直到我切换到下一页数据,所有其他细节都会更新,除了颜色下拉菜单,它只反映上一组数据。
我的产品列表存储在一个对象数组中,例如:
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 的应用程序部分中,我有以下方法进行分页:
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 组件中,在其 "data" 部分中,它拆分了颜色数据,returns 它作为 colourOption 组件进入 select,但不会t 在 paginatedArray 更改时更新。
然而,colourSelect 组件似乎确实传递了正确的数据,因为 getID 方法正确更新。它只是没有重新运行的数据部分。
这是我的第一个 vuejs 站点,有人对此有任何想法吗?
谢谢
你应该将 colourArray
作为一个计算 属性,因为组件的 data
块只执行一次,以后的 props 更改不会更新 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;
}
}
});