问题描述: 百度小程序s-for绑定的数据为对象时,如果只做展示无操作,没有问题,但是要操作动态获取对应的值时,页面的显示内容顺序会颠倒,官方文档也并没有说明s-for循环不可以绑定对象,但是微信小程序中则没有出现这个错误,因为我的百度小程序项目是从微信小程序项目中的迁移,这里只在百度小程序中更改。
页面结构:
<view class='type_box' s-for="item,index in typeJson">
<view class='title'>{{item.type}}</view>
<view class='type_item'>
<block s-for="item2,index2 in item.val">
<view data-id="{{index}}" data-index="{{index2}}" bindtap="changePro">
{{item2}}
</view>
</block>
</view>
</view>
页面展示为:
比如当我在点击片数选择2片时,片数这一规格会跑到最下面去,但是对应的规则值却是选中了的,so,就是这么神奇,如下图
后端返回的数据类型是一个对象,且相同字段的值也有不同,如typeJson所示,因为项目是从微信小程序的迁移,所以这里前端需要对数据进行处理,转换为数组类型就可以了:
Page({
data: {
typeJson: {
'尺寸/加工方式': { ck: 0, val: { 0: "特大", 2: "小号" } },
'片数': { ck: 0, val: { 0: "1片", 4: "2片" } },
'颜色': { ck: 0, val: ["卡通", "纯白"] }
}
},
onLoad() {
var that = this;
var arrk = [];
var obj = that.data.typeJson;
//将规格数据对象转换为数组格式,因为后端返回的K值是中文字符,这里将其提出;
//type字段为之前对象的K值,val是原对象中val值为对象转换为数组后的值;
Object.keys(obj).forEach((item, index) => {
arrk.push({ type: item, ck: obj[item].ck, val: [], val2: obj[item].val });
});
//循环判断arrk中的val值是否为数组或者对象,如果是对象就转换为数组,如果是数组就直接赋值;
arrk.forEach((item, index) => {
if (that.judgeType(item.val2) == 'Object') {
for (let i in item.val2) {
item.val.push(item.val2[i])
}
} else {
item.val = item.val2
}
})
that.setData({
typeJson: arrk
});
console.log(that.data.typeJson)
},
//判断对象或者数组的方法
judgeType (obj) {
var type = Object.prototype.toString.call(obj);
if (type == '[object Array]') {
return 'Array';
} else if (type == '[object Object]') {
return "Object"
} else {
return '';
}
},
})
转换输出后的typeJson值和val值就是数组类型啦!