watch与computed的区别

2023-05-16

今天说说watch与computed的区别。

我们知道有些功能既可以用watch实现又可以用computed实现,谁比谁好呢,没个准信。我们先来用它俩实现同一功能再进行对比看看具体好处。

例子:定义两个输入框以及一个span标签,span标签中的内容为两个输入框中的值,span标签中的内容随着输入框中的内容变化而变化

watch实现

<body>
    <div id="app">
        姓: <input type="text" v-model=firstName> 名:
        <input type="text" v-model=lastName> 姓名:
        <span>{{fullname}}</span>
    </div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: "#app",
        data: {
            firstName: 'z',
            lastName: 's',
            fullname: 'zs'
        },
        watch: {
            firstName(newval) {
​
                this.fullname = newval + this.lastName
            },
            lastName(newval) {
                this.fullname = this.firstName + newval
            }
​
        }
    })
​
</script>

computed实现

<body>
    <div id="app">
        姓: <input type="text" v-model=firstName> 名:
        <input type="text" v-model=lastName> 姓名:
        <span>{{fullname}}</span>
    </div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: "#app",
        data: {
            firstName: 'z',
            lastName: 's'
        },
        computed: {
            fullname() {
                return this.firstName + this.lastName
            }
        }
    })
​
</script>

根据上面两个代码可以看出computed实现起来更简单,代码也更简单。但我们不能因此来判断computed比watch好,为什么这么说呢?我们再通过代码来比较一下

<body>
    <div id="app">
        姓: <input type="text" v-model=firstName> 名:
        <input type="text" v-model=lastName> </br>watch姓名:
        <span>{{fullname}}</span> </br>computed姓名:
        <span>{{fullName}}</span>
    </div>
</body>
<script type="text/javascript">
    var app = new Vue({
        el: "#app",
        data: {
            firstName: 'z',
            lastName: 's',
            fullname: 'zs'
        },
        computed: {
            fullName() {
                setTimeout(() => {
                    return this.firstName + this.lastName
                }, 1000);
            }
        },
        watch: {
            firstName(val) {
                setTimeout(() => {
                    this.fullname = val + this.lastName
                }, 1000);
            },
            lastName(val) {
                setTimeout(() => {
                    this.fullname = this.firstName + val
                }, 1000)
            }
        }
    })
</script>

上面代码中两个span标签值一个是通过watch改变,一个是通过computed改变,在两者中都加入了定时器表示当修改input中的值过1秒才更改span的值,但是我们看到computed并没有起作用,查看后台也并没有出错。

为什么会出现这种情况呢?

我们能看到computed主要是通过返回值的方式来实现的,return处在setTimeout的回调函数中返回的值为setTimeout所接收根本不会传到fullName上,意味着fullName中并没有return语句,所以在页面上也没有值;而watch是通过更改fullname属性的值来实现的,fullname一变化vue便会重新解析将新值放上去。

另外,要注意的是setTimeout是由windows管理,如果回调函数写成普通函数那么this指向是为windows对象,所以要写成箭头函数。得出总结:当要使用异步函数(不被vue所管理的函数)时就必须使用watch而非computed,其次,异步函数中的回调函数必须使用箭头函数。

watch与computed区别总结

  1. computed支持缓存,相依赖的数据发生改变才会重新计算;watch不支持缓存,只要监听的数据变化就会触发相应操作

  2. computed不支持异步,当computed内有异步操作时是无法监听数据变化的;watch支持异步操作

  3. computed属性的属性值是一函数,函数返回值为属性的属性值,computed中每个属性都可以设置set与get方法。watch监听的数据必须是data中声明过或父组件传递过来的props中的数据,当数据变化时,触发监听器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

watch与computed的区别 的相关文章

