网站首页 > 技术文章 正文
背景
我们在写vue2项目时,经常会遇到需要重置数据的场景,例如有这样一个组件:
data() {
return {
title: '',
subTitle: '',
author: '',
content: ''
}
},
methods: {
// 调提交数据接口
submit() {
http.post('xxxx', {
// 要提交的一些数据。。。
title: this.title,
subTitle: this.subTitle,
author: this.author,
content: this.content
}).then(res => {
// 提交成功
// 清空数据
this.title = ''
this.subTitle = ''
this.author = ''
this.content = ''
})
}
}
以上代码不仅看着不够优雅,写起来也是相当麻烦,字段少还可以这么写,那要是几十个甚至更多的字段呢?
有人说可以用一个对象把需要重置的字段包起来,像下面这样:
data() {
return {
formData: {
title: '',
subTitle: '',
author: '',
content: ''
}
}
},
methods: {
// 调提交数据接口
submit() {
http.post('xxxx', {
// 要提交的一些数据。。。
...this.formData
}).then(res => {
// 提交成功
// 清空数据
this.formData = {
title: '',
subTitle: '',
author: '',
content: ''
}
})
}
}
看上去好像是优雅一点了,少了几行代码,但也是换汤不换药。那么有没有一种方法可以一行代码重置呢?
答案是:当然有。
我们都知道尤大发布了vue3,与vue2最大的不同就是,vue2被称为选项式(Option)api,vue3被称为组合式(Composition)api。
在vue2中,我们可以通过this关键字来访问当前vue实例的属性和方法,其中有一个特殊的属性,$options
$options的值是个对象{},打印它可以看到内部有一个data(){}函数,也就是我们在组件中声明的data函数,这个函数返回了一些我们自己定义的字段。
那么我们就可以再次调用data这个函数,不就可以拿到初始值了吗?
搜索引擎搜索:“vue2重置数据”。基本上可以得到两种答案:
// 第一种
this.formData = this.$options.data().formData
// 第二种
Object.assign(this.formData, this.$options.data().formData)
// 当然也可以使用
Object.assign(this.$data, this.$options.data())
解释
以上代码解释
vue中:
this.$data 获取当前状态下的data
this.$options.data() 获取该组件初始状态下的data
区别
那么以上两种方法有什么区别呢?
乍一看没区别,运行起来也没区别,实际上在某种场景下是有区别的。
查看MDN,Object.assign(target, ...sources) 方法可以合并两个对象,会改变target本身,如果两个对象中有相同的属性,后面的会覆盖前面的。而且如果后面的对象里新增了一些属性,也会被合并到目标对象。但是第一种方法就不会,而是会完全重置到data最初始的状态,这就是二者的区别。具体使用哪一种还是要看具体场景。
- 上一篇: 两种语言的故事
- 下一篇: 在 Javascript 中复制对象的几种方法
猜你喜欢
- 2024-11-26 深入学习下 null 和 undefined 区别
- 2024-11-26 Javascript ES6新引入的类型Symbol详解以及示例
- 2024-11-26 深入浅出讲解JS中this/apply/call/bind巧妙用法【实践】
- 2024-11-26 一个菜鸟的攻坚系列——__proto__和prototype
- 2024-11-26 NaN你都未必懂,花五分钟让你懂得不能再懂
- 2024-11-26 理解JavaScript中的This,Bind,Call和Apply
- 2024-11-26 Javascript应用-基本类型和引用类型对前端的影响你要了解
- 2024-11-26 JavaScript 基础语法 02
- 2024-11-26 深入探究:null 和 undefined 究竟有何区别?
- 2024-11-26 Js基础1:基本概念
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-