前面的话

一般地,当模板内容较简单时,使用data选项配合表达式即可。涉及到复杂逻辑时,则需要用到methods、computed、watch等方法。本文将详细介绍Vue实例对象的数据选项
data
data是Vue实例的数据对象。Vue将会递归将data的属性转换为getter/setter,从而让data属性能响应数据变化
[注意]不应该对data属性使用箭头函数
<div id="app">
{{ message }}
</div>
<script>
var values = {message: 'Hello Vue!'}
var vm = new Vue({
el: '#app',
data: values
})
console.log(vm);
</script>
Vue实例创建之后,可以通过vm.$data访问原始数据对象
console.log(vm.$data);
Vue实例也代理了data对象上所有的属性
<script>
var values = {message: 'Hello Vue!'}
var vm = new Vue({
el: '#app',
data: values
})
console.log(vm.$data === values);//true
console.log(vm.message);//'Hello Vue!'
console.log(vm.$data.message);//'Hello Vue!'
</script>
被代理的属性是响应的,也就是说值的任何改变都是触发视图的重新渲染。设置属性也会影响到原始数据,反之亦然
但是,以_或$开头的属性不会被Vue实例代理,因为它们可能和Vue内置的属性或方法冲突。可以使用例如vm.$data._property的方式访问这些属性
<script>
var values = {
message: 'Hello Vue!',
_name: '小火柴'
}
var vm = new Vue({
el: '#app',
data: values
})
console.log(vm._name);//undefined
console.log(vm.$data._name);//'小火柴'
</script>
computed
计算属性函数computed将被混入到Vue实例中。所有getter和setter的this上下文自动地绑定为Vue实例
[注意]不应该使用箭头函数来定义计算属性函数
下面是关于computed的一个例子
<div id="example">
<p>原始字符串: "{{ message }}"</p>
<p>反向字符串: "{{ reversedMessage }}"</p>
</div>
<script>
var vm = new Vue({
el: '#example',
data: {
message: '小火柴'
},
computed: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
})
</script>
结果如下
这里声明了一个计算属性 reversedMessage 。提供的函数将用作属性 vm.reversedMessage 的 getter
console.log(vm.reversedMessage) // -> '柴火小' vm.message = 'Goodbye' console.log(vm.reversedMessage) // -> 'eybdooG'
结果如下图所示,vm.reversedMessage依赖于vm.message的值,vm.reversedMessage本身并不能被赋值
【setter】
计算属性默认只有 getter ,不过在需要时也可以提供一个 setter
<script>
var vm = new Vue({
data: { a: 1 },
computed: {
// 仅读取,值只须为函数
aDouble: function () {
return this.a * 2
},
// 读取和设置
aPlus: {
get: function () {
return this.a + 1
},
set: function (v) {
this.a = v - 1
}
}
}
})
console.log(vm.aPlus);//2
vm.aPlus = 3
console.log(vm.a);//2
console.log(vm.aDouble);//4
</script>
methods
通过调用表达式中的 methods 也可以达到同样的效果
[注意]不应该使用箭头函数来定义methods函数
<div id="example">
<p>原始字符串: "{{ message }}"</p>
<p>反向字符串: "{{ reversedMessage() }}"</p>
</div>
<script>
var vm = new Vue({
el: '#example',
data: {
message: '小火柴'
},
methods: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
})
</script>
【缓存】
对于最终的结果,两种方式确实是相同的
然而,不同的是计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数
相比而言,只要发生重新渲染,method 调用总会执行该函数。如下所示
<div id="example">
<p>计算属性: "{{ time1 }}"</p>
<p>methods方法: "{{ time2() }}"</p>
</div>
<script>
var vm = new Vue({
el: '#example',
computed:{
time1: function () {
return (new Date()).toLocaleTimeString()
}
},
methods: {
time2: function () {
return (new Date()).toLocaleTimeString()
}
}
})
</script>
假设有一个性能开销比较大的的计算属性A,它需要遍历一个极大的数组和做大量的计算。可能有其他的计算属性依赖于 A 。如果没有缓存,将不可避免的多次执行A的getter!如果不希望有缓存,则用 method 替代
watch
Vue提供了一种通用的方式来观察和响应Vue实例上的数据变动:watch属性。watch属性是一个对象,键是需要观察的表达式,值是对应回调函数,回调函数得到的参数为新值和旧值。值也可以是方法名,或者包含选项的对象。Vue实例将会在实例化时调用$watch(),遍历watch对象的每一个属性
[注意]不应该使用箭头函数来定义 watch 函数
<div id="app">
<button @click="a++">a加1</button>
<p>{{ message }}</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
a: 1,
message:''
},
watch: {
a: function (val, oldVal) {
this.message = 'a的旧值为' + oldVal + ',新值为' + val;
}
}
})
</script>
上面代码中,当a的值发生变化时, 通过watch的监控,使message输出相应的内容
【$watch】
除了使用数据选项中的watch方法以外,还可以使用实例对象的$watch方法, 该方法的返回值是一个取消观察函数,用来停止触发回调
<div id="app">
<button @click="a++">a加1</button>
<p>{{ message }}</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
a: 1,
message:''
}
})
var unwatch = vm.$watch('a',function(val, oldVal){
if(val === 10){
unwatch();
}
this.message = 'a的旧值为' + oldVal + ',新值为' + val;
})
</script>
上面的代码中,当a的值更新到10时,触发unwatch(),来取消观察。点击按钮时,a的值仍然会变化,但是不再触发watch的回调函数
以上这篇基于Vue实例对象的数据选项就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# vue
# 实例对象的数据选项
# Vue响应式添加、修改数组和对象的值
# vue.js
# ajax渲染页面的实例
# 解决vue中对象属性改变视图不更新的问题
# vue修改对象的属性值后页面不重新渲染的实例
# 回调
# 值为
# 是一个
# 小火柴
# 遍历
# 给大家
# 所示
# 递归
# 的是
# 都是
# 原始数据
# 还没有
# 也会
# 还可以
# 将会
# 两种
# 其他的
# 会在
# 依赖于
# 也可
相关文章:
魔毅自助建站系统:模板定制与SEO优化一键生成指南
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
视频网站app制作软件,有什么好的视频聊天网站或者软件?
太原网站制作公司有哪些,网约车营运证查询官网?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
零基础网站服务器架设实战:轻量应用与域名解析配置指南
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
无锡营销型网站制作公司,无锡网选车牌流程?
建站之星与建站宝盒如何选择最佳方案?
如何快速搭建响应式可视化网站?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何通过虚拟主机快速搭建个人网站?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
视频网站制作教程,怎么样制作优酷网的小视频?
Python lxml的etree和ElementTree有什么区别
建站org新手必看:2024最新搭建流程与模板选择技巧
建站之星代理如何优化在线客服效率?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
江苏网站制作公司有哪些,江苏书法考级官方网站?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
建站主机服务器选型指南与性能优化方案解析
如何配置FTP站点权限与安全设置?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
小建面朝正北,A点实际方位是否存在偏差?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
建站主机助手选型指南:2025年热门推荐与高效部署技巧
如何快速登录WAP自助建站平台?
如何在自有机房高效搭建专业网站?
如何通过万网虚拟主机快速搭建网站?
如何获取上海专业网站定制建站电话?
如何在IIS7上新建站点并设置安全权限?
家庭服务器如何搭建个人网站?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
香港网站服务器数量如何影响SEO优化效果?
设计网站制作公司有哪些,制作网页教程?
小型网站建站如何选择虚拟主机?
Swift中switch语句区间和元组模式匹配
定制建站模板如何实现SEO优化与智能系统配置?18字教程
如何快速配置高效服务器建站软件?
如何快速选择适合个人网站的云服务器配置?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
如何安全更换建站之星模板并保留数据?
*请认真填写需求信息,我们会在24小时内与您取得联系。