Vue.js教程之计算属性

让我来为你详细讲解一下“Vue.js教程之计算属性”的完整攻略。

什么是计算属性?

在 Vue.js 中,计算属性(Computed)是一种在模板中使用的属性,通过计算属性我们可以实现一些动态的内容展示或逻辑处理,并且相较于使用方法或侦听器等方式,计算属性的实现更为简便、高效。

我们可以在 Vue 实例中使用 computed 属性来定义计算属性,该属性是一个由计算属性名与计算属性函数组成的对象,其中计算属性名是在模板中使用的名称,而计算属性函数则是用来计算并返回计算属性值的函数。

计算属性的基本使用

下面通过一个实例来演示如何定义和使用计算属性。

假设我们需要在一个商品列表页面中展现每个商品的折后价格以及每个商品的总价。其中每个商品的折后价格计算需考虑折扣率,而每个商品的总价计算需考虑商品数量和折后价。基于这个需求,我们可以使用计算属性来实现。

<template>
  <div>
    <h2>商品列表</h2>
    <ul>
      <li v-for="item in items" :key="item.id">
        <span>{{ item.name }}</span>
        <span>{{ item.price }}</span>
        <span>{{ item.discount }}</span>
        <span>{{ item.count }}</span>
        <span>{{ item.finalPrice }}</span>
        <span>{{ item.totalPrice }}</span>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: '商品A', price: 100, discount: 0.8, count: 2 },
        { id: 2, name: '商品B', price: 200, discount: 0.9, count: 1 },
        { id: 3, name: '商品C', price: 300, discount: 0.5, count: 5 }
      ],
    }
  },
  computed: {
    finalPrice() {
      return this.items.map(item => item.price * item.discount);
    },
    totalPrice() {
      return this.items.map(item => item.price * item.discount * item.count);
    }
  }
}
</script>

在这个例子中,我们在 Vue 实例中定义了两个计算属性 finalPricetotalPrice,分别用来计算每个商品的折后价格以及商品的总价,并在模板中使用这两个计算属性来展现这些信息。

计算属性的缓存

在使用计算属性时,我们需要注意计算属性的缓存机制。在计算属性的计算函数内部,我们可以访问到 Vue 实例中的其他属性,当这些属性发生变化时,计算属性也会重新计算。而在重新计算计算属性时,如果同一个属性的值没有发生变化,那么计算属性会直接返回上一次计算的结果,而不再执行计算函数,这就是计算属性的缓存机制。

<template>
  <div>
    <p>单价:<input type="text" v-model="price"></p>
    <p>数量:<input type="text" v-model="count"></p>
    <p>总价:{{ totalPrice }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      price: 0,
      count: 0
    }
  },
  computed: {
    totalPrice() {
      console.log('totalPrice is recalculated.');
      return this.price * this.count;
    }
  }
}
</script>

在这个例子中,我们定义了一个计算属性 totalPrice,并在 Vue 实例中定义了两个数据属性 pricecount,用来计算总价。当我们在页面中输入单价和数量时,totalPrice 会重新计算,同时我们在计算函数中加入了 console.log 语句,用来查看在何时会触发计算函数的重新计算。

从结果来看,当我们在输入单价和数量后,第一次计算总价时会触发计算函数的计算,同时输出 totalPrice is recalculated.;当我们再次改变单价或数量时,计算函数不再重新计算,而是直接返回上一次计算的结果。

优化的计算属性

在一些特殊的场景下,计算属性的计算函数内部可能会涉及到耗时的操作,例如在数据源较大的情况下进行过滤或排序操作、进行较为复杂的字符串格式化等等。在这些场景下,由于计算函数的执行频率会比较高,可能会导致应用程序的性能出现瓶颈。

针对这些问题,我们可以通过缓存计算结果的方式来优化计算属性的实现。具体实现方式为使用一个数据属性来存储计算结果,并在计算函数内部判断当前数据源与上次数据源是否相同,如果相同则直接返回上次的结果,否则重新进行计算,并将计算结果存储到数据属性中。

<template>
  <div>
    <p>排序方式:<input type="text" v-model="sort"></p>
    <ul>
      <li v-for="item in sortedItems" :key="item.id">
        <span>{{ item.name }}</span>
        <span>{{ item.price }}</span>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: '商品A', price: 100 },
        { id: 2, name: '商品B', price: 200 },
        { id: 3, name: '商品C', price: 300 }
      ],
      sort: '',
      sortedResult: null
    }
  },
  computed: {
    sortedItems() {
      if (this.sortedResult && JSON.stringify(this.items) === this.sortedResult.source) {
        console.log('use the cache');
        return this.sortedResult.result;
      } else {
        console.log('recalculated');
        const result = this.items.slice();
        if (this.sort) {
          result.sort((a, b) => {
            return a[this.sort].toString().localeCompare(b[this.sort].toString());
          });
        }
        this.sortedResult = { source: JSON.stringify(this.items), result };
        return result;
      }
    }
  }
}
</script>

