Vue--computed与watch的区别

深碍√TFBOYSˉ_ 2023-10-01 12:23 126阅读 0赞

原文网址:Vue—computed与watch的区别_IT利刃出鞘的博客-CSDN博客

简介

说明

本文介绍Vue的computed与watch的区别。

官网

计算属性和侦听器 — Vue.js

API — Vue.js

computed与watch对比












































computed

watch

依赖的数量

依赖的数据可以是1个,也可以是多个。

依赖的数据是1个。

使用场景

一个属性依赖于多个属性。

某个属性变动时进行一些操作。

使用的格式

必须监听存在的属性(data、props、computed)

不能和data定义的变量相同

类型

是一个函数。

函数或者是对象。

异步

不支持异步。

在computed里面操作异步无效。

支持异步

触发时机

初始化时就可被监听到并且计算

发生改变的时候才会触发

缓存

支持缓存。

依赖数据发生改变才重新计算。

不支持缓存。

每次都重新计算。

computed

简介

computed是一个函数,要有返回值。

函数的返回值就是属性的属性值。

默认走getter(必须有返回值)。

示例

代码

Demo.vue

  1. <template>
  2. <div class="hello">
  3. <input v-model.number="num1" type="number">+
  4. <input v-model.number="num2" type="number">=
  5. {
  6. { num3 }}
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. name: 'Demo',
  12. data() {
  13. return {
  14. num1: 0,
  15. num2: 0
  16. }
  17. },
  18. computed: {
  19. num3() {
  20. return this.num1 + this.num2
  21. }
  22. },
  23. }
  24. </script>
  25. <style scoped>
  26. </style>

路由(store/index.js)

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import Demo from "../views/Demo";
  4. Vue.use(Router)
  5. export default new Router({
  6. routes: [
  7. {
  8. path: '/demo',
  9. name: 'Demo',
  10. component: Demo,
  11. }
  12. ],
  13. })

测试

访问:http://localhost:8080/#/demo

4d4d2e4305f34e038ad5c86f41f28850.png

输入数字

e508c794bd2f4d7d99beed8f8173d4b3.gif

watch

简介

watch可以是函数,也可以是对象。

如果是函数

监听的函数接收两个参数,第1个参数是新值;第2个参数是旧值。

如果是对象

有三个属性:handler、immediate、deep。

  1. handler

    1. 是监听的处理器。
    2. 跟函数写法基本一样。也是:第1个参数是新值;第2个参数是旧值。
  2. immediate

    1. 默认第一次绑定的时候不执行函数。即:默认为false。
    2. 如果想要绑定时就执行可设置immediate属性为true。
  3. deep

    1. 深度监听
    2. 如果监听一个对象,对象里的某个属性发生变化是触发不到函数的。
    3. 加上deep:true可以监听到对象里的属性。但是这样会为该对象中的所有属性都添加上该属性,任何属性发生变化都会触发函数。
    4. 若只监听某个属性,可采用”对象名.属性名”的字符串作为监听对象属性。
    5. 一维二维数组是不需要深度监听的,但是数组里面有对象也是需要深度监听的。

示例:函数写法

代码

Demo.vue

  1. <template>
  2. <div class="hello">
  3. <input v-model.number="num1" type="number">+
  4. <input v-model.number="num2" type="number">=
  5. {
  6. { num3 }}
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. name: 'Demo',
  12. data() {
  13. return {
  14. num1: 0,
  15. num2: 0,
  16. num3: 0
  17. }
  18. },
  19. watch: {
  20. num1(newVal, oldVal) {
  21. console.log('num1=> oldVal: ' + oldVal);
  22. console.log('num1=> newVal: ' + newVal);
  23. this.num3 = this.num1 + this.num2
  24. },
  25. num2(newVal, oldVal) {
  26. console.log('num2=> oldVal: ' + oldVal);
  27. console.log('num2=> newVal: ' + newVal);
  28. this.num3 = this.num1 + this.num2
  29. }
  30. },
  31. }
  32. </script>
  33. <style scoped>
  34. </style>

