computed与watch的区别

2023-11-14

一、computed与watch

在之前的练习中本人碰到computed来监听某个数据变化。我们都知道computed与watch都是可以监听数据变化,但具体要怎么区别它们呢?

1.1 watch

1.1.1 watch的简单执行

<template>
  <div class="stylebg">
    <div class="mt22">
      watch的运用
    </div>
    <div>
      姓:<el-input v-model="firstName"></el-input>
    </div>
    <div>
      名:<el-input v-model="secondName"></el-input>
    </div>
    <div>
      {{fullName}}
    </div>
  </div>
</template>

<script>
export default {
  data(){
    return{
      firstName:'1',
      secondName:'2',
      fullName:''
    }
  },
  watch:{
     firstName(fValue){
       console.log('执行了watch')
       this.fullName = fValue + this.secondName
     },
    secondName(sValue){
      this.fullName = this.firstName + sValue
    },
  }
}
</script>

<style scoped>
  .mt22{
    margin:22px 0;
  }
</style>

运行截图
在这里插入图片描述

1.2.1 watch的特点

根据上述代码我们可以总结出watch以下5种特点:

  1. 监听一个数据,一个属性影响多个属性
  2. 不使用return返回
  3. 第一次加载不会监听watch里的属性名
  4. 支持异步操作,既可以监听到异步
  5. 不支持缓存

1.3.1 watch的首次加载

从上述1.2的代码运行中,可以得出我们第一次加载页面的时候,watch是不会监听watch里的属性名,那么有没有一种方法是可以接触这种限制呢?在1.3.1会进一步的说明

1.3.1.1 watch如何实现首次加载

我们把1.2的代码进一步地改进,需要在属性名里面定义immediate:true的相关属性,再把需要所赋的最新值,写入内部属性的方法handler( )中,即可在第一次加载监听watch的某个属性名。

<template>
  <div class="stylebg">
    <div class="mt22">
      watch的运用
    </div>
    <div>
      姓:<el-input v-model="firstName"></el-input>
    </div>
    <div>
      名:<el-input v-model="secondName"></el-input>
    </div>
    <div>
      {{fullName}}
    </div>
  </div>
</template>

<script>
export default {
  data(){
    return{
      firstName:'1',
      secondName:'2',
      fullName:'',
    }
  },
  watch:{
    firstName: {
        // 监听数据
      handler(fValue) {
          console.log('执行了watch')
          this.fullName = fValue + this.secondName
      },
      deep: true, // 深度监听
      immediate:true, //当 watch 一个变量的时候,初始化时并不会执行你需要在created的时候手动调用一次。添加immediate属性,这样初始化的时候也会触发
    },

    secondName(sValue){
      this.fullName = this.firstName + sValue
    }
  }

}
</script>

<style scoped>
  .mt22{
    margin:22px 0;
  }
</style>

运行截图
在这里插入图片描述

从运行截图中我们可以看出首次加载页面的时候会执行firstName属性名中的内部代码(从控制台打印出‘执行了watch’的字符串以及界面显示了fullname的字符串可以看出)

2.1 computed

2.1.1 computed的简单运行

<template>
  <div class="stylebg">
    <div class="mt22">
      computed的运用
    </div>
    <div>
      姓:<el-input v-model="firstName2"></el-input>
    </div>
    <div>
      名:<el-input v-model="secondName2"></el-input>
    </div>
    <div>
      {{fullName2}}
    </div>
  </div>
</template>

<script>
export default {
  data(){
    return{
      firstName2:'1',
      secondName2:'2',
      // fullName2:''
    }
  },
  computed:{
    fullName2(){
      console.log('执行了computed')
      return this.firstName2 + this.secondName2
    }
  },
}
</script>

<style scoped>
  .mt22{
    margin:22px 0;
  }
</style>

运行截图
在这里插入图片描述

2.2.1 computed的特点

根据上述代码我们可以总结出computed以下5种特点:

  1. 监听多个数据,多个属性影响一个属性
  2. 必须使用return返回
  3. 第一次加载会监听computed里的属性名
  4. 无法支持异步操作,既不能监听到异步操作里面的数据变化
  5. 支持缓存,可以避免每次取值时需要重新计算。

2.2.2 computed中设置属性名问题

在编写代码中遇到一个问题,因为computed在运行时是会return把计算的数值直接返回到变量fullName2中,而在data中又同时有fullName2的空字符串,执行代码的时候会发生错误,那么为什么会发生这种错误呢?主要是牵扯到属性名重命名的问题。

