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混合文件使用以及ref的引用实例详解

    当我们在开发 Vue 项目时,有时我们需要在多个组件中使用相同的代码块,这时就可以使用 Vue 的混合文件功能来实现代码复用。同时,我们在 Vue 组件中也经常需要对 DOM 元素进行操作,这时可以使用 ref 引用对应的 DOM 元素。下面将详细讲解 Vue 混合文件的使用以及 ref 引用的实例详解。 Vue混合文件使用 Vue 混合文件可以理解为预定义…

    Vue 2023年5月27日
    00
  • Vue实现可移动水平时间轴

    Vue实现可移动水平时间轴 1. 引入样式文件 在head标签内引入需要用到的样式文件,例如: <head> <link rel="stylesheet" href="timeline.css"> </head> 2. 组件的结构 要实现一个时间轴,我们需要用到一个列表(<ul…

    Vue 2023年5月29日
    00
  • vue项目中存储与使用后端传递过来的token

    在Vue项目中使用后端传递过来的token需要进行以下几个步骤: 1. 发送登录请求,获取token 在登录页面,用户输入用户名和密码后,向后端发送登录请求。如果用户名和密码验证成功,后端返回一个token给前端。 axios.post(‘/login’, { username: ‘username’, password: ‘password’ }) .th…

    Vue 2023年5月28日
    00
  • Vue实现点击时间获取时间段查询功能

    教程:Vue实现点击时间获取时间段查询功能 本教程将帮助你学习如何使用Vue实现点击时间获取时间段查询功能。在本教程中,我们将会使用Vue.js框架的特性以及html、JavaScript和CSS来实现该功能。 步骤 步骤一: HTML 定义 首先,我们需要在HTML页面定义下面的元素: <!– index.html –> <div i…

    Vue 2023年5月28日
    00
  • 关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)

    关于“关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)”这个问题,我们可以有多种解决方案,以下是其中一个完整的攻略。 问题描述 我们需要在vue的模板中使用v-for指令遍历数组并生成四列的商品展示列表。而且在每个列表的最右边,我们需要显示一个计算属性的值。如下图所示: 商品1 商品2 商品3 商品4 计算属性1 商品5 商品6 …

    Vue 2023年5月29日
    00
  • vue 中filter的多种用法

    下面是一份关于 Vue 中 filter 的多种用法的攻略。 简介 在 Vue 中,filter 是一种非常实用的功能,它可以让我们在模板中格式化数据。例如,在展示日期时,可以使用 Date Filter 将日期格式化为固定的格式,或者在展示价格时,可以使用 Currency Filter 将价格格式化为指定的货币单位。 Vue 中 Filter 的基本用法…

    Vue 2023年5月27日
    00
  • Vue 动态路由的实现详情

    下面就为大家详细讲解一下「Vue 动态路由的实现详情」。 什么是动态路由? Vue 路由是一种 URL 和组件之间的映射关系,并通过 URL 触发组件的展示。而动态路由则是在 URL 中传递参数,根据参数的不同动态匹配相应的路由。例如 /article/1 和 /article/2 都可以匹配到文章详情页路由,只不过参数不同。在 Vue 中,我们可以通过“路…

    Vue 2023年5月28日
    00
  • el-date-picker日期选择限制范围的实例代码

    下面是关于el-date-picker日期选择限制范围的实例代码的完整攻略。 1. 前置知识 在讲解实例代码之前,我们需要掌握以下基本知识: el-date-picker是一个基于element-ui的日期选择器组件; el-date-picker可以通过picker-options属性限制日期选择的范围; picker-options中可以设置disabl…

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