目录

一、计算属性

1.基本使用

2.复杂使用

3.getter和setter

4.计算属性和methods的对比

二、侦听器

1.watch的用法


一、计算属性

1.基本使用

​ 现在有变量姓氏和名字,要得到完整的名字。

   <div id="app"><h2>您的firstname:{{firstName}}</h2><h2>您的lastname:{{lastName}}</h2><h2>您的fullname是从计算属性中得到:{{fullName}}</h2><h2>您的fullname是从方法中得到:{{getFullName()}}</h2></div><script>Vue.config.productionTip = false;  //阻止 vue 在启动时生成生产提示。const vm = new Vue({el: '#app',data(){return{firstName:'zhang',lastName:'san'}},methods: {getFullName(){return this.firstName + this.lastName}},computed:{//计算属性 一定要有一个返回值 在页面中渲染时是不需要加小括号的fullName(){return this.firstName + this.lastName}}})</script>

使用Mastache语法拼接<h2>{{firstName}}{{lastName}}</h2>

使用方法methods<h2>{{getFullName()}}</h2>

使用计算属性computed<h2>{{fullName}}</h2>

例子中计算属性computed看起来和方法似乎一样,只是方法调用需要使用(),而计算属性不用,方法取名字一般是动词见名知义,而计算属性是属性是名词,但这只是基本使用。

2.复杂使用

现在有一个数组数据books,里面包含许多book对象,数据结构如下:

books:[{id:110,name:"JavaScript从入门到入土",price:119}, {id:111,name:"Java从入门到放弃",price:80},{id:112,name:"编码艺术",price:99},{id:113,name:"代码大全",price:150},]

​ 要求计算出所有book的总价格totalPrice

<div id="app"><h2>您的总价:{{totalPrice}}</h2></div><script>const vm = new Vue({el: '#app',data() {return {books: [{id: 110,name: "JavaScript从入门到入土",price: 119},{id: 111,name: "Java从入门到放弃",price: 80},{id: 112,name: "编码艺术",price: 99},{id: 113,name: "代码大全",price: 150},]}},computed: {/* totalPrice() {let total = 0for (let i = 0; i < this.books.length; i++) {total += this.books[i].price}return total} *//* totalPrice() {let total = 0for (let index in this.books) {total += this.books[index].price}return total} *//* totalPrice() {let total = 0;for(let item of this.books){total += item.price}return total} *//* totalPrice() {let total = 0;this.books.forEach(item=>{total += item.price})return total} *//* map *//* totalPrice() {let total = 0;this.books.map(item=>{total += item.price})return total} *//* filter *//* totalPrice() {let total = 0;this.books.filter(item=>{total += item.price})return total} *//* reduce *//* totalPrice() {return this.books.reduce((total,item)=>{return total + item.price },0)} *//* totalPrice() {return this.books.reduce((total,item)=>total + item.price,0)} *//* some */totalPrice() {let total = 0;this.books.some(item=>{total += item.price})return total}}})</script>

​       获取每一个book对象的price累加,当其中一个book的价格发生改变时候,总价会随之变化。

3.getter和setter

​ 在计算属性中其实是由这样两个方法setter和getter。

