v-model的重置(重置data)
最近做一个官网,有一项是地址添加进数组,使用了v-model。通常了v-model的使用都是表单提交跳转的。
这次是本页进行添加到数组。
开始写的时候直接v-model,确定保存push进数组。
第一次完全没问题。第二次打开(或第一次取消)v-model的数据还在且当弹窗内的v-model改变,已经push的数据也跟着改变,这表示他们使用的都是同一内存空间,这个地方需要深拷贝或另一开辟内存空间。
于是搜寻一番,找到这个方法
Object.assign(target,... sources)
复制一个对象
var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
这解决了同一内存空间的问题。push之前先定义一个新的对象,再进行push
let newAdd = Object.assign({}, this.add);
this.addList.push(newAdd);
同理,再用它重置为打开时候的data状态,就可以了
Object.assign(this.$data.add, this.$options.data().add);
还有一种v-model的情景就是mpvue了,mpvue的v-model修改后不变,即使页面已经离开,你再进入v-model的数据也是保留最后的状态和数据。这问题致使很多v-if失效(变化不大的页面我都是v-if判断重复使用)。
在开始的时候我用的是进入或离开分别this.XXX = null || Numbar || ....
现在看可太笨了,而且写漏了还得一个一个找,也苦不堪言。使用Object.assign()可以直接重置data里面的数据。 包活vue的data也一样使用。
Object.assign(this.$data, this.$options.data());
注意
针对深拷贝,需要使用其他办法,因为Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用那么它也只指向那个引用。
参考: developer.mozilla.org/zh-CN/docs/…
9102年了,别在用for...in...了
map()
let givenArr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
console.log(givenArr.toString().split(',').map(v => +v)) // [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]
还可以里面增加排序等等 .sort((x, y) => { return x < y ? -1 : 1 })
这个题之前看到过,留意过答案,太舒服了。
map之前也就看过,最近是在不想for in了
all() {
this.itemArr.map(v => (v.activt = true)); //全选activt = true
// v.activt = !v.activt = true 有选择过的就会唱反调了 全选一个方法
取消一个方法也不是特别好,还没找到更好的方法,先这样吧
this.allActivt = !this.allActivt; if更改css样式
},
旧的做法大概
for(let i in this.itemArr) {
this.itemArr[i].activt = true
...或者做判断if...else
}
这全选虽然做好了,但是这个判断不准确。我自己手动点满了,或者空了一个怎么选择样式?
当然最简单就是for...in,这当然不行。
filter()
var ages = [32, 33, 16, 40];
function checkAdult(age) {
return age >= 18;
}
function myFunction() {
document.getElementById("demo").innerHTML = ages.filter(checkAdult);// 32,33,40
}
这里可以看到,返回age大于18的元素。我们如此类推。
select(index) {
this.itemArr[index].activt = !this.itemArr[index].activt;
let newArr = this.itemArr.filter(item => item.activt != true); ES6 写法
newArr.length == 0 ? (this.allActivt = true) : (this.allActivt = false);
// 长度等于0就是全部都是true,我们就给设置data里的allActivt = true,否则为false
},
可能也写的很菜,但总比for...in好,不是吗。
参考:
map() www.runoob.com/jsref/jsref…
filter() www.runoob.com/jsref/jsref…
Vue的混入
开始写mpvue项目的时候,我就没想转发这事,除了活动诱导谁用转发- -
mpvue默认不显示转发的,得自己调用。
onLoad() {
wx.showShareMenu();//加载时候调用,需要自定义转发更改
}
onShareAppMessage(res) function {} //自定义转发,小程序一样
当时懒,我在全部文件的onLoad增加 wx.showShareMenu();
后面看了一下Vue文档:
混入也可以进行全局注册。使用时格外小心!一旦使用全局混入,它将影响每一个之后创建的 Vue 实例。 使用恰当时,这可以用来为自定义选项注入处理逻辑。
main.js
Vue.mixin({
onLoad() {
wx.showShareMenu(); //全局加载转发 包括data的重置也可以这里写,不过项目较大。就不过多处理。
}
})