VUE计算属性和监听器
计算属性
一般情况下属性都是放到data
中的,但是有些属性可能是需要经过一些逻辑计算后才能得出来,那么我们可以把这类属性变成计算属性。比如以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <title>vuedemo</title> <script src= "https://cdn.jsdelivr.net/npm/vue" ></script> </head> <body> <div id= "app" > <label for = "length" >长:</label> <input type= "number" name= "length" v-model:value= "length" > <label for = "width" >宽:</label> <input type= "number" name= "width" v-model:value= "width" > <label for = "area" >面积:</label> <input type= "number" name= "area" v-bind:value= "area" readonly > </div> <script> let vm = new Vue({ el: "#app" , data: { length: 0, width: 0, }, computed: { area: function () { return this .length * this .width; } } }); </script> </div> </body> </html> |
可能有的小伙伴会觉得这个计算属性跟我们之前学过的函数好像有点重复。实际上,计算属性更加智能,他是基于它们的响应式依赖进行缓存的。也就是说只要相关依赖(比如以上例子中的area
)没有发生改变,那么这个计算属性的函数不会重新执行,而是直接返回之前的值。这个缓存功能让计算属性访问更加高效。
计算属性的set
计算属性默认只有get
,不过在需要时你也可以提供一个set
,但是提供了set
就必须要提供get
方法。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <title>vuedemo</title> <script src= "https://cdn.jsdelivr.net/npm/vue" ></script> </head> <body> <div id= "app" > <div> <label>省:</label> <input type= "text" name= "province" v-model:value= "province" > </div> <div> <label>市:</label> <input type= "text" name= "city" v-model:value= "city" > </div> <div> <label>区:</label> <input type= "text" name= "district" v-model:value= "district" > </div> <div> <label>详细地址:</label> <input type= "text" name= "address" v-model:value= "address" > </div> </div> <script> let vm = new Vue({ el: "#app" , data: { district: "" , city: "" , province: "" }, computed: { address: { get : function () { let result = "" ; if ( this .province) { result = this .province + "省" ; } if ( this .city) { result += this .city + "市" ; } if ( this .district) { result += this .district + "区" ; } return result; }, set : function (newValue) { let result = newValue.split(/省|市|区/) if (result && result.length > 0) { this .province = result[0]; } if (result && result.length > 1) { this .city = result[1]; } if (result && result.length > 2) { this .district = result[2]; } } } } }); </script> </body> </html> |
监听属性
监听属性可以针对某个属性进行监听,只要这个属性的值发生改变了,那么就会执行相应的函数。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <title>vuedemo</title> <script src= "https://cdn.jsdelivr.net/npm/vue" ></script> </head> <body> <div id= "app" > <div> <label>搜索:</label> <input type= "text" name= "keyword" v-model:value= "keyword" > </div> <div> <p>结果:</p> <p>{{answer}}</p> </div> </div> <script> let vm = new Vue({ el: "#app" , data: { keyword: "" , answer: "" }, watch: { keyword: function (newKeyword, oldKeyword) { this .answer = '加载中...' ; let that = this ; setTimeout(function () { that.answer = that.keyword; }, Math.random() * 5 * 1000); } } }); </script> </body> </html> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了