Vue.js-----轻量高效的MVVM框架(五、计算属性)
#基础例子
<div id="dr01">
<h4>#基础例子</h4>
<div>
num01={{num01}}, num02={{num02}}
<p>num01: vm定义的属性,num02:计算出来的属性</p>
</div>
</div>
var dr01 = new Vue({
el: "#dr01",
data: {
num01: 10,
},
computed: {
num02: function() {
return this.num01 * 5;
}
}
})
在js中定义组件dr01,初始化数据num01:10,computed中定义了num02(一个返回值为num01*5的方法)。
在页面中,{{num01}}为我们定义{{num02}}为计算出来的结果:

#计算属性vue.$watch
<div id="dr02">
<h4>#计算属性vue.$watch</h4>
<div>
<span>FirstName01: </span><input type="text" v-model="firstName01" />
<br />
<span>LastName01: </span><input type="text" v-model="lastName01" />
<br />
<span>FullName01: </span><input type="text" readonly="readonly" v-model="fullName01" disabled="disabled" />
</div>
<br />
<div>
<span>FirstName02: </span><input type="text" v-model="firstName02" />
<br />
<span>LastName02: </span><input type="text" v-model="lastName02" />
<br />
<span>FullName02: </span><input type="text" readonly="readonly" v-model="fullName02" disabled="disabled" />
</div>
</div>
var dr02 = new Vue({
el: "#dr02",
data: {
firstName01: "Dark",
lastName01: "Ranger",
fullName01: "Dark Ranger",
firstName02: "Slight",
lastName02: "Wind"
},
computed: {
fullName02: function() {
return this.firstName02 + " " + this.lastName02;
}
}
});
dr02.$watch("firstName01", function(val) {
this.fullName01 = val + " " + this.lastName01;
});
dr02.$watch("lastName01", function(val) {
this.fullName01 = this.firstName01 + " " + val;
});
双向数据绑定的时候我们经常会遇到这样的情况:数据3=数据1+数据2,我们单独更新数据1或者数据2以后,数据3需要实时更新。这里我们有两种解决方案,但是肯定推荐第二种计算属性,为什么,简单!!!
1、在data中定义firstName01: "Dark",lastName01: "Ranger",为了初始化数据的时候fullName01也一样,同样定义fullName01: "Dark Ranger"
为了实时更新数据fullName01,我们需要对firstName01和lastName01进行观察,即加上dr02.$watch语句。
2、在data中定义firstName02: "Slight",lastName02: "Wind",对fullName02我们采用计算属性的方式:把fullName02定义为一个返回值为firstName02+lastName02的方法,这样,当firstName02或者lastName02发生数据变更的时候,fullName02通过计算属性也会发生变化,进行实时更新。
初始化数据

firstname或者lastname数据更新后

#计算setter
上面的例子,我们考虑个问题,是的,当firstname或者lastname数据更新的时候,fullname数据也会更新;但是,当fullname数据发生变化的时候firstname和lastname并不会更新,因为在方式1中我们没有对fullname加入观察,如果加入观察,是可以更新,但是我们要更新10000条数据,也就要写对10000个数据进行观察的$watch方法,这里我们在方式2中对数据fullname加入get和set方法即可。
方式2的gettter和setter
<div id="dr03">
<h4>#计算setter</h4>
<span>FirstName: </span><input type="text" v-model="firstName" />
<br />
<span>LastName: </span><input type="text" v-model="lastName" />
<br />
<span>FullName: </span><input type="text" v-model="fullName" />
</div>
var dr03 = new Vue({
el: "#dr03",
data: {
firstName: "Zhang",
lastName: "Yao"
},
computed: {
fullName: {
get: function() {
return this.firstName + " " + this.lastName;
},
set: function(newValue) {
var names = newValue.split(" ");
this.firstName = names[0];
this.lastName = names[1];
}
}
}
})
初始化数据:

当firstname、lastname、fullname中的一个发生变化的时候,其他数据也会实时更新