​ 但是计算属性一般没有set方法,只读属性,只有get方法,但是上述中newValue就是新的值,也可以使用set方法设置值,但是一般不用。

       <div id="app"><input type="text" v-model="firstName"/><br><input type="text" v-model="lastName"/><br><input type="text" v-model="fullName"/><!-- v-model实现数据的双向绑定 --><!-- 2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data。备注:1.双向绑定一般都应用在表单类元素上(如:input、select等)2.v-model:value 可以简写为 v-model,因为v-model默认收集的就 是value值。 --></div><script>const vm = new Vue({el: '#app',data() {return {firstName: 'zhang',lastName: 'san'}},computed: { //计算属性 一定要有一个返回值 在页面中渲染时是不需要加小括号的/* fullName(){return this.firstName + this.lastName} */fullName: {get: function() {return this.firstName +','+ this.lastName},set:function(val){var list = val.split(',')console.log(list);this.firstName = list[0]this.lastName = list[1]}} }})</script>

通过这种方式,我们可以在改变计算属性值的同时也改变和计算属性相关联的属性值。

4.计算属性和methods的对比

       <div id="app"><h2>您的fullname是从计算属性中得到:{{fullName}}</h2><h2>您的fullname是从计算属性中得到:{{fullName}}</h2><h2>您的fullname是从计算属性中得到:{{fullName}}</h2><h2>您的fullname是从计算属性中得到:{{fullName}}</h2><h2>您的fullname是从方法中得到:{{getFullName()}}</h2><h2>您的fullname是从方法中得到:{{getFullName()}}</h2><h2>您的fullname是从方法中得到:{{getFullName()}}</h2><h2>您的fullname是从方法中得到:{{getFullName()}}</h2></div><script>const vm = new Vue({el:'#app',data(){return {firstName:'zhang',lastName:'san'}},methods:{getFullName(){console.log('这里调用了方法getFullName');return this.firstName + this.lastName}},computed:{//计算属性 一定要有一个返回值 在页面中渲染时是不需要加小括号的fullName(){console.log('这里调用了计算属性fullName');return this.firstName + this.lastName}}})/* 总结:计算属性的性能是优于方法的 因为计算属性是具有缓存特性的 */</script>

​ 由此可见计算属性有缓存,在this.firstName + " " + this.lastName的属性不变的情况下,methods调用了四次,而计算属性才调用了一次,性能上计算属性明显比methods好。而且在改动firstName的情况下,计算属性只调用一次,methods依然要调用4次。

二、侦听器

1.watch的用法

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Vue计算属性/侦听器/方法比较</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script></head><body><div id="app"><h1>计算属性:computed</h1>{{fullName}}<h1>方法:methods</h1>{{fullName2()}}<h1>侦听器:watch</h1>{{watchFullName}}<h1>年龄</h1>{{age}}</div><script>var other = 'This is other';var app = new Vue({el:"#app",data:{firstName:"zhang",lastName:"san",watchFullName:"zhangsan",age:18,},watch: {firstName:function(newFirstName, oldFirstName){console.log("firstName触发了watch,newFirstName="+newFirstName+",oldFirstName="+oldFirstName)this.watchFullName = this.firstName+this.lastName+","+other},lastName:function(newLastName, oldLastName){console.log("lastName触发了watch,newLastName="+newLastName+",oldLastName="+oldLastName)this.watchFullName = this.firstName+this.lastName+","+other}  },computed: {fullName:function(){console.log("调用了fullName,计算了一次属性")return this.firstName+this.lastName+","+other;}},methods: {fullName2:function(){console.log("调用了fullName,执行了一次方法")fullName2 = this.firstName+this.lastName+","+other;return fullName2;}}});</script></body></html>

初始化:

修改firstName/lastName/两者都修改

修改computed中没计算的age

修改Vue实例外的对象

修改Vue实例外对象后在修改Vue实例内的对象

测试结论:

  1. 使用computed计算了fullName属性,值为firstName+lastName。计算属性具有缓存功能,当firstName和lastName都不改变的时候,fullName不会重新计算,比如我们改变age的值,fullName的值是不需要重新计算的。
  2. methods并没有缓存特性,比如我们改变age的值,fullName2()方法会被执行一遍。
  3. 当一个功能可以用上面三个方法来实现的时候,明显使用computed更合适,代码简单也有缓存特性。
  4. 计算属性范围在vue实例内,修改vue实例外部对象,不会重新计算渲染,但是如果先修改了vue实例外对象,在修改vue计算属性的对象,那么外部对象的值也会重新渲染。

计算属性:computed

计算属性范围在Vue实例的fullName内所管理的firstName和lastName,通常监听多个变量 1111

侦听器:watch

监听数据变化,一般只监听一个变量或数组

使用场景

watch(异步场景),computed(数据联动) watch可以在所监听的数据后面直接加字符串形式的方法名

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Vue计算属性/侦听器/方法比较</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script></head><body><div id="app"><h1>计算属性:computed</h1>{{fullName}}<h1>方法:methods</h1>{{fullName2()}}<h1>侦听器:watch</h1>{{watchFullName}}<h1>年龄</h1>{{age}}</div><script>var other = 'This is other';var app = new Vue({el:"#app",data:{firstName:"zhang",lastName:"san",watchFullName:"zhangsan",age:18,},watch: {firstName:function(newFirstName, oldFirstName){console.log("firstName触发了watch,newFirstName="+newFirstName+",oldFirstName="+oldFirstName)this.watchFullName = this.firstName+this.lastName+","+other},lastName:function(newLastName, oldLastName){console.log("lastName触发了watch,newLastName="+newLastName+",oldLastName="+oldLastName)this.watchFullName = this.firstName+this.lastName+","+other},watchFullName:"change"},computed: {fullName:function(){console.log("调用了fullName,计算了一次属性")return this.firstName+this.lastName+","+other;}},methods: {fullName2:function(){console.log("调用了fullName,执行了一次方法")fullName2 = this.firstName+this.lastName+","+other;return fullName2;},change(){console.log("调用了change,触发了watch")return this.watchFullName='111'}}});</script></body></html>

handler方法就相当于普通侦听器触发的事件,从结果可以看到,组件初始化的时候,侦听器并没有handler方法 ,所以fullName是没有值的

当修改以上代码,加上immediate: true,immediate:true代表watch里面声明了之后会立马执行handler里面的函数。执行相应的逻辑。组件初始化的时候,侦听器会立马(immediate)触发handler方法

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Vue计算属性/侦听器/方法比较</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script></head><body><div id="app"><div><p>FullName: {{person.fullname}}</p><p>FirstName: <input type="text" v-model="person.firstname"></p></div></div><script>var other = 'This is other';var app = new Vue({el: '#app',data(){return {person: {firstname: 'Menghui',lastname: 'Jin',fullname: ''}}},watch: {person: {handler(n,o){this.person.fullname = n.firstname + '' + this.person.lastname;},immediate: true,  //刷新加载 立马触发一次handlerdeep: true  // 可以深度检测到 person 对象的属性值的变化}}})</script></body></html>

当在输入框中输入数据时, 可以发现fullName的值并没有随之改变 这是因为vue无法检测到对象内部属性值的变化,比如person.firstname的变化

所以此时 需要用到vue的深度监听(deep)

此时加上代码 deep: true

可以发现 每次输入框数据变化 fullname随之改变

上面的可以发现handler监听的新值和老值是一样的 这是有vue2.0的坑 犹豫同源导致的 可以用computed来修

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><div id="app"><p>FullName: {{person.fullname}}</p><p>FirstName: <input type="text" v-model="person.firstname"></p></div><script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script><script>const app = new Vue({el: "#app",data() {return {person: {firstname: 'Menghui',lastname: 'Jin',fullname: ''}}},methods: {},computed: {person2(){return JSON.parse(JSON.stringify(this.person));}//解决深度监听新老值同源问题},watch:{person2:{handler(n,o){console.log(this.person);console.log(n.firstname);console.log(o.firstname);/* this.person.fullname = this.person.firstname + this.person.lastname */},/* immediate: true, */deep: true  // 可以深度检测到 person 对象的属性值的变化}}})</script></body>
</html>

Vue——计算属性与侦听器相关推荐

  1. 5.Vue 计算属性和侦听器

    Hello,我是 Alex 007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了. 5.Vue 计算属性和侦听器 ...

  2. (第二篇)Vue计算属性、侦听器、过滤器

    1.计算属性和侦听器 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  3. Vue 计算属性与侦听器

    这一节我们一起学习 vue 中的计算属性(computed properties)和侦听器(watch). 在之前,我们学习过 vue 表达式插值: <div id="example& ...

  4. Vue.js 计算属性和侦听器

    计算属性和侦听器 计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example" ...

  5. vue修改计算属性的值_Vue语法高级之计算属性和侦听器

    计算属性和侦听器都可以监听到data区数据的变化,当数据变化时可以触发方法的调用,从而在方法内部可以进行相应的逻辑处理. 计算属性的语法格式是:computed: {} 侦听器的语法格式是:watch ...

  6. VUE基本使用---安装、开始使用介绍、Vue实例、模板语法、计算属性和侦听器、class与style绑定

    原文在我的博客:https://www.liboer.top/articles/detail/vue-BasedUse/ 文章目录 VUE.js 基础 安装 CDN 下载 安装 命令行工具(CLI脚手 ...

  7. Vue:实例演示,v-if,v-for,v-model,v-bind,v-on,计算属性和侦听器属性

    Vue:实例演示,v-if,v-for,v-model,v-bind,v-on,计算属性和侦听器属性 一.实例演示,v-if,v-for,v-model,v-bind,v-on 方法 含义 v-bin ...

  8. 光脚丫思考Vue3与实战:第05章 计算属性和侦听器 第02节 侦听器

    下面是本文的屏幕录像的在线视频: 温馨提示: 1.视频下载:线上视频被压缩处理,可以下载高清版本: 链接:https://pan.baidu.com/s/1qUekWio3fpWToT9PiECpEg ...

  9. oclick vue 传参 函数_详解Vue计算属性和侦听属性

    关注[搜狐技术产品]公众号,第一时间获取技术干货 作者介绍: 本期特邀作者:浪里行舟 Github博客2600 star作者,专注于前端领域.个人公众号:「前端工匠」,致力于打造适合初中级工程师能够快 ...

最新文章

  1. python初学之魔法方法1
  2. VMware三种上网模型
  3. Spring AOP源码分析(七)ProxyFactoryBean介绍
  4. 变压器轻载是什么意思?
  5. CentOS7 修复boot目录
  6. Android SDK实例之Snake游戏深入解析(一)
  7. 2019 谷歌年度搜索关键词揭晓,技术宅的英雄梦!
  8. Centos 7 学习加入用户
  9. 频谱分析仪原理结构图
  10. 关于List转Json的简单方法
  11. android手机截图功能,手机截屏怎么弄?安卓手机怎么截屏?
  12. 使用JSTmplate向页面渲染数据(使用方法示例)
  13. 距离度量 —— 余弦相似度(Cosine similarity)
  14. windows商店_Windows 10商店迎来重大改变,PC平台游戏计划公布
  15. 设计模式之禅【解释器模式】
  16. hdu1107+武林+模拟
  17. 各类国外软件国内下载镜像合集
  18. 波哥!一个不安分的IT男
  19. 怎么把图片转成JPG格式
  20. 商业分析能力是怎样炼成的?

热门文章

  1. java枚举 星期_Java 枚举
  2. Node.js学习8~10款基于nodejs的主流web框架排名及介绍
  3. java获取项目在磁盘路径
  4. linux dd命令卡住,linux下显示dd命令的进度:
  5. OpenCV基础(16)OpenCV直方图均衡化和自适应直方图均衡化(CLAHE)
  6. 5.5 Thymeleaf 页面布局(Thymeleaf 公共页面抽取)
  7. unity制作GTA5(二)—— 添加地形、小地图、布娃娃系统
  8. 支付宝集五福活动玩的套路你肯定不知道!
  9. VMware虚拟机创建安装之后不出现VMnet1和VMnet8虚拟网卡
  10. wma html在线播放,在HTML网页中如何播放MP3-WMA-RM文件