关于计算属性
案例:分别输入姓和名,打印全名
基本代码
| <div id='root'> |
| first name<input type="text" v-model="firstname"><br/><br/> |
| last name<input type="text" v-model="lastname"><br/><br/> |
| fullname: <span>???</span> |
| </div> |
| |
| <script type="text/javascript"> |
| new Vue({ |
| el: "#root", |
| data: { |
| firstName: "Aisen", |
| lastName: "Rowell" |
| } |
| }) |
| </script> |
- 使用插值语法
fullname: <span>{{firstname}} - {{lastname}}</span>
- methods属性
fullname: <span>{{fullname()}}</span>
vue对象配置
| |
| <script type="text/javascript"> |
| new Vue({ |
| el: "#root", |
| data: { |
| firstName: "Aisen", |
| lastName: "Rolwell" |
| }, |
| methods: { |
| fullname(){ |
| return this.firstname + '-' + this.lastname |
| } |
| }, |
| }) |
| </script> |
当然也可以使用计算属性
计算属性
读取的属性需要通过已有的属性计算得来
| fullname: <span>{{fullname()}}</span> |
| |
| <script type="text/javascript"> |
| const v = new Vue({ |
| el: "#root", |
| data: { |
| firstName: "Aisen", |
| lastName: "Rowell" |
| }, |
| computed: { |
| fullname: { |
| |
| |
| get() { |
| console.log("getter called.") |
| return this.firstname + '-' + this.lastname |
| } |
| |
| |
| set(value) { |
| console.log("value changed") |
| const arr = value.split('-') |
| this.firstname = arr[0] |
| this.lastname = arr[1] |
| } |
| } |
| }, |
| }) |
| </script> |
简写: 只有当只读取数据的情况时,即setter被忽略
| fullname: <span>{{fullname}}</span> |
| |
| <script type="text/javascript"> |
| const v = new Vue({ |
| el: "#root", |
| data: { |
| firstName: "Aisen", |
| lastName: "Rowell" |
| }, |
| computed: { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| fullname(){ |
| console.log("getter called.") |
| return this.firstname + '-' + this.lastname |
| } |
| }, |
| }) |
| </script> |
比较methods属性
优势:存在缓存机制,可以复用。使用计算属性,重复读取某一值时,实际只调用一次;methods属性则需要每次调用方法
监视属性
监视属性中的对象一旦发生变化,对象中的方法会被调用,更新前后的值也会被记录
❗被监视的属性必须存在才能成功监视 ❗ 包括那些来自data属性和computed属性
| new Vue({ |
| |
| watch: { |
| |
| isDone: { |
| immediate: true, |
| |
| handler(newValue, oldValue){ |
| console.log("isDone is changed to ", oldValue) |
| } |
| } |
| } |
| }) |
深度监视
写在前面
🌟 每一个属性配置(data, computed, watch etc.)实际上是包含键值对的对象,即其中的key值应用双引号标明,只是vue支持省略了引号
现在创建一个对象numbers, 包含一个a值,点击令a增加,监视a的变化
| <h3>a is {{numbers.a}}</h3> |
| <button @click="numbers.a++">点我</button> |
| data: { numbers: { a:1, b:1} } |
| watch: { "numbers.a":{ handler() {...} } } |
如何监控整个numbers呢?➡️ deep深度监控
watch默认不开启深度监视,因此不会监视多层级对象内部的变化
| watch: { |
| numbers: { |
| deep: true, |
| handler() {console.log("numbers was changed.")} |
| } |
| } |
简写 -- 只有handler选项时,类似computed
| watch: { |
| isDone(newValue, oldValue){ |
| console.log("isDone is changed to ", oldValue) |
| } |
| } |
另一种写法,适用于预先未知监控对象的情况
| vm.$watch("isDone", { |
| immediate: true, |
| deep:true, |
| handler(newValue, oldValue){ |
| console.log("isDone is changed to ", oldValue) |
| } |
| }) |
| |
| |
| vm.$watch("isDone", function(newValue, oldValue){ |
| console.log("isDone is changed to ", oldValue) |
| }) |
watch vs computed
- computed能实现的操作,watch也可以
- watch能实现异步操作如计时器,而computed因为无法返回值给属性所以不行
关于vue对象下的函数
- 所有需要vue管理的函数,最好写成普通函数,这样this指向就是vue对象本身
- 所有不归vue管的函数(计时器回调,ajax回调,promise回调函数),写成箭头函数,这样this指向vue对象或组件实例对象了
💮一个例子💮
解释:因为箭头函数没有申明绑定主体,因此按序向外寻找setTimeout -> firstname -> vm,即主体确定为vm;普通函数主体即为函数的作用域
| const vm = new Vue({ |
| |
| watch: { |
| firstname(val) { |
| setTimeout(()=>{ |
| console.log(this) |
| }, 1000) |
| } |
| } |
| }) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?