2.2.2.1 为什么在data与compted中的属性不能重定义,会报错?

在执行把数据挂在vm实例中会参考下述的vue源码

 	function initState (vm) {
       vm._watchers = [];
       var opts = vm.$options;
       if (opts.props) { initProps(vm, opts.props); }
       if (opts.methods) { initMethods(vm, opts.methods); }
       if (opts.data) {
         initData(vm);
       } else {
         observe(vm._data = {}, true /* asRootData */);
       }
       if (opts.computed) { initComputed(vm, opts.computed); }
       if (opts.watch && opts.watch !== nativeWatch) {
         initWatch(vm, opts.watch);
       }
     }

可以看出上述,代码会把props等通过方法挂载在vm实例上面,执行顺序为props→methods→data→computed→watch。所以若属性名相同的话,后面的值会把前面的值覆盖。在实际运行中会直接抛出属性名重命名的错误。
在书写代码需要避免属性名重复书写。

二、computed与watch的区别

在经过第一章computed与watch的运行介绍,可以列出它们的区别:

watch computed
监听一个数据,一个属性影响多个属性 监听多个数据,多个属性影响一个属性
不使用return返回 必须使用return返回
第一次加载不会监听watch里的属性名(未设置immediate:true情况下) 第一次加载会监听computed里的属性名
支持异步操作,既可以监听到异步 无法支持异步操作,既不能监听到异步操作里面的数据变化
不支持缓存 支持缓存,可以避免每次取值时需要重新计算。

三、computed与watch一般会使用到的场景

watch: 如需要执行异步操作或者开销比较大的场景,搜索框输入一个字符串会调用API去动态获取相应的数据列表。
computed: 如购物车勾选多件商品,此时勾选每件商品的价钱属性影响总价的属性。

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

