#基础例子

<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框架(五、计算属性)的更多相关文章

  1. Vue.js-----轻量高效的MVVM框架(一、初识Vue.js)

    1.什么是Vue.js? 众所周知,最近几年前端发展非常的迅猛,除各种框架如:backbone.angular.reactjs外,还有模块化开发思想的实现库:sea.js .require.js .w ...

  2. Vue.js-----轻量高效的MVVM框架(二、Vue.js的简单入门)

    1.hello vue.js! (1)引入vue.js <script type="text/javascript" src="js/vue.js"> ...

  3. Vue.js-----轻量高效的MVVM框架(九、组件利用Props传递数据)

    #使用props传递数据 html:传递普通的字符串 <h3>#使用props传递数据</h3> <div id="dr01"> <div ...

  4. Vue.js-----轻量高效的MVVM框架(七、表单控件绑定)

    话不多说,先上完整代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  5. Vue.js-----轻量高效的MVVM框架(十二、组件动态切换)

    在写html的过程中,我们经常会遇到要写tabs的切换,类似于这样: 在vue中,我们也有自己的组件和属性来实现这样的效果,这个东西我们叫做动态组件. html: <h3>动态组件< ...

  6. Vue.js-----轻量高效的MVVM框架(八、使用组件)

    什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有 ...

  7. Vue.js-----轻量高效的MVVM框架(六、Class与Style绑定)

    这个相对来说简单,看一遍代码就懂. 一.完整片段: <!DOCTYPE html> <html> <head> <meta charset="UTF ...

  8. Vue.js-----轻量高效的MVVM框架(四、指令)

    Vue指令 指令 (Directives) 是特殊的带有前缀 v- 的特性.指令的值限定为绑定表达式,因此上面提到的 JavaScript 表达式及过滤器规则在这里也适用.指令的职责就是当其表达式的值 ...

  9. Vue.js-----轻量高效的MVVM框架(三、认识数据绑定)

    插值 1.文本插值 (1)双向数据绑定 v-model="msg0101",一旦v-model中的数值发生变化,所有用vue表达式{{msg0101}}的数据都会更新. (2)单次 ...

随机推荐

  1. JavaPersistenceWithHibernate第二版笔记-第七章-002Mapping an identifier bag(@CollectionId、@ElementCollection、@CollectionTable、@Type)

    一.结构 A bag is an unordered collection that allows duplicate elements, like the java.util.Collection ...

  2. MySQL介绍与安装

    mysql介绍 #mysql就是一个基于socket编写的C/S架构的软件 #客户端软件 mysql自带:如mysql命令,mysqldump命令等 python模块:如pymysql 数据库管理软件 ...

  3. SpringMVC执行流程(四)

    DispatcherServlet 组建的默认配置 HandlerMapping有这两种:BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping Handl ...

  4. 【zookeeper】

    window下安装zookeeper三结点集群: 1:解压缩zookeeper压缩包:复制三分并且命名成:Server_A   Server_B  Server_C 2:拷贝conf目录下的文件zoo ...

  5. 基于C#局域网语音聊天

    基​于​C​#​局​域​网​语​音​聊​天​室​,​可​实​现​文​本​消​息​的​发​送​.​接​收​及​语​音​聊​天​,​是​一​个​很​不​错​的​,​适​合​初​学​者​的​软​件​开​发​ ...

  6. FileStream流读取

    using (FileStream fread = new FileStream(@"C:\Users\kyp10\Desktop\1.复.avi", FileMode.OpenO ...

  7. c++类 用冒号初始化对象(成员初始化列表)

    c++类 用冒号初始化对象(成员初始化列表) 成员初始化的顺序不同于它们在构造函数初始化列表中的顺序,而与它们在类定义中的顺序相同 #include<iostream> ; using n ...

  8. LAMP之Mysql源码配置安装

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RD ...

  9. Oracle修改监听IP地址

    oracle 11g断网安装时,没有检测net的功能,所以安装完后,netstat -an 发现自动监听的是127.0.0.1:1521,这样安装完成后,其他的主机根本无法连接,是什么原因呢? 排错后 ...

  10. DP【洛谷P2295】 MICE

    P2295 MICE S国的动物园是一个N*M的网格图,左上角的坐标是(1,1),右下角的坐标是(N,M). 小象在动物园的左上角,它想回到右下角的家里去睡觉,但是动物园中有一些老鼠,而小象又很害怕老 ...