ch-4 计算属性

1 计算属性  1.1 模板内的表达式是非常便利的,但是它们实际上只用于简单的运算。      在模板中放入太多的逻辑会让模板过重且难以维护。
<div id="test1">
           {{str.split(‘‘).reverse().join(‘‘)}}
</div>

      <script>
            let app1 = new Vue({
                 el: ‘#test1‘,
                 data: {
                     str: ‘hello world‘
                 }
            });
      </script>
      这种写法的弊端:            在这种情况下,模板不再简单和清晰。在意识到这是反向显示 str 之前,            你不得不再次确认第二遍。当你想要在模板中多次反向显示 str 的时候,            问题会变得更糟糕。

这就是对于任何复杂逻辑,你都应当使用计算属性的原因。

1.2 基本计算属性
<div id="test2">
                <p>原始的效果:{{str}}</p>
                <p>反转后的效果:"{{reverse}}"</p>
</div>

        <script>
            let app2 = new Vue({
                       el: ‘#test2‘,
                       data: {
                           str: ‘hello world‘
                       },
                       computed: {
                           //computed的getter
                           reverse: function () {
                                return this.str.split(‘‘).reverse().join(‘‘);
                           }
                       }
            });
        </script>
        这里声明了一个计算属性 reverse。        提供的函数将用作属性 vm.reverse 的 getter 。
可以打开浏览器的控制台,自行修改例子中的 app2 。 app2.reverse 的值始终取决于 app2.str 的值。可以像绑定普通属性一样在模板中绑定计算属性。 Vue 知道 app2.reverse 依赖于 app2.str ,因此当 app2.str 发生改变时,所有依赖于 app2.reverse 的绑定也会更新。而且最妙的是我们已经以声明的方式创建了这种依赖关系:计算属性的 getter 是没有副作用,这使得它易于测试和推理。

1.3 计算缓存(计算属性) vs Methods 可以通过调用表达式中的 method 来达到同样的效果
<div id="test2">
            <p>原始的效果:{{str}}</p>
            <p>反转后的效果:"{{reverse}}"</p>
            <p>反转后的效果:"{{reverseMe()}}"</p>
    </div>

    <script>
      let app2 = new Vue({
                 el: ‘#test2‘,
                 data: {
                     str: ‘hello world‘
                 },
                 computed: {
                      reverse: function () {
                          return this.str.split(‘‘).reverse().join(‘‘);
                      }
                  },
                  methods: {
                      reverseMe: function () {
                          return this.str.split(‘‘).reverse().join(‘‘);
                      }
                  }
       });
    </script>

我们可以将同一函数定义为一个 method 而不是一个计算属性。对于最终的结果,两种方式确实是相同的。然而,不同的是计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值。这就意味着只要 str 还没有发生改变,多次访问 reverse 计算属性会立即返回之前的计算结果,而不必再次执行函数。

相比而言,只要发生重新渲染,method 调用总会执行该函数。我们为什么需要缓存?假设我们有一个性能开销比较大的的计算属性 A ,它需要遍历一个极大的数组和做大量的计算。然后我们可能有其他的计算属性依赖于 A 。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用 method 替代。
1.4 Computed 属性 vs Watched 属性  Vue 确实提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:watch 属性。  当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch——特别是如果你之前使用过 AngularJS。  然而,通常更好的想法是使用 computed 属性而不是命令式的 watch 回调。

比较例子:
<div id="test4">{{fullName}}</div>
  <div id="test5">{{fullName}}</div>

  <script>
      let app4 = new Vue({
          el: ‘#test4‘,
          data: {
              firstName: ‘Jeson‘,
              lastName: ‘hu‘,
              fullName: ‘Jesonhu‘
          },
          watch: {
              firstName: function (val) {
                  this.fullName = val +‘ ‘+ this.lastName;
              },
              lastName: function (val) {
                  this.fullName = this.firstName +‘ ‘+ val;
              }
          }
      });

      let app5 = new Vue({
         el: ‘#test5‘,
         data: {
             firstName: ‘Jeson‘,
             lastName: ‘hu‘
         },
         computed: {
             fullName: function () {
                  return this.firstName +‘ ‘+ this.lastName;
             }
         }
      });
  </script>
1.5 计算 setter    计算属性默认只有 getter ,不过在需要时你也可以提供一个 setter
<div id="test6">{{fullName}}</div>

    <script>
      let app6 = new Vue({
              el: ‘#test6‘,
              data: {
                  firstName: ‘Jeson‘,
                  lastName: ‘hu‘
              },
              computed: {
                  fullName: {
                      //getter
                      get: function () {
                          return this.firstName +‘ ‘+ this.lastName
                      },
                      //setter
                      set: function (newValue) {
                          var names = newValue.split(‘ ‘); //数组
                          this.firstName = names[0];
                          this.lastName = names[names.length-1]
                      }
                  }
              }
          });
    </script>
    现在在运行 app6.fullName = ‘John Doe‘ 时, setter 会被调用,    app6.firstName 和 app6.lastName 也相应地会被更新。

