当前位置: 首页 > article >正文

学会使用computed计算属性与watch监听(小白学习笔记)

1. 使用不同方法实现 姓名案例

需求: 根据data中 firstName 和 lastName 的值 来动态地展示全名

1.1. 插值语法

如果只使用学过的插值语法 那可以在模板中直接使用两个变量 . 但是如果需要对数据进行计算等处理  就需要在插值语法里写复杂的js表达式.  这样就违背了vue风格指南中"模板中使用简单表达式"的原则.

1.2. methods 方法

如果使用学过的 methods 方法 ,那么代码如下图所示 模板中的表达式看起来不复杂. 但是 vue的特性是 只要数据值改变 那么模板就会重新解析. 将用到该数据的所有地方重新计算展示 一旦 firstName 和 lastName 中任意值发生变化 所有用到fullName的地方都需要重新调用 会影响性能.  

methods中的函数如何拿到data中的数据?   这里methods配置项中的 普通函数由vue管理 其内部的this指向组件实例或vm. 又因为vm身上有data中的所有属性 所以可以在methods中使用this拿到data中的两个属性值

1.3. 计算属性computed

使用计算属性 可以把 根据firstName 和 lastName 计算得到的结果 命名为fullName 将其写成对象的形式 在该对象里面配置 getter和 setter 函数 分别用于读取fullName属性 和设置fullName属性

str.split(delim) 方法。它通过给定的分隔符 delim 将字符串分割成一个数组。

arr.join(glue) 与 split 相反。它会在它们之间创建一串由 glue 粘合的 arr 项。

读取 计算属性 fullName 即读取其内部getter函数return的返回值 又因为返回值依赖其他属性值 所以会通过计算得到结果  并且该结果会有缓存, 只要依赖的数据即 firstName和 lastName 不变化 无论fullName被使用多少次 都可以直接使用缓存的值 不需要重复调用. 节省性能.

计算属性 会直接放到vue实例上 属性值是getter函数的返回值 我们可以在vue模板中直接使用.如下图所示:

注意 getter和setter 必须写成普通函数的形式(非箭头)  这样其内部this指向的就是组件实例或Vm 方便使用实例身上的属性来进行计算.

1.4. 使用计算属性小结

(1) 什么时候使用计算属性?       要用到的属性值不存在 需要依赖已有属性计算得来.

(2) 底层原理是什么?                  底层借助了Object.defineproperty方法提供的getter和setter.

(3) gettr和setter函数分别在什么时候执行?

getter 执行:  ① 第一次读取计算属性值的时候  ② 所依赖的数据发生变化的时候 getter会被再次调用,将新值更新到页面中.

setter 执行: 当对计算属性进行赋值时执行 (注意setter内部 要引起计算时依赖的数据发生变化 )

( 依赖的数据发生了 对应的改变 ---> 读取计算属性时 其结果才会和赋值相同 如下图所示 当全名fullName被更改为张-三  在set函数中将其firstName和lastName进行相应更改( 张  三 ) 读取fullName时 getter函数才会返回新值 张-三)

(4) 计算属性的优势: 与methods相比 计算属性内部具有缓存机制(方便复用), 效率更高 调试方便.

(5)计算属性的简写形式

如果fullName计算属性 只会被读取 而不可能被赋值(修改). 那么不需要再写成对象里面包含getter和setter的格式,只需要写成 名为fullName的函数 返回计算的结果即可. VUE就会将 fullName和返回的结果 放在vue实例上方便读取.

2. 使用不同方法实现 天气案例

需求: 点击按钮切换天气.

2.1. 使用计算属性实现

使用计算属性实现 根据data中isHot的值 --> 计算出展示信息即 info的值

2.2. 使用监听属性实现

使用监听属性的两种写法 ①new vue时传入的配置项watch ②vm身上的$watch方法. 如下图所示:

当监听的 isHot属性(监听的可以是已有的data属性也可以是已有的计算属性) 值发生变化时.其内部配置的handler函数就会被调用.并且该函数可以接收 监听属性改变后的新值 和改变前的旧值.

注意: 监听的属性 必须先存在 才能举行监听.

2.3. 立即监听 深度监听与 watch监听的简写形式

深度监听: 如果监听的数据指向一个对象 ,那么默认监听的是该对象的引用地址. 如果想监听对象内部的属性 需要开启深度监听.

立即监听: 页面初始化时 就调用handler函数(数据无需改变)

监听属性的简写形式

如果监听属性时 只需要配置handler函数(无需立即调用与深度监听) 可以使用简写属性.

① watch配置项的简写

不再写成对象形式, 直接使用 监听的属性名 写成函数形式, 参数同样可以接收 newValue oldValue.

② vm上调用 $watch的简写

不再写成对象形式 而是直接写成匿名函数.

注意: new Vue时 传入的配置项里的函数 都是由vue进行管理的函数 都要写成普通函数(非箭头×)的形式.这样函数内部的this才会指向vue实例.

3. 计算属性与监听属性的区别

3.1. 使用监听属性实现 姓名案例

需要分别监听已有属性 firstName 和 lastName的变化 并且额外创建 fullName属性 当监听到改变时使 fullName属性发生对应的变化.

3.2. 两者的区别

watch监听 函数内部可以使用定时器 实现 1s之后修改对应属性值的效果.

但是 计算属性 依靠return 来改变属性值 所以无法使用定时器. 定时器中箭头函数的return是定时器内部的

不是 fullName函数的返回值. 所以无法使用定时器来改变计算属性的返回值

所以 当需要进行异步计算的时候 需要使用watch.

computed 能完成的功能 ---> watch 一定可以完成(只是没有缓存). 但是watch能完成的功能 ,computed不一定能完成( 不方便拿到newValue 和 oldValue 也不能异步操作 )

注意 : 下图中 定时器内部必须写箭头函数 因为定时器是js引擎调用的 定时器内部如果是普通函数 其this 指向 window.  只有写成箭头函数 它没有自身的this 继承其包含上下文的this 即firstName函数的this 才能指向vm 才能拿到vm身上的firstName和lastName属性值.

以上就是计算属性computed 和监听属性watch的基础使用方法.

------------------------------文章内容整理自禹神 Vue2 前端课程------------------------------------------------------


http://www.kler.cn/a/500022.html

相关文章:

  • 图片和短信验证码(头条项目-06)
  • 1.两数之和--力扣
  • 深入Android架构(从线程到AIDL)_24 活用IBinder接口于近程通信02
  • 深入NLP核心技术:文本张量表示与词嵌入全面解析
  • 【GESP】C++二级练习 luogu-B2080, 计算多项式的值
  • Iterator 与 ListIterator 的区别
  • 头部(Header)
  • Vulnhub-Red靶机笔记
  • FFmpeg音视频流媒体,视频编解码性能优化
  • 【pikachu】靶场中爆破模块的token检测,如何使用burp进行爆破
  • Vue3框架核心功能点响应式数据reactive、组合式API setup、computed、组件通信、路由导航,状态管理vuex、pinia等的实战示例代码
  • 从0开始搭建MySQL服务 | 创建库 、创建表、数据写入、查数据
  • Qt 智能指针
  • 三维卷积( 3D CNN)
  • 通过一个含多个包且引用外部jar包的项目实例感受Maven的便利性
  • js前序遍历等
  • git - 用SSH方式迁出远端git库
  • 从0开始分享一个React项目(二):React-ant-admin
  • docker配置镜像加速
  • 【LC】3270. 求出数字答案
  • 【钉钉在线笔试题】字符串表达式的加减法
  • 监听器与RBAC权限模型