Vue中watch、computed和methods的区别

更新日期: 2021-11-05阅读: 901标签: 区别

1 前言

创建一个vue实例时,可以传入一个选项对象

const vm = new Vue({
  data: {
    msg: 'hello'
  },
  computed: {},
  methods: {},
  watch: {}
})

这个选项对象可以指定非常多的选项(或者说属性),和数据相关的选项有:包括但不限于data、methods、computed、watch等等

其中methods、computed、watch都能通过函数来对数据进行处理或作出响应,这三者有差异,但很容易混淆

2 基础用法

用script引入vue.js,下面的代码都在如下html中运行

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Methods</title>
    <!-- 引入 vue.js -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
  </head>
  <body>
    
  </body>
  <script>
    
  </script>
</html>

2.1 methods 方法

methods选项中的定义的函数称为方法,在Vue实例化的过程中,methods对象中的方法将被混入到Vue实例中,成为Vue实例的方法。可以直接通过Vue实例访问这些方法

<body>
  <div id="example">
    <!-- 显示:a:1 -->
    <p>a:{{ plus() }}</p> 
  </div>
</body>
<script>
  const vm = new Vue({
    el: "example",
    data: {
      a: 0,
    },
    methods: {
      plus: function () {
        return this.a + 1;
      },
    },
  });
  console.log(vm); // 查看控制台输出的vm,可以看到它有一个方法是:plus: ƒ (),⚠️注意是方法
  console.log(vm.plus()); // 直接通过vm实例访问方法,输出:1
</script>

需要主动调用methods中的函数才能执行,a的值改变并不能让页面中的<p>a:{{plus()}}</a>跟着更新

2.2 computed 计算属性

computed选项中定义的函数称为计算属性,在Vue实例化的过程中,computed对象中的计算属性将被混入到Vue实例中,成为Vue实例的同名属性

<body>
  <div id="example">
    <!-- 显示:a:1 -->
    <p>a:{{ plus }}</p>
  </div>
</body>
<script>
  const vm = new Vue({
    el: "example",
    data: {
      a: 0,
    },
    computed: {
      plus: function () {
        return this.a + 1;
      },
    },
  });
  console.log(vm); // // 查看控制台输出的vm,可以看到它有一个属性是:plus:1,⚠️注意是属性
</script>

乍一看好像computed和methods功能一样,确实在这个例子中二者展示效果相同

事实上通过打印vm实例以及访问方式已经体现出二者的一个不同之处:

  • methods中的函数会成为vm的方法
  • 而computed中的函数经过计算后会成为vm的同名属性,属性值为函数的计算结果,即返回值

另外,和方法不同的是,计算属性能够跟着它依赖的数据变化而进行响应式更新,即a变化时,plus属性也会更新

2.3 watch 侦听器

watch选项中的键值对称为侦听器或者说监听属性/监听属性,键是需要观察的表达式,值是对应的回调函数(值还可以是其他形式,此处不展开)

在Vue实例化的过程中,这些需要侦听的变量会被记录下来,当这些变量发生变化的时候,对应的回调函数就会执行

<body>
  <div id="example">
    <!-- 显示:a:1 -->
    <p>a:{{ a }}</p>
  </div>
</body>
<script>
  const vm = new Vue({
    el: "example",
    data: {
      a: 0,
    },
    watch: {
      a: function () {
        console.log("a发生了变化"); // 因为a的值变了,回调函数执行
        console.log(this.a);
      },
    },
  });
  vm.a = 1; // 这里直接手动改变a的值
</script>

3 三者的区别

3.1 方法 VS 计算属性

除了2.2中已经提到的两点区别之外,还有最重要的区别是:

  • 计算属性是基于它们的响应式依赖进行缓存的

    即上文中的a发生变化时,才会重新触发求值函数,否则多次调用都会从缓存中求值

    这对开销较大的计算来说非常有用,可以避免重复计算

  • 方法则是调用时总会重新执行

下面用表格的形式对这两者的区别进行总结:

methodscomputed
Vue实例化后成为vm实例的什么成为vm实例上的方法成为vm实例上的属性
能否根据依赖的数据进行响应式更新不能,需要主动调用方法
能否缓存不能,每次调用重新执行能,依赖的数据不变,会从缓存中取值

3.2 计算属性 VS 侦听器

  • 首先最明显的区别,侦听器的命名方式是固定的,想要监听谁,就和谁同名。而方法和计算属性可任意命名

  • 其次,侦听器无法主动进行访问,而另外两者都能主动访问

  • 计算属性和侦听器的使用场景:

    如果某个值需要通过一个或多个数据计算得到,就使用计算属性

    侦听属性主要是监听某个值的变化,然后进行需要的逻辑处理;此外当需要在数据变化时执行异步或开销较大的操作时,侦听属性就比较有用,具体例子可见vue文档-侦听器


链接: https://www.fly63.com/article/detial/10778

AR / MR / VR / XR有什么区别?

VR能让人完全沉浸在虚拟环境中;AR能创建一个叠加在虚拟内容的世界,但不能与真实环境交互; MR则是虚拟与现实的混合体,它能创造出可以与真实环境交互的虚拟物体。最后,XR则是包括三种“现实”(AR,VR,MR)的术语。

详解call bind apply区别/使用场景/es6实现/es3实现

call,apply,bind的区别:apply接收数组 func.apply(obj, [arus]),call一连串参数 func.call(obj, param1, param2....),bind返回一个函数 func.bind(obj,param...)(parms...)

理解screenX,clientX,pageX,offsetX,pageXoffset的区别

event.screenX、event.screenY鼠标相对于用户显示器屏幕左上角的X,Y坐标。标准事件和IE事件都定义了这2个属性,event.clientX、event.clientY鼠标相对于浏览器可视区域的X,Y坐标

css之word-wrap和word-break的区别

对于英文单词,如果有一个连写且长度很长的英文单词,在第一行显示不下的情况下,浏览器默认不会截断显示,而是把这个单词整体挪到下一行。但是当整体挪到下一行还是显示不完全该肿么办呢?

url 、src 、href 的区别

URL统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL

Js插件、 组件、类库、框架的区别

框架和类库等概念的出现都是源于人们对复用的渴望。“不要重复发明轮子”,成了软件界的一句经典名言。从最初的单个函数源代码的复用,到面向对象中类的复用(通常以类库的形式体现)

*.min.js跟*.js的区别

js是JavaScript 源码文件, .min.js是压缩版的js文件。减小体积 .min.js文件经过压缩,相对编译前的js文件体积较小,传输效率快。防止窥视和窃取源代码

PTN与SDH的区别?

SDH是基于TDM技术,主要用于传输语音,此外采用GFP封装来传输IP包,物理介质为光纤。PTN是采用DWDM技术,主要用于传输IP包、以太网帧,此外采用MPLS-TP技术来实现PWE3伪线

html中src与href的区别

写代码的时候就经常把这两个属性弄混淆,到底是href还是src,href表示超文本引用,用在link和a等元素上,href是引用和页面关联,是在当前元素和引用资源之间建立联系,src表示引用资源,表示替换当前元素,用在img,script,iframe上

Js绑定事件的两种方式的区别

运行后发现,点击后src没有变化,调试发现,这里this是window对象,而不是img标签对象。顿时感觉有点迷惑,因为以前绑定事件中,拿标签属性都是用的this,怎么这里不对了?

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!