2 观察 Watchers  虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的 watcher 。  这是为什么 Vue 提供一个更通用的方法通过 watch 选项,来响应数据的变化。  当你想要在数据变化响应时,执行异步操作或开销较大的操作,这是很有用的。   
				
时间: 2024-11-06 12:09:30

ch-4 计算属性的相关文章

v-once指令、v-cloak指令、条件指令家族、原义指令、循环指令、todolist案例、实例成员-符号、实例成员-计算属性、实例成员-属性监听、监听的案例、局部组件、全局组件、组件交互(父传子、子传父)

v-once指令: v-once:单独使用,限制的标签内容一旦赋值,便不可被动更改(如果是输入框,可以主动修改) <div id="app"> <input type="text" v-model="msg"> <!-- 一旦赋值,只可主动更改 --> <input type="text" v-model="msg" v-once> <p>{{ m

第三节、计算属性

计算属性就是当其依赖的属性的值发生变化的时候,这个属性的值就会自动更新. 例子: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="vue.js"></script> </head> <body> <div id="ap

vue2.0 之计算属性和数据监听

计算属性computed <template> <div> <input type="text" name="" v-model="myVal"><br/> {{ myValueWithoutNum }}<br/> {{ getMyValueWithoutNum() }}<br/> </div> </template> <script> e

Vue之计算属性

上一篇里演示了计算属性的优点,但是,computed和data里的属性还是有区别的,computed的一个弱点就在于依赖于data属性的更新,才能触发视图更新. 举个例子: 上个例子中谈到用v-for来加载妹子图片,现在我想在原先的基础上,添加两个按钮,一个用来增加一个妹子,一个用来减少一个妹子: html: <div id="vfor"> <template v-for="mm in mms"> <span>{{mm.name}

vue入门(二)----模板与计算属性

其实这部分内容我也是参考的官网:http://cn.vuejs.org/v2/guide/syntax.html,但是我还是想把自己不懂的知识记录一下,加深印象,也可以帮助自己以后查阅.所谓勤能补拙. 首先我们说一下模板,其实如果看过第一节vue入门----组件,我们会知道更好更科学的办法是通过创建组件的方式,这种方式允许我们任意进行组件的嵌套.而通过模板的方式的话,个人觉得效果并没有组件好.行,开始切入正题,现在我们首先通过一下几点来进行学习(其实是按照官网的顺序记录自己不懂的知识点). 1.

Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等

写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号. 一.类与结构体 两者在Swift中差不了多少了 类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的) 1)都可以定义属性/方法/下标(结构体也可以定义方法了) 2)都能初始化(通过构造方法) 3)都能使用扩展(extension)与协议(protocol) 4)类与结构体(枚举)中的全局属性/方法:在类中用class关键字,但在结构体中

Swift::2::计算属性

计算属性(Computed Properties) 属性 属性一般用于类(class),结构体(struct),枚举(emun)作为存储数据,swift 的属性也像OC一样,拥有 getters 和 setters方法. 而所谓的计算属性,和一般的属性的区别,仅仅是它不存储数据,而是使用已有的属性(有存储作用的属性),进行运算,而后通过getter 和 setter 反馈结果. 下面是一个例子,例子中自定义一个时间类,类中,seconds 是唯一的存储属性,而miniutes,hours,day

vue.js基础知识篇(3):计算属性、表单控件绑定

第四章:计算属性 为了避免过多的逻辑造成模板的臃肿不堪,可使用计算属性来简化逻辑. 1.什么是计算属性 <!DOCTYPE html> <html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <div id="example"> <

Swift中对计算属性的理解和对之前的补充

这个功能的重点作用应该是在计算上. 对于一般的属性,要么直接存一个,要么直接读一个,计算属性则可以根据所设置内容,进行一些修改或计算之类的, 比如: import UIKit class sample { var no1 = 0.0, no2 = 0.0 var length = 300.0, breadth = 150.0 var middle:(Double,Double) { get { return(length / 2, breadth / 2) } // 如果没有加上括号, 那么默认

vue学习笔记 计算属性(四)

计算属性就是vue实例里的computed属性,对应一个对象,里面可以放各种方法,方法的作用就是可以生成和数据变量对应的计算后的变量,跟数据相关的复杂逻辑变量,都可以使用计算属性实现,computed里的函数名,对外就是一个变量,默认是getter. <div id="example"> <p>Original message: "{{ message }}"</p> <p>Computed reversed mess