#基础例子

<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. MarkdownPad 2 安装和破解

    MarkdownPad 2 安装和破解 下载:http://markdownpad.com/ 下载下面这个: 破解:http://w3cboy.com/post/2014/10/MarkdownPad ...

  2. bootstrap学习网址

    http://www.bootcss.com/  bootstrap中文学习网址

  3. 基于注解的DI(DI:Dependency Injection 依赖注入)

    注解方式xml里面就不需要注册bean了. 构建注解需要 1.导入spring-aop-4.2.1.RELEASE.jar 包  2.需要更换配置文件头,即添加相应的约束. 现在的Student类就要 ...

  4. [raspberry pi3] zram设置

    linux 3.15之后添加了个和mac一样的功能,内存压缩zram, 之前还有个zswap, zram通常是以模块的方式被放在系统里面的,以便在可以根据需求的不同,定制化加载. raspberry ...

  5. html复杂url提交

    在使用手机向webapi发送照片请求的时候遇到一个问题,关于base64位字符串码无法识别,提交的表单是这样的: <form id="form1" method=" ...

  6. C# Winform欢迎窗体实现()

    方法一.program.cs 中先启动欢迎窗体,然后注册程序运行空闲去执行主程序窗体相应初始化代码 static void Main(string[] args) { Application.Enab ...

  7. 【2】循序渐进学 Zabbix:安装配置 Zabbix Server 服务端

    上一篇 [1]循序渐进学 Zabbix :初识与基础依赖环境搭建( LNMP ) 安装 Zabbix Server 上篇我们在 192.168.200.101 上面安装了 Zabbix 所依赖的 LN ...

  8. UWP&WP8.1 基础控件—Button

    Button作为最常用的控件,没有特别难的用法,是一个非常简单,可以很快就掌握的控件. Button 基础用法: 同样,在UWP项目中,可以从工具箱中拖拽到面板中进行使用.也可以使用XAML语法进行编 ...

  9. 安卓手机牛逼软件Termux中安装Archlinux,安装Jdk

    说出来你可能不信,手机上居然装了两个linux系统,和真实的linux有些许些差别. 首先安装了Termux以后你发现,好多linux常用功能都有,什么Pyhton,gcc,g++,ruby,Php, ...

  10. linux文件系统相关资料

             linux下文件系统通常是通过虚拟文件系统(VFS)蔽下层具体文件系统操作的差异,为上层的操作提供一个统一的接口.文件系统底层都是用系统IO缓存层提供的块读写接口,实现逻辑块到物理块 ...