在这个例子中,我们定义了一个计算属性 sortedItems,并在 Vue 实例中定义了一个数组 items 和一个字符串 sort,用来进行排序操作。在计算函数内部,我们使用了一个 sortedResult 变量来缓存计算结果,通过判断数据源是否相同来决定是否使用缓存的计算结果。以此来优化计算属性的实现。

到这里,我们对Vue.js计算属性的使用和优化都有了一定的认识,如果你还有什么疑问或需要深入了解的问题,欢迎提问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue.js教程之计算属性 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Vue.js项目模板搭建图文教程

    下面是Vue.js项目模板搭建的完整攻略: Vue.js项目模板搭建图文教程 1. 确保Node.js和npm已经安装 在开始之前,请确保已经在本地安装好Node.js和npm。如果你还没安装,可以在Node.js官网下载安装:https://nodejs.org/en/ 2. 安装Vue CLI 在命令行中输入以下命令,使用npm全局安装Vue CLI: …

    Vue 2023年5月27日
    00
  • vue绑定class与行间样式style详解

    Vue绑定class与行间样式style详解 在Vue中,我们可以通过v-bind指令来绑定元素的class和行间样式style,实现动态控制页面样式的效果。 绑定class 对象语法 在模板中,使用v-bind:class指令来绑定class。当对象中的属性值为true时,class会被应用到元素上,反之该class不会被应用。 示例代码如下: <t…

    Vue 2023年5月27日
    00
  • 教你用Vue基础语法来写一个五子棋小游戏

    教你用Vue基础语法来写一个五子棋小游戏 1. 前言 本篇攻略将通过使用 Vue 基础语法实现一个简单的五子棋小游戏。这个项目不是一个完整可玩的游戏,它只是演示了使用Vue框架来实现五子棋的各种功能和思路。在这个过程中,你将了解到如何使用Vue开发一个复杂的项目。如果你是初学者,建议先学习 Vue 的基础语法再来实践本文内容。 2. 开始实现五子棋小游戏 首…

    Vue 2023年5月27日
    00
  • 在vue项目中优雅的使用SVG的方法实例详解

    让我来为你详细讲解一下在Vue项目中优雅地使用SVG的方法。 在Vue项目中优雅地使用SVG的方法 什么是SVG? SVG(Scalable Vector Graphics)是一种基于XML语法的矢量图形格式,用于描述二维图形和绘图程序。相对于传统的像素图形格式(如JPG、PNG、BMP等),SVG图像拥有无限的放大缩小比例,因此可以良好地适应各种分辨率的设…

    Vue 2023年5月28日
    00
  • Vue入门之数量加减运算操作示例

    那我就来详细地讲一下“Vue入门之数量加减运算操作示例”的完整攻略。 一、前置知识 在学习Vue的运算操作之前,需要先掌握一些基本的前置知识: HTML 和 CSS的基础语法:Vue是一种基于HTML和CSS的框架,因此需要熟练掌握HTML和CSS的基本语法。 JavaScript 基础:Vue是通过JavaScript实现的,所以需要熟练掌握JavaScr…

    Vue 2023年5月27日
    00
  • Vue实现点击按钮下载文件的操作代码(后端Java)

    下面是详细讲解“Vue实现点击按钮下载文件的操作代码(后端Java)”的完整攻略: 1. 前端实现 1.1 创建下载按钮 首先,在Vue的组件中添加一个按钮,用来触发下载操作: <template> <div> <button @click="downloadFile">下载文件</button&…

    Vue 2023年5月28日
    00
  • Vue项目设置可以局域网访问

    首先,让Vue项目可以在局域网内访问需要做以下两个步骤: 1. 更改启动命令 默认情况下,Vue项目是通过npm run serve启动的,它只能在本地进行访问。如果要使其可以在局域网内被访问,需要在启动命令后加上–host 0.0.0.0选项,这样才可以监听所有网络接口。 打开package.json文件,在scripts中找到serve命令,修改为以下…

    Vue 2023年5月28日
    00
  • vue如何遍历data所有变量并赋值

    答案如下: 1. 遍历data属性并赋值 在Vue中,可以使用Object.keys()方法获取对象的所有属性名,再通过遍历数组的方式对所有属性进行操作。 // 获取data所有属性名 const dataKeys = Object.keys(this.$data); // 遍历data所有属性并赋值 dataKeys.forEach(key => {…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部