完整代码 如下:
<!DOCTYPE html>
<html> <head>
<meta charset="UTF-8">
<script type="text/javascript" src="js/vue.js"></script>
<title>计算属性</title>
</head> <body>
<div id="dr01">
<h4>#基础例子</h4>
<div>
num01={{num01}}, num02={{num02}}
<p>num01: vm定义的属性,num02:计算出来的属性</p>
</div>
</div>
<div id="dr02">
<h4>#计算属性vue.$watch</h4>
<div>
<span>FirstName01: </span><input type="text" v-model="firstName01" />
<br />
<span>LastName01: </span><input type="text" v-model="lastName01" />
<br />
<span>FullName01: </span><input type="text" readonly="readonly" v-model="fullName01" disabled="disabled" />
</div>
<br />
<div>
<span>FirstName02: </span><input type="text" v-model="firstName02" />
<br />
<span>LastName02: </span><input type="text" v-model="lastName02" />
<br />
<span>FullName02: </span><input type="text" readonly="readonly" v-model="fullName02" disabled="disabled" />
</div>
</div>
<div id="dr03">
<h4>#计算setter</h4>
<span>FirstName: </span><input type="text" v-model="firstName" />
<br />
<span>LastName: </span><input type="text" v-model="lastName" />
<br />
<span>FullName: </span><input type="text" v-model="fullName" />
</div>
<script>
var dr01 = new Vue({
el: "#dr01",
data: {
num01: 10,
},
computed: {
num02: function() {
return this.num01 * 5;
}
}
})
var dr02 = new Vue({
el: "#dr02",
data: {
firstName01: "Dark",
lastName01: "Ranger",
fullName01: "Dark Ranger",
firstName02: "Slight",
lastName02: "Wind"
},
computed: {
fullName02: function() {
return this.firstName02 + " " + this.lastName02;
}
}
});
dr02.$watch("firstName01", function(val) {
this.fullName01 = val + " " + this.lastName01;
});
dr02.$watch("lastName01", function(val) {
this.fullName01 = this.firstName01 + " " + val;
});
var dr03 = new Vue({
el: "#dr03",
data: {
firstName: "Zhang",
lastName: "Yao"
},
computed: {
fullName: {
get: function() {
return this.firstName + " " + this.lastName;
},
set: function(newValue) {
var names = newValue.split(" ");
this.firstName = names[0];
this.lastName = names[1];
}
}
}
})
</script>
</body> </html>
Vue.js-----轻量高效的MVVM框架(五、计算属性)的更多相关文章
- Vue.js-----轻量高效的MVVM框架(一、初识Vue.js)
1.什么是Vue.js? 众所周知,最近几年前端发展非常的迅猛,除各种框架如:backbone.angular.reactjs外,还有模块化开发思想的实现库:sea.js .require.js .w ...
- Vue.js-----轻量高效的MVVM框架(二、Vue.js的简单入门)
1.hello vue.js! (1)引入vue.js <script type="text/javascript" src="js/vue.js"> ...
- Vue.js-----轻量高效的MVVM框架(九、组件利用Props传递数据)
#使用props传递数据 html:传递普通的字符串 <h3>#使用props传递数据</h3> <div id="dr01"> <div ...
- Vue.js-----轻量高效的MVVM框架(七、表单控件绑定)
话不多说,先上完整代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- Vue.js-----轻量高效的MVVM框架(十二、组件动态切换)
在写html的过程中,我们经常会遇到要写tabs的切换,类似于这样: 在vue中,我们也有自己的组件和属性来实现这样的效果,这个东西我们叫做动态组件. html: <h3>动态组件< ...
- Vue.js-----轻量高效的MVVM框架(八、使用组件)
什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有 ...
- Vue.js-----轻量高效的MVVM框架(六、Class与Style绑定)
这个相对来说简单,看一遍代码就懂. 一.完整片段: <!DOCTYPE html> <html> <head> <meta charset="UTF ...
- Vue.js-----轻量高效的MVVM框架(四、指令)
Vue指令 指令 (Directives) 是特殊的带有前缀 v- 的特性.指令的值限定为绑定表达式,因此上面提到的 JavaScript 表达式及过滤器规则在这里也适用.指令的职责就是当其表达式的值 ...
- Vue.js-----轻量高效的MVVM框架(三、认识数据绑定)
插值 1.文本插值 (1)双向数据绑定 v-model="msg0101",一旦v-model中的数值发生变化,所有用vue表达式{{msg0101}}的数据都会更新. (2)单次 ...
随机推荐
- PCL—点云分割(基于凹凸性) 低层次点云处理
博客转载自:http://www.cnblogs.com/ironstark/p/5027269.html 1.图像分割的两条思路 场景分割时机器视觉中的重要任务,尤其对家庭机器人而言,优秀的场景分割 ...
- oracle创建数据库的语句
首先 oracle严格来说表空间的概念和数据库的概念很像,为了理解的方便我们,可以把表空间就先当成数据库 我们在安装oracle的服务端的时候默认会安装一些,默认实例 1.建立表空间,现在解释下面语句 ...
- java Iterator类
查看java源码. /* * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE ...
- 《Maven实战》笔记-1-Maven使用入门
<Maven实战>徐晓斌 2011 机械工业出版社 一.介绍 1.名词 artifact:插件 极限编程XP 2.构建脚本: maven——pom.xml(Project Object ...
- [译]Javascript中的递归函数
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- winform播放视频(windows media player)
1.找到windows media player 工具箱常规下边右键,右键弹窗点击“选择项”,选择工具箱窗口点击“COM组件”,找到 Windows Media Player 勾选,点击确定 2.使用 ...
- Delphi和C#数据类型对应表
Delphi DataType C# datatype ansistring string boolean bool byte byte char char comp double currency ...
- 关于执行memcached报错问题
执行#/usr/local/memcached/bin/memcached随后出现如下错误:./memcached: error while loading shared libraries: lib ...
- shell脚本编程的10个最佳实践
摘要:每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.对于那些处在shell脚本编程初级阶段的程序员来说,遵循一些恰当的做法可以帮助你更快.更好的学习这些编程技巧. 每一个在U ...
- loj #6250. 「CodePlus 2017 11 月赛」找爸爸
#6250. 「CodePlus 2017 11 月赛」找爸爸 题目描述 小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对. 小 A 有一套自己的 DNA 序列比较方法,其最终目标是最 ...