vue入门篇(六):计算属性和侦听器

你说的曾经没有我的故事 提交于 2020-02-27 01:46:04

前言

我们在前面提到,插值表达式里面可以执行JavaScript代码,但是当我们的表达式很复杂时就很难去维护了,而且也不直观。Vue给我们提供了两个十分有用的选项属性:computedwatch,下面我们来看看怎么使用吧。

计算属性computed

计算属性有两种写法,一个是函数,另外一个是对象。当为函数时,默认调用计算属性的get方法,下面我们看一个简单的例子:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      firstName: <input type="text" v-model="firstName" /><br />
      lastName:<input type="text" v-model="lastName" /><br />
      fullName:<input type="text" v-model="fullName" />
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
      const vm = new Vue({
        el: "#app",
        data: {
          firstName: "Lao",
          lastName: "Cao"
        },
        //计算属性
        computed: {
          // 函数用法,默认调用get方法
          fullName() {
            return `${this.firstName} ${this.lastName}`;
          }
        }
      });
    </script>
  </body>
</html>

我们可以看到fullName的值取决于firtNamelastName的值,而且减轻了模板的负担,并且一目了然。除了函数的用法还有对象的用法:

   computed: {
     // 对象用法,自定义get和set
     fullName: {
       get() {
         return `${this.firstName} ${this.lastName}`;
       },
       set(newValue) {
         let names = newValue.split(" ");
         this.firstName = names[0];
         this.lastName = names[names.length - 1];
       }
     }
   }

这种方式可以自定义computed的行为,比如我们设置fullName的值,可以动态计算出firtNamelastName的值。

那么计算属性解决了什么问题呢,对比methods有什么优势呢?

计算属性解决了模板的复杂逻辑运算问题,当计算属性不变,其他属性发生改变,页面重新渲染后,计算属性不会再执行,因为初始执行后有缓存,计算属性是基于它们的响应式依赖进行缓存的。计算属性可以提升渲染的性能,方法是没有缓存的,调用一次就要计算一次。

当然也不是说methods很不好,当我们不需要缓存的时候就可以使用methods的方式来计算属性的值。

侦听器watch

watch的作用和computed差不多,它监听属性的变化,只有当属性发生变化才去执行,实现起来比前两种要麻烦一点。而且,在相同情况下,使用计算属性的性能比侦听器和方法要好很多,但是它肯定有它存在的理由的,当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

比如说当我们需要监听一个数据的变化,并且我们要在它中间变更其他数据的状态,这时使用watch就很合适了。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>

  <body>
    <div id="app">
      fullName:<input type="text" v-model="fullName" /><br />
      {{gender}}
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
      const vm = new Vue({
        el: "#app",
        data: {
          fullName: "Lao Cao",
          gender: 'male'
        },
        watch: {
          fullName (newValue) {
              if (newValue === '美女') {
                  this.gender = 'female'
              }
          }
        }
      });
    </script>
  </body>
</html>

上面的例子中,我们输入美女后,fullName监听到了数据变化,从而设置gender属性为female。这个例子虽然简单,但是也能够看到watch的作用了。

总结

这篇文章主要讲述了计算属性computed和侦听器watch的使用场景以及它们的区别,computed适合需要复杂计算表达式的场景,而watch适合一切开销比较大的场景如异步请求。在实际开发中,合理搭配使用会让我们开发效率和代码质量大大提高。

参考

【1】计算属性和侦听器

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!