欢迎莅临 SUN WU GANG 的园子!!!

世上无难事,只畏有心人。有心之人,即立志之坚午也,志坚则不畏事之不成。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  470 随笔 :: 0 文章 :: 22 评论 :: 30万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

监视属性和计算属性对比:computed和watch之间的区别

  1. 计算属性computed能完成的功能,watch都可以完成
  2. 监听属性watch能完成的功能,computed计算属性不一定能完成,例如:watch可以进行异步操作

两个重要小原则:

  1. 所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象。
  2. 所有不被vue所管理的函数(定时器的回调函数、ajax的回调函数等),最好写成箭头函数,这样this的指向才是vm或组件实例对象。

监视属性示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!DOCTYPE html>
<html lang="en">
 
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>姓名示例</title>
  <script type="text/javascript" src="../Js/vue.js"></script>
</head>
 
<body>
  <div id="root">
    姓:<input type="text" v-model="firstName"></br>
    名:<input type="text" v-model="lastName"></br>
    全名:<span>{{fullName}}</span>
  </div>
</body>
 
</html>
<script type="text/javascript">
  //console.log(vm)
  const vm = new Vue({
    el: '#root',
    data: {
      firstName: '张',
      lastName: '三',
      fullName: '张-三'
    },
    // watch 监视
    watch:
    {
      // 简写
      firstName (val) {
        //简写方式 只能有 handler 不能有其他设置,如上代码deep: true,存在的话,则不可简写
        this.fullName = val + '-' + this.lastName
      },
      lastName (val) {
        //简写方式 只能有 handler 不能有其他设置,如上代码deep: true,存在的话,则不可简写
        this.fullName = this.firstName + '-' + val
      },
 
    }
 
 
  })
 
</script>

 

计算属性:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<!DOCTYPE html>
<html lang="en">
 
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>姓名示例</title>
  <script type="text/javascript" src="../Js/vue.js"></script>
</head>
 
<body>
  <div id="root">
    姓:<input type="text" v-model="firstName"></br>
    名:<input type="text" v-model="lastName"></br>
    全名:<span>{{fullName}}</span>
  </div>
</body>
 
</html>
<script type="text/javascript">
  // -------------------计算属性-------------------
  const vm = new Vue({
    el: '#root',
    data: {
      firstName: '张',
      lastName: '三',
    },
    computed: {
      // 简写,简写时确保不用settter
      // myfullname: function () {
      fullName () {
        console.log('get 被调用了')
        return this.firstName + '|' + this.lastName
      }
    },
 
 
  })
 
 
  // -------------------监视属性-------------------
  //console.log(vm)
  /* const vm = new Vue({
    el: '#root',
    data: {
      firstName: '张',
      lastName: '三',
      fullName: '张-三'
    },
    // watch 监视 属性
    watch:
    {
      // 简写
      firstName (val) {
        //简写方式 只能有 handler 不能有其他设置,如上代码deep: true,存在的话,则不可简写
        this.fullName = val + '-' + this.lastName
      },
      lastName (val) {
        //简写方式 只能有 handler 不能有其他设置,如上代码deep: true,存在的话,则不可简写
        this.fullName = this.firstName + '-' + val
      },
 
    },
 
  })
 */
 
 
</script>

 查看官网资料:https://v2.cn.vuejs.org/v2/guide/computed.html#%E8%AE%A1%E7%AE%97%E5%B1%9E%E6%80%A7-vs-%E4%BE%A6%E5%90%AC%E5%B1%9E%E6%80%A7

 示例二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<!DOCTYPE html>
<html lang="en">
 
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>姓名示例</title>
  <script type="text/javascript" src="../Js/vue.js"></script>
</head>
 
<body>
  <div id="root">
    姓:<input type="text" v-model="firstName"></br>
    名:<input type="text" v-model="lastName"></br>
    全名:<span>{{fullName}}</span>
  </div>
</body>
 
</html>
<script type="text/javascript">
  // -------------------计算属性-------------------
  // const vm = new Vue({
  //   el: '#root',
  //   data: {
  //     firstName: '张',
  //     lastName: '三',
  //   },
  //   computed: {
  //     // 简写,简写时确保不用settter
  //     // myfullname: function () {
  //     fullName () {
  //       console.log('get 被调用了')
  //       return this.firstName + '|' + this.lastName
  //     }
  //   },
 
 
  // })
 
 
  // -------------------监视属性-------------------
  const vm = new Vue({
    el: '#root',
    data: {
      firstName: '张',
      lastName: '三',
      fullName: '张-三'
    },
    // watch 监视 属性
    watch:
    {
      // 简写
      firstName (val) {
        //简写方式 只能有 handler 不能有其他设置,如上代码deep: true,存在的话,则不可简写
        // 异步等待,等待三秒后执行
        setTimeout(() => {
          this.fullName = val + '-' + this.lastName
        }, 3000)
      },
      lastName (val) {
        //简写方式 只能有 handler 不能有其他设置,如上代码deep: true,存在的话,则不可简写
        this.fullName = this.firstName + '-' + val
      },
 
    },
 
  })
 
 
 
</script>

注:监听属性可实现异步等待操作,而计算属性中不可

 

 

 

  

posted on   sunwugang  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示