基于Vue实例对象的数据选项


Posted in Javascript onAugust 09, 2017

前面的话

一般地,当模板内容较简单时,使用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实例对象的数据选项

Vue实例创建之后,可以通过vm.$data访问原始数据对象

console.log(vm.$data);
基于Vue实例对象的数据选项

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实例代理,因为它们可能和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>

结果如下

基于Vue实例对象的数据选项

这里声明了一个计算属性 reversedMessage 。提供的函数将用作属性 vm.reversedMessage 的 getter

console.log(vm.reversedMessage) // -> '柴火小'
vm.message = 'Goodbye'
console.log(vm.reversedMessage) // -> 'eybdooG'

结果如下图所示,vm.reversedMessage依赖于vm.message的值,vm.reversedMessage本身并不能被赋值

基于Vue实例对象的数据选项

【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>
基于Vue实例对象的数据选项

假设有一个性能开销比较大的的计算属性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实例对象的数据选项就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS保留小数点(四舍五入、四舍六入)实现思路及实例
Apr 25 Javascript
javascript中验证大写字母、数字和中文
Jan 15 Javascript
jquery动态改变form属性提交表单
Jun 03 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
Jul 21 Javascript
Javascript 高阶函数使用介绍
Jun 15 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
Aug 07 Javascript
EasyUI 结合JS导出Excel文件的实现方法
Nov 10 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
Feb 19 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
Apr 24 Javascript
ES6学习之变量的两种命名方法示例
Jul 18 Javascript
详解webpack babel的配置
Jan 09 Javascript
JavaScript canvas实现跟随鼠标事件
Feb 10 Javascript
react-native之ART绘图方法详解
Aug 08 #Javascript
jQuery Easyui Treegrid实现显示checkbox功能
Aug 08 #jQuery
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 #jQuery
EasyUI的TreeGrid的过滤功能的解决思路
Aug 08 #Javascript
angular+ionic返回上一页并刷新页面
Aug 08 #Javascript
微信小程序movable view移动图片和双指缩放实例代码
Aug 08 #Javascript
原生JS+Canvas实现五子棋游戏
May 28 #Javascript
You might like
杏林同学录(八)
2006/10/09 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
js实现表格筛选功能
2017/01/18 Javascript
bootstrap weebox 支持ajax的模态弹出框
2017/02/23 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
Python 3中的yield from语法详解
2017/01/18 Python
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
matplotlib 纵坐标轴显示数据值的实例
2018/05/25 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
python实现远程控制电脑
2019/05/23 Python
python实现最小二乘法线性拟合
2019/07/19 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
2020/02/25 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
《都江堰》教学反思
2014/02/07 职场文书
读书演讲主持词
2014/03/18 职场文书
2014年妇委会工作总结
2014/12/10 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
新学期开学寄语2016
2015/12/04 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android
Win11 21h2可以升级22h2吗?看看你的电脑符不符合要求
2022/07/07 数码科技