computed与watch的区别 的相关文章

  • 如何将 vue3-openlayers 插件添加到 nuxt

    我有以下 main ts 文件Vue3 https v3 vuejs org import createApp from vue import App from App vue How to do this in nuxt3 import
  • 监听 Vue.js 中的自定义事件

    Vue js 非常适合处理浏览器事件 例如click or mousedown 但根本不适用于自定义事件 这是代码 HTML div style display none div div div div div
  • 如何使用 Vue.js 向数组(数据)中的所有对象添加属性?

    背景 我在 data 中有一个数组 其中填充了来自后端的对象 如果 GET 请求检索 6 个对象 这 6 个对象将在数组中更新 Problem 我已经了解需要 vm set 来向对象添加属性 但是如何为数组中的所有对象添加属性呢 我想改变
  • Vuex存储数据总是驻留在内存中?

    首先 我希望您能理解我蹩脚的英语 我想知道Vuex的存储数据是否总是驻留在内存中 让我用一个例子来解释一下 当进入页面A时 我们从服务器收到一个列表 并实现将其存储在商店中 这是否意味着当我进入页面A并移动到页面B时 A的列表将保留在内存中
  • ExpressJS - 提供通用 Nuxt 应用程序和 AngularJS SPA

    我有一个具有以下结构的博客项目 服务器 用 Node Express 编写 管理员 AngularJS SPA public AngularJS SPA 目前 管理部分和公共部分具有相同的域 但管理部分使用不同的子域 这允许我在 Expre
  • 作为对象访问 vue-i18n 消息

    我想创建一个取决于页面的动态滑块 security signin slide1 Kitten1 slide2 Kitten2 signup slide1 Kitten1 slide2 Kitten2 slide3 Kitten3 问题是我想
  • @apply 在 Laravel Mix 中的 Vue 组件内不起作用

    我在 Laravel 中使用 Tailwind CSS 和 VueJS 组件 如下所示
  • Laravel Vue js spa 应用程序

    1 我想知道为什么人们使用两台服务器用 laravel 制作 vuejs SPA 我想我们可以用另一种方式 制定这样的路线 Route get any function return view index gt where any 并让 v
  • 我正在尝试向我的 vue.js 项目添加背景图像

    我想添加覆盖整个页面的背景图像 然而现在看起来是这样的 我希望它跨越整个网页 在 vue js 中这将如何完成 我还想要一个动画工具栏 以便当页面不滚动时工具栏是透明的并呈现背景图像的外观 当它滚动时 工具栏将具有当前的蓝色 这是我的小提琴
  • 如何在 Laravel 5.4 中加载 Vue 组件?

    我已经运行 npm run watch 并收到了消息 This dependency was not found in resources assets js app js To install it you can run npm ins
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas
  • 监听来自动态vue组件的事件

    您将如何侦听动态创建的组件实例发出的事件 在示例中 顶部组件添加到 DOM 中 而第二个组件是在 javascript 中动态创建的 Vue component button counter data function return cou
  • Vue.js + Element UI:在更改时获取“event.target”

    我无法获取在事件处理程序中触发事件的 html 字段 在 javascript 中是event target 我有一个表格 附加到更改事件函数的输入元素 管理更改事件的函数 我的代码如下 var Main methods change pa
  • 无法通过 Vue.js 从 Laravel 后端下载文件 (pdf)(Axios 帖子)

    我在 Vue 中有一个多步骤表单 一旦收集到所有信息 我就会将结果发布到 Laravel 控制器 这是网站的经过验证的区域 我正在使用护照 所以本质上我有一个 Vue SPA 它是在 Laravel 5 7 框架内构建的网站的管理区域 Vu
  • 将 Stripe.js 作为 ES 模块导入到 Vue 中

    我正在尝试按照 stripe elements 文档中的说明并将 ES 模块安装到我的 Vue 支付组件中 https stripe com docs stripe js html js 请注意 目前 Stripe 网站 ES 模块安装选项
  • vue如何设置嵌套对象的默认道具

    我的道具是这样的 house kitchen sink 我尝试过类似的事情 但没有成功 props house type Object default gt kitchen sink 如何为此类对象设置默认道具 来自文档 对象或数组默认值必
  • Firestore onSnapshot() 方法多次触发

    我有一个带有多个路由和 vuex 的 vue cli 4 应用程序 Firestore 数据库已成功连接 我的应用程序立即反映从 Firestore 控制台应用于数据库的修改 在离开包含与 Firestore 同步 的组件的路线然后返回后
  • 使用 vue-cli 服务时如何禁用 linting?

    我正在使用以下命令使用 vue cli 运行我的项目 vue cli service 服务 open 如何禁用所有 linting 目前每次保存时都会重新进行 linting 并且更改代码需要很长时间 我已经把 lintOnSave fal
  • Vue SPA - 如何在浏览器中呈现时隐藏 .vue 文件

    我正在开发一个用 Vue js 开发的单页应用程序 托管在 Node js 服务器上 目前它仍在开发中 但最终将暴露给外部客户 并且由于我们将处理敏感数据 我们希望避免在用户检查元素时看到 vue 文件和相对文件树结构在开发工具中 See
  • 如何居中对齐表格 - PDFMAKE

    我可以使用 PDFMAKE 创建一张居中对齐 页面 的表格吗 已定义的对齐方式 样式中的 center 和标签表内的 table width auto body text PER ODO style tableHeader text VOL