随机推荐

  • ubuntu xubuntu 安装xrdp 键盘鼠标无法输入问题 采用命令行解决办法

    前言 原本打算安装xrdp实现windows控制ubuntu的 xff0c 结果安装完成后 xff0c 系统一重启突然发现键盘鼠标不能用了 xff0c 去网络上搜索了很多解决办法发现都不行 xff0c 后来经过不断地尝试 xff0c 终于找
  • 云服务器ECS入门

    1 什么云服务器ECS 云服务器ECS xff08 Elastic Compute Service xff09 是阿里云提供的性能卓越 稳定可靠 弹性扩展的IaaS xff08 Infrastructure as a Service xff
  • 启用微软e5子账户的outlook邮箱,解决 qyi 续订程序无法刷新令牌问题

    使用 qyi io 提供的 e5 子账户续订服务 xff0c 如果子账户的outlook未启用 xff0c 则会报错 xff1a 无法刷新令牌 code 2 错误消息 The mailbox is either inactive soft
  • Python基础语句

    一 判断语句 在程序中如果某些条件满足 xff0c 才能做某件事情 xff0c 而不满足时不允许做 xff0c 这就是所谓的判断 1 if语句的使用格式 if 条件 条件成立时 要做的事 案例 判断年纪 xff0c 如果age大于18 xf
  • Keil5程序编译下载不能正常运行,在线调试却正常工作

    Keil5程序编译下载不能正常运行 xff0c 在线调试正常工作 本人水平有限以下个人经验仅供参考 xff0c 很可能有各种错误和不准确之处 在Keil5的使用中 xff0c 本人之前弄出了一个位置错误导致了似乎是栈溢出问题 xff0c 程
  • 家用动态IP配置DDNS

    文章目录 动态公网IP配置DDNS申请域名API访问密钥编写Java代码 xff0c 定时更新域名IPDDNS程序打包上传服务器 xff0c 配置为开机自启动开源代码的使用说明 动态公网IP配置DDNS 家里有台老旧的笔记本电脑闲置着 xf
  • CentOS 7 安装 netmap

    0 环境准备 操作系统 xff1a CentOS 7 3 1611 yum y install rpm build redhat rpm config asciidoc bison hmaccalc patchutils perl ExtU
  • Linux下Nvidia驱动的安装

    1 查看Linux系统是否已经安装了Nvidia驱动 命令行输入 xff1a nvidia smi 进行查看 xff1a nvidia smi 如果输出以下信息 xff0c 则Linux系统中已经安装了Nvidia驱动 如果没有以上的输出信
  • Linux下安装cuda和对应版本的cudnn

    1 首先在安装cuda与cudnn之前 xff0c 系统需要成功安装Nvidia驱动 xff0c 安装教程请参照以下教程 xff1a Nvidia驱动安装教程 2 验证系统内部是否已经安装了cuda 打开命令行 xff0c 输入以下命令 x
  • Windows安装Matlab的具体步骤

    一 进行相关文件的下载 安装所需的文件可以从以下链接获取 xff0c 提取码 xff1a 5417 点击此处进行文件下载 二 进行Matlab的安装 1 文件内容解释 下载的文件一共有三个 xff0c 文件名称分别为 xff1a Matla
  • Tensorflow---Tensorflow的五种保存模型的方式介绍

    一 保存模型的全部配置信息 使用model save 函数搭配tf keras models load model 对模型的架构 xff0c 权重以及配置进行保存与恢复 模型的保存代码如下 xff1a span class token ke
  • ISPRS遥感数据集--Potsdam数据集,Vaihingen数据集,Toronto数据集

    一 数据的获取 Potsdam数据集下载链接 百度网盘提取码 xff1a lala Vaihingen数据集下载链接 百度网盘提取码 xff1a lala Toronto数据集下载链接 百度网盘提取码 xff1a lala 二 数据集的介绍
  • Pytorch---使用Pytorch实现U-Net进行语义分割

    一 代码中的数据集可以通过以下链接获取 百度网盘提取码 xff1a f1j7 二 代码运行环境 Pytorch gpu 61 61 1 10 1 Python 61 61 3 8 三 数据集处理代码如下所示 span class token
  • 属性的注入---构造方法的注入

    Java类代码如下 xff1a span class token keyword package span span class token namespace org span class token punctuation span a
  • 属性的注入---set方法注入

    Java类代码如下 xff1a span class token keyword package span span class token namespace org span class token punctuation span a
  • 属性的注入---P名称空间注入

    Java类代码如下 xff1a span class token keyword package span span class token namespace org span class token punctuation span a
  • Java数组元素循环向前挪动1位后输出

    package practice 数组元素挪动 指导老师 xff1a 杨 宇 64 author WanAkiko public class TheElementMove public static void main String arg
  • 记一次引入cocoapods找不到库的问题

    记一次引入cocoapods找不到库的问题 最近维护公司代码 xff0c 代码很老了 xff0c 各种三方库都是拖进工程里面 xff0c 为了方便管理打算使用cocoapods管理三方库 xff0c 也为之后的组件化私有库分离做准备 但是期
  • MySQL8.0版本设置新密码

    安装好MySQL后打开cmd窗口 启动MySQL gt net start mysql 或任务管理器 gt 服务 gt 找到MySQL右键开始 连接MySQL gt mysql uroot p 这是会出现 34 Enter password
  • watch与computed的区别

    今天说说watch与computed的区别 我们知道有些功能既可以用watch实现又可以用computed实现 xff0c 谁比谁好呢 xff0c 没个准信 我们先来用它俩实现同一功能再进行对比看看具体好处 例子 xff1a 定义两个输入框