Vue中的watch的使用

先看下Vue运行机制图

 那么我们思考一件事,vue是通过watcher监听数据的变化然后给发布-订阅,这样实现了dom的渲染,那么我们思考一件事,我们往往需要知道一个数据的变化然后给页面相应的渲染,那么我们工作中在组件中的数据发生了变化我们监听到然后给相应的行为。

watch登场

watch:是vue中常用的侦听器(监听器),用来监听数据的变化。

做一个简单的思考,其实就是当数据变化的时候,把新的旧的数据都同步给了watch,所以我们通过watch来去调用相应数据的方法,就可以取到相应的值。

watch的使用方式(简单数据类型)

watch: {
        这里写你在data中定义的变量名或别处方法名: {
                handler(数据改变后新的值, 数据改变之前旧的值) {
                                这里写你拿到变化值后的逻辑

                        }

                }

        }

举例

data() {return {value: ""}},watch: {//方法1"value"(newVal, oldVal) {console.log(`新值:${newVal}`);console.log(`旧值:${oldVal}`);console.log("hellow  world");}//方法2"value": {handler(newVal, oldVal) {console.log(`新的值: ${newVal}`);console.log(`旧的值: ${oldVal}`);console.log("hellow  world");}}}

监听:复杂数据类型的单一属性

'query.page': {handler(val, oldval) {console.log('1获取新的数据真正是', val, oldval)}},

watch的使用方式(复杂数据类型)

query: {handler(newVal, oldVal) {console.log('2获取复杂数据', newVal, oldVal)},deep: true}

因为watch是数据发生变化的时候才会调用,如果想已进入页面就使用watch(这个不常用)

value: {handler(val, oldval) {console.log('获取新的数据真正的', val, oldval)},immediate: true},

我们再思考一件事情我们除了监听data里边的数据,可不可以监听filter,computed呢?

首先我们总结一下vue组件中出现的数据有哪些?

vue中其他类型的数据

computed

computed的监听 

computed: {newValue: function() {if (this.value === 0) {return 'this is a computed'} else {return 'this is a new computed'}}},watch:{newValue: {handler(newVal, oldVal) {console.log('监听computed', newVal, oldVal)}},}

我们延申一下,再思考一下,computed是一个什么样的存在,相当于爆露出来还是一个新的数据,因为在beforeUpdate的回调中的我们也可以做这样的操作,比如把一个新的值给新的值,这样实现数据修饰。

我们看一下computed的介绍

computed用来监控自己定义的变量,该变量不在data里面声明,直接在computed里面定义.
然后就可以在页面上进行双向数据绑定展示出结果或者用作其他处理;并且带有缓存功能
computed比较适合对多个变量或者对象进行处理后返回一个结果值,也就是数多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化,
举例:总金额=价格*数量
也就是说当我们需要进行大量计算的时候我们适合用computed。c=a*b,a和b不发生变化,就不会重新去取,这就是computed的优势。也就是说这个可以提高项目的性能。

我们总结一下一个页面重新渲染的办法有哪些?

页面渲染的方式

1.表达式。(缺点是不太灵活)

2.methods。(缺点是每次调用都需要重新的解析)

3.filters

4.computed

5.生命周期内实现数据修饰

6.props (父组件传过来的值)

这里我们主要提到filter的computed的使用,可以提高项目的运行效率。那么filter与computed的区别是什么呢?

filter经常使用在格式化上。

computed经常使用在计算上。

filter 与 computed 的区别

触发时机不同
computed 属性背后的处理逻辑比较复杂,依赖 Vue 的数据更新通知机制,在属性所依赖的其他数据项发生变化时才会重新触发计算。优点是计算频率相对较低;缺点是依赖于组件,难以抽取成独立逻辑,也就是复用性低。

filter 则显的简单很多,只在显式调用时触发,一般应用在模板渲染上。优点是容易在组件外抽象;缺点是每次模板渲染时都需要重新执行计算。可以通过示例 感受调用时机的区别:

应用范围不同
computed 很广泛,可以应用在其他computed、methods、生命周期函数、模板;filter 一般只应用于模板渲染上,如果要在其他位置复用,需要使用 this._f 函数:
 

Vue.component('HelloWorld', {filters: {hello() {return 'hello';}},methods: {ping() {return `${this._f('hello')()} world`;}}
})

另外,在使用上filter支持链式调用,这为其增加了组合拼接的能力:

{{ name | normalize | capitalize }}

定义方式

最后需要指出,computed 属性只能在组件内部或通过mixins对象定义;而 filter 有两种定义方式,一是在组件内部通过 filters 属性定义;一是在组件外部通过 Vue.filter 函数定义:

Vue.component('HelloWorld', {filters: {hello() {return 'hello';}}
});
Vue.filter('hello', ()=> 'hello');

应用规则

综上,filter 无法缓存,调用频率高,因此特别适用于格式化输出场景,比如日期格式化。filter 具有组合调用能力,因此可以在项目架构层面定义一堆基础的、简单的filter,按需在组件内组合适用。

computed 属性具有缓存能力,在组件内普适性更强,因此适用于复杂的数据转换、统计等场景。

  • 要用的属性不存在,要通过已有的属性(Vue实例上的data属性值)计算得来
  • 原理:底层借助了Object.defineProperty方法提供的getter和setter
  • 优势:与methods属性相比,computed内部有缓存机制(数据复用),效率更高,调试更方便
  • 计算属性最终会出现在vm上,直接读取使用即可
  • 如果计算属性要被修改,那必须写setter去响应修改,且setter要引起计算时依赖的数据发生变化

再延申一点,watch在deforeUpdated之前,先获取,再监听,然后再更新,再渲染

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/177337.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS元服务实现今天吃什么

一、前言 作为一个职业打工人,每天点外卖吃啥东西都有选择综合症,突发奇想让程序帮我们随机选择一个吃的,是不是可以解决我们的选择问题呢,说干就干,我们就使用HarmonyOS元服务实现一下这个功能。为什么选择这个Harmon…

VBA 宏For WPS(完整版)-供大家学习研究参考

VBE7.1安装方法: 适用于安装 WPS 2019 版本的 缺少 VBA 模块的 亲测可用,内含 VBA 7.1 安装顺序1、2、3、4按照顺序安装; 1.安装MSVCRTRedist\Release目录下32位的安装包,此安装包为运行时库 3.安装VBARedist\Release目录下32位的…

安卓:打包apk时出现Execution failed for task ‘:app:lintVitalRelease

Execution failed for task :lintVitalRelease 程序可以正常运行,但是打包apk的时候报Execution failed for task ‘:app:lintVitalRelease导致打包失败,原因是执行lintVitalRelease失败了,存在错误。解决办法:在app模块的build.…

问题 H: 棋盘游戏(二分图变式)

题意:要求找到 不放车就无法达到最大数的点 的个数 题解:1.以行列绘制二分图 2.先算出最大二分匹配数 3.依次遍历所有边 删除该边,并计算二分匹配最大值 (若小于原最大值即为重要点)&#xff0…

OpenELA 正式公开 Enterprise Linux 源代码

导读近日消息,在红帽(Red Hat)宣布不再对外公开 Red Hat Enterprise Linux(RHEL)源代码之后,同属 Linux 领域的甲骨文、SUSE 及 CIQ 宣布成立了 Open Enterprise Linux Association(OpenELA&…

数据结构第四课 -----线性表之队列

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

【LeetCode:2656. K 个元素的最大和 | 贪心+等差数列】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

桌面云架构讲解(VDI、IDV、VOI/TCI、RDS)

目录 云桌面架构 VDI 虚拟桌面基础架构 IDV 智能桌面虚拟化 VOI/TCI VOI 虚拟系统架构 TCI 透明计算机架构 RDS 远程桌面服务 不同厂商云桌面架构 桌面传输协议 什么是云桌面 桌面云是虚拟化技术成熟后发展起来的一种应用,桌面云通常也称为云桌面、VDI等 …

在抖音电商,他们帮女性实现了L码自由

“很多(女装)店铺只做到L,甚至L(其实)是M码。”身高1米6、体重60公斤的达人鸭嗓明明120斤 在抖音上吐槽道,“尤其是夏天的连衣裙,胸围很多不超过85厘米,那它的意思就是你可以胖&…

助力燃气安全运行:智慧燃气管网背景延展

关键词:城市燃气管网、智慧燃气管网、智慧管网、智慧燃气管网解决方案、智慧燃气 01背景 当前,随着我国城市化进程不断加快,城市燃气管网也不断延伸,运行规模庞大,地下管线复杂,不少城市建设“重地上轻地…

Clickhouse学习笔记(4)—— Clickhouse SQL

insert insert操作和mysql一致 标准语法:insert into [table_name] values(…),(….)从表到表的插入:insert into [table_name] select a,b,c from [table_name_2] update 和 delete ClickHouse 提供了 Delete 和 Update 的能力,这类操作…

CPS-8910

PCI Express,有线开关设备 CPS-8910专为在PXI平台或软件无线电设备上实现大型多输入多输出(MIMO)扩展配置和系统控制而设计。 CPS-8910提供了2个PCI Express上行端口和8个下行端口来实现无缝系统扩展。 下行端口可以连接软件无线电可重配置设备等外部设备&#xff0…