随机推荐

  • 局域网速度测试,三款软件轻松搞定(转)

    局域网络可谓随处可见 我们也十分关注其实际运行速度如何 比如两台计算机间的文件传输 访问对方计算机的快慢等 而决定局域网络速度的因素很多 又不可能通过简单的操作检测出速度的大小 同时也希望能有一些软件能帮助我们管理局域网 以方便故障的排查
  • LeetCode 1967. 作为子字符串出现在单词中的字符串数目(BM、KMP)

    给你一个字符串数组 patterns 和一个字符串 word 统计 patterns 中有多少个字符串是 word 的子字符串 返回字符串数目 子字符串 是字符串中的一个连续字符序列 示例 1 输入 patterns a abc bc d
  • 【GD32F303开发之开发工具的安装与配置】

    GD32F303开发系列文章目录 第一章 GD32微控制器开发工具的安装与配置 第二章 GD32基准工程实验 第三章 GD32串口通信实验 第四章 GD32EXMC与LCD显示实验 文章目录 GD32F303开发系列文章目录 前言 一 GD
  • 为了使用学校GPU集群而离线安装Python和pytorch

    参考 https blog csdn net zhangdongren article details 82685932 学校GPU集群为无网环境 所以要离线安装 1 下载python 源文件 2 解压到 下的某个目录 make编译源文件
  • 冒泡排序法

    冒泡排序 冒泡排序的排序过程 N个数最外层的for循环次数为 N 1 次 内层for循环为 N 1 i 次 每一轮凑从第1个数开始对比 每一次都是和它下一个元素对比 将最大值元素放到最后 其他元素向前移位 重复以上动作 知道N 1次循环全部
  • 钢琴音阶识别_基础知识:关于大小音阶的简单说明

    大小音阶 Scales 简单说明 音阶是音乐的构造块 building blocks 有上千种不同的音阶 有时称调式 每一种都有其特性与功能 peculiarities and functions 从我们称为 西方 音乐中 从欧洲国家起源的
  • Golang中常用的代码优化点

    写代码其实也有很多套路和经验 这篇介绍几个让golang代码更优雅的四个套路 大家好 我是轩脉刃 这篇想和大家聊一聊golang的常用代码写法 在golang中 如果大家不断在一线写代码 一定多多少少会有一些些代码的套路和经验 这些经验是代
  • Centos SSH免密登录

    1 防火墙操作相关 systemctl stop firewalld 永久关闭防火墙 systemctl disable firewalld 2 关闭Selinux 1 查看状态 getenforce 2 临时关闭 setenforce 0
  • java “Unsupported major.minor version 52.0错误“解决办法

    java Unsupported major minor version 52 0错误 解决办法 java Unsupported major minor version 52 0错误 解决办法 解决办法 java Unsupported
  • Landsat数据下载

    Landsat数据下载步骤 0 Landsat数据介绍 1 下载地址 2 下载步骤 2 1 检索数据 2 1 1 设置地点 有多种方法 2 1 2 选择时间范围 2 1 3 在Data Sets界面选择传感器 卫星或者传感器的名称 2 2
  • el-select可以输入选择项以及选择某一项后出现输入文本框

    效果 直接上代码做笔记 通过ref属性获取输入内容 在 blur中进行赋值 很好的实现了可选择 可输入
  • 进程概念

    基本概念 进程是程序的一个执行实例 从内核来看 进程是担当分配系统资源的实体 注 在Linux操作系统中 大多数指令都是创建了一个个的进程 操做系统如何管理内存 答 使用一个结构体 PCB 来描述进程 使用高效的数据结构来组织进程 描述进程
  • 学习记录-Qt读取条码扫描枪

    一 条码简介 条形码 barcode 是将宽度不等的多个黑条和空白 按照一定的编码规则排列 用以表达一组信息的图形标识符 常见的条形码是由反射率相差很大的黑条 简称条 和白条 简称空 排成的平行线图案 条形码可以标出物品的生产国 制造厂家
  • git强制更新(覆盖)本地仓库与远程仓库一致

    问题描述 在远程改好代码 且改动较多 不想耗费精力进行合并的操作 于是想强制覆盖本地仓库 解决方案 使用以下指令 git fetch all git reset hard origin master
  • 在kali中常见的三种扫描

    第一步 确保要扫描的电脑和执行扫描的电脑是否在同一个网段上 Kali里面查看ip地址的命令为ifconfig ifconfig Win7系统查看IP地址的命令为ipconfig ipconfig 在kali中输入ping 192 168 5
  • 多级菜单 jquery折叠菜单

    多级jquery折叠菜单 前言 效果图 分析 前言 先上代码 DOCTYPE html gt
  • C++模板初阶

    C 模板初阶 泛型编程 函数模板 概念 函数模板格式 函数模板原理 函数模板的实例化 模板参数的匹配原则 类模板 类模板的定义格式 类模板的实例化 泛型编程 我们前面学习了C 的函数重载功能 那么我们如何实现一个通用的交换函数呢 比如 我传
  • git上传遇到 GitHub could not read Username 的解决办法

    Gitversion 1 8 5 2 执行git push命令异常 如下 1 Push failed 2 Failed with error unable to read askpass response from C Users eddy
  • Springboot学习笔记5:整合JDBC

    一 什么是JDBC 在web开发中 不可避免的地要使用数据库来存储和管理数据 为了在java语言中提供数据库访问的支持 Sun公司于1996年提供了一套访问数据的标准Java类库 即JDBC JDBC的全称是Java数据库连接 Java D
  • computed与watch的区别

    一 computed与watch 在之前的练习中本人碰到computed来监听某个数据变化 我们都知道computed与watch都是可以监听数据变化 但具体要怎么区别它们呢 1 1 watch 1 1 1 watch的简单执行