在 React 中,使用 setState({a:1})
改变 a 的值
在微信小程序中,使用 setData({a:1})
改变 a 值
- 官方文档:官方文档链接)
在 Vue 中,使用 this.a=1
改变 a 的值
- 官方文档:官方文档链接
在 uniapp 中,因为底层使用的是 Vue,写法上当然是和 Vue 相同了,但使用者常常更习惯用微信小程序的写法—— setDate
,于是就有了“让 Vue 支持 setData 写法”
网上特别流行的一个函数如下,现在就来看一看它的原理是什么
function setData(obj){
let that = this;
let keys = [];
let val,data;
Object.keys(obj).forEach(function(key){
keys = key.split('.');
val = obj[key];
data = that.$data;
keys.forEach(function(key2,index){
if(index+1 == keys.length){
that.$set(data,key2,val);
}else{
if(!data[key2]){
that.$set(data,key2,{});
}
}
data = data[key2];
})
});
}
function setData(obj){
let that = this;
let keys = [];
let val,data
// 遍历一遍 obj
Object.keys(obj).forEach(function(key){
// 把 obj 的 key 以'.'进行分割,变成数组
keys = key.split('.');
// val 是 key 对应的值
val = obj[key];
// data 是 Vue 的 data
data = that.$data;
// 遍历一遍前面分割的 keys
keys.forEach(function(key2,index){
// 到最后一个 key2 的时候,给 data 添加上 key 和 val
if(index+1 == keys.length){
that.$set(data,key2,val);
}else{
// data[key2] 是空,即data的根属性没有key2的时候,给data添加上key2
if(!data[key2]){
that.$set(data,key2,{});
}
}
// 一层一层递进
data = data[key2];
})
});
}
它的运行效果类似这样
输入如下:
setData({
'a.b.c':1,
'd.e':2,
'f':3
})
运行效果如下:
// this指向Vue实例
this.$set(this.$data.a.b,c,1)
this.$set(this.$data.d,e,2)
this.$set(this.$data,f,3)
「@浪里淘沙的小法师」