在 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// 遍历一遍 objObject.keys(obj).forEach(function(key){// 把 obj 的 key 以'.'进行分割,变成数组keys = key.split('.');// val 是 key 对应的值val = obj[key];// data 是 Vue 的 datadata = that.$data;// 遍历一遍前面分割的 keyskeys.forEach(function(key2,index){// 到最后一个 key2 的时候,给 data 添加上 key 和 valif(index+1 == keys.length){that.$set(data,key2,val);}else{// data[key2] 是空,即data的根属性没有key2的时候,给data添加上key2if(!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)
「@浪里淘沙的小法师」