路由(store/index.js)

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import Demo from "../views/Demo";
  4. Vue.use(Router)
  5. export default new Router({
  6. routes: [
  7. {
  8. path: '/demo',
  9. name: 'Demo',
  10. component: Demo,
  11. }
  12. ],
  13. })

测试

测试1:访问

访问:http://localhost:8080/#/demo

a5dd2a59898c4c3f9f4869a401279d27.png

测试2:修改属性的值

6752268c880e445099138c214b04f513.gif

示例:对象写法

代码

Demo.vue

  1. <template>
  2. <div class="hello">
  3. <input v-model.number="num1" type="number">+
  4. <input v-model.number="num2" type="number">=
  5. {
  6. { num3 }}
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. name: 'Demo',
  12. data() {
  13. return {
  14. num1: 0,
  15. num2: 0,
  16. num3: 0
  17. }
  18. },
  19. watch: {
  20. num1: {
  21. // 这里第一个参数是新值,第二个是老值。
  22. handler(newVal, oldVal) {
  23. console.log('num1=> oldVal: ' + oldVal);
  24. console.log('num1=> newVal: ' + newVal);
  25. this.num3 = this.num1 + this.num2;
  26. },
  27. immediate: true
  28. },
  29. num2: {
  30. // 这里第一个参数是新值,第二个是老值。
  31. handler(newVal, oldVal) {
  32. console.log('num2=> oldVal: ' + oldVal);
  33. console.log('num2=> newVal: ' + newVal);
  34. this.num3 = this.num1 + this.num2;
  35. }
  36. },
  37. },
  38. }
  39. </script>
  40. <style scoped>
  41. </style>

路由(router/index.js)

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import Demo from "../views/Demo";
  4. Vue.use(Router)
  5. export default new Router({
  6. routes: [
  7. {
  8. path: '/demo',
  9. name: 'Demo',
  10. component: Demo,
  11. }
  12. ],
  13. })

测试

测试1:访问

访问:http://localhost:8080/#/demo

146ea8996e3940e39d27135aa355f66f.png

可以看到,如果设置了immediate为true,则一进去就会触发。

测试2:修改属性值

a84810abb2994e88883a3b34cbd690a4.gif

示例:对象写法(监听部分属性)

代码

Demo.vue

  1. <template>
  2. <div class="hello">
  3. <input v-model.number="data1.num" type="number">+
  4. <input v-model.number="data2.num" type="number">=
  5. {
  6. { num3 }}
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. name: 'Demo',
  12. data() {
  13. return {
  14. data1: {
  15. num: 0,
  16. },
  17. data2: {
  18. num: 0,
  19. },
  20. num3: 0
  21. }
  22. },
  23. watch: {
  24. 'data1.num': {
  25. // 这里第一个参数是新值,第二个是老值。
  26. handler(newVal, oldVal) {
  27. this.num3 = this.data1.num + this.data2.num;
  28. },
  29. immediate: true
  30. },
  31. 'data2.num': {
  32. // 这里第一个参数是新值,第二个是老值。
  33. handler(newVal, oldVal) {
  34. this.num3 = this.data1.num + this.data2.num;
  35. }
  36. },
  37. },
  38. }
  39. </script>
  40. <style scoped>
  41. </style>

路由(router/index.js)

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import Demo from "../views/Demo";
  4. Vue.use(Router)
  5. export default new Router({
  6. routes: [
  7. {
  8. path: '/demo',
  9. name: 'Demo',
  10. component: Demo,
  11. }
  12. ],
  13. })

测试

访问:http://localhost:8080/#/demo

035cb032691a47fab9cb4fba4751b6eb.gif

发表评论

表情:
评论列表 (有 0 条评论,126人围观)

还没有评论,来说两句吧...

相关阅读