Vue学习笔记之使用computed计算属性

0x00 概述

本文主要记录Vue页面使用computed计算属性

0x01 computed基本使用

在computed中定义一个函数(看起来是一个函数,其实是一个属性),命名按照属性规范命名(一般为名词)

1.1 应用场景

当数据A的逻辑很复杂时,把A这个数据写在计算属性中

1.2 代码位置

通过选项computed:{计算属性a:值}

1.3 返回值

带有返回值return的函数

计算属性a和data中的数据用法一样。 计算属性在computed中进行定义,无需再在data中定义, 在template中直接可进行使用,使用方式与data中定义的数据一样

代码语言:javascript
复制
<body>
  <div id='app'>
    {{msg}}
    <hr>
    {{str}}
  </div>
  <script src='./vue.js'></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        msg: 'abc'
      },
      computed: {
        str: function () {
          return this.msg
        }
      },
      methods: {
      }
    })
  </script>
</body>

执行结果:

0x02 复杂操作-结合data中数据

当计算属性b依赖了data中的数据a时,当a变化时,b会自动变化。

这也是在开发中通常用到的情况。比如在购物的时候,下某一订单时,每选择一件商品(对应data中的数据a),合计费用(对应计算属性b)就会跟着变化。

 下方的例子即模拟上方的效果:

代码语言:javascript
复制
<body>
  <div id='app'>
    <h2>总价格:{{totalPrice}}</h2>
  </div>
  <script src='./vue.js'></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        books: [
          { id: 1000, name: 'Linux编程之美', price: 50 },
          { id: 1001, name: 'Java疯狂讲义', price: 60 },
          { id: 1002, name: '深入理解计算机原理', price: 80 },
          { id: 1003, name: '操作系统', price: 30 },
          { id: 1004, name: '数据结构导论', price: 60 },
        ]
      },
      computed: {
        totalPrice() {
          let result = 0;
          for (let i = 0; i < this.books.length; i++) {
            result += this.books[i].price;
          }
          return result
        }
      },
      methods: {
      }
    })
  </script>
</body>

执行结果:

0x03 计算属性写法演变

3.1 计算属性的setter和getter

代码语言:javascript
复制
computed:{ 
//computed里面是大括号,本身就是对象。
}

3.2 完整的计算属性写法:属性+方法

代码语言:javascript
复制
computed: {
    //定义属性
    totalPrice: {
      //totalPrice 属性对应的是对象,不是字符串。对象就会有方法。
      //该属性对应的set方法 和get方法
      //计算属性一般是没有set方法的,是只读属性。
      //【此处set测试失败  没有出现预期效果】
      set: function (newValue) {
        console.log(&#39;get方法调用啦&#39;, newValue);
      },
      get: function () {
        console.log(&#39;计算属性完整写法:计算啦&#39;);
        let result = 0;
        for (let i = 0; i &lt; this.books.length; i++) {
          result += this.books[i].price;
        }
        return result
      }
    }
  },</code></pre></div></div><h4 id="3ijgk" name="3.3-%E8%AE%A1%E7%AE%97%E5%B1%9E%E6%80%A7%E4%B8%80%E8%88%AC%E5%8F%AA%E6%9C%89get%E6%96%B9%E6%B3%95%EF%BC%8C%E6%98%AF%E5%8F%AA%E8%AF%BB%E5%B1%9E%E6%80%A7">3.3 计算属性一般只有get方法,是只读属性</h4><p>一般写法为</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">computed: {
    totalPrice: function () {
    //后面对应的即为get方法。totalPrice就是一个属性,调用时采用属性调用的方式,区别于方法调用()
      console.log(&#39;计算属性一般写法:计算啦&#39;);
     let result = 0;
       for (let i = 0; i &lt; this.books.length; i++) {
        result += this.books[i].price;
         }
         return result
     }
},</code></pre></div></div><h4 id="d7iiu" name="3.4-%E8%AF%AD%E6%B3%95%E7%B3%96%E2%80%94%E7%AE%80%E5%8C%96%E5%86%99%E6%B3%95">3.4 语法糖—简化写法</h4><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">computed: {
     totalPrice() {
      console.log(&#39;计算属性语法糖写法:计算啦&#39;);
      let result = 0;
      for (let i = 0; i &lt; this.books.length; i++) {
         result += this.books[i].price;
     }
       return result
     }
  },</code></pre></div></div><h3 id="ersak" name="0x04-%E9%A1%B9%E7%9B%AE%E4%B8%AD%E5%AE%9E%E4%BE%8B">0x04 项目中实例</h3><p>以上即为计算属性computed的使用方式。最近在项目开发中,有个需求为:【考试配题模块】配置某一题型(例如选择题/简答题等某类试题)个数或者每一小题分数时,会实时计算出当前选择的某类试题拥有的个数和当前题目个数所对应的小题分数的总分之和。如图所示效果:</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723269647056878852.png" /></div></div></div></figure><p> template中代码:</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">            &lt;el-card class=&#34;box-card&#34; style=&#34;height:120px ;font-size:14px&#34;&gt;
          &lt;div class=&#34;subjectName&#34;&gt;课程名称:{{ courseName }}&lt;/div&gt;
          &lt;div&gt;总题数:{{ allQuestion }}个&lt;/div&gt;
          &lt;div&gt;当前总分:{{ allValue }}分&lt;/div&gt;
        &lt;/el-card&gt;</code></pre></div></div><p>computed中代码:</p><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">    allQuestion: function() {
  var num = 0;
  this.selectedObj.forEach((item) =&gt; {
    num += item.questionNum;  //questionNum为拿到的selectedObj对象中的需要使用的属性
  });
  return num;
},
//计算总分
allValue: function() {
  var source = 0;
  this.selectedObj.forEach((item) =&gt; {
    source += item.questionValue * item.questionNum; //questionValue 为拿到的selectedObj对象中的需要使用的属性
  });
  return source;
},

},

computed中依赖的data中数据部分:

代码语言:javascript
复制
      // 子组件给父组件传过来的对象
selectedObj: [],