Vue.js教程之计算属性

yizhihongxing

让我来为你详细讲解一下“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日

相关文章

  • 解决router.beforeEach()动态加载路由出现死循环问题

    当使用 Vue Router 动态加载路由时,可能会遇到一个循环加载的问题,具体表现为 beforeach 全部被拦截,因此会出现死循环。这个问题的根本原因是路由对象在创建并注册路由前会被复制,因此在路由注册前执行一个 beforeEach 全局钩子,将会陷入死循环。为了解决这个问题,我们可以采用以下方案: 步骤 步骤一 在路由配置文件中为动态路由添加一个命…

    Vue 2023年5月28日
    00
  • vscode 插件开发 + vue的操作方法

    Vscode 插件开发 + Vue 操作方法 在本文中,我们将介绍如何使用 VSCode 开发插件,并在插件中使用 Vue。 环境要求 在开始使用 Vue 进行开发之前,我们需要先安装好以下环境: Node.js Visual Studio Code Vue CLI 如果您的电脑上还没有这些环境,请先安装好它们。 创建一个 VSCode 插件项目 使用以下命…

    Vue 2023年5月28日
    00
  • VUE+Canvas 实现桌面弹球消砖块小游戏的示例代码

    首先,使用Vue.js和Canvas API实现桌面弹球消砖块小游戏需要完成以下步骤: 创建基本的Vue.js应用程序结构,包括模板、组件和数据绑定。 在Vue.js组件中创建一个Canvas元素,并使用Canvas API绘制游戏元素。 使用Vue.js监听用户交互事件,并更新Canvas元素以实现用户操作。 实现游戏逻辑,包括弹球的运动轨迹、碰撞检测和砖…

    Vue 2023年5月27日
    00
  • Vue 对象和数据的强制更新方式

    Vue 是一个前端框架,实现了视图与数据的双向绑定。为了使视图和数据保持同步,Vue 实例提供了一些方法来强制更新数据。在本篇文章中,我们将详细讨论 Vue 中的对象和数据的强制更新方式。 Vue 对象和数据的强制更新方式 在 Vue 中,对象和数据的强制更新方式是使用 $forceUpdate() 方法。该方法将会强制更新 Vue 实例中全部的状态,这意味…

    Vue 2023年5月28日
    00
  • vue3 reactive响应式依赖收集派发更新原理解析

    下面我将为您详细讲解“vue3 reactive响应式依赖收集派发更新原理解析”的完整攻略。 什么是Vue3的响应式依赖收集派发更新原理? Vue3的响应式依赖收集派发更新原理是Vue3中非常重要的一个概念,它是实现Vue3响应式功能的核心原理。具体来说,Vue3响应式依赖收集派发更新原理指的是:当响应式对象的属性被访问时,系统会将该属性所对应的依赖收集起来…

    Vue 2023年5月28日
    00
  • 22个Vue优化技巧(项目实用)

    下面是对“22个Vue优化技巧(项目实用)”的详细讲解。 一、懒加载路由 描述 使用懒加载路由可以大大提升项目的性能,当路由被访问时才会加载对应的组件,如果不使用懒加载路由,那么全局的所有组件会在项目启动时被加载,浪费大量资源。 示例 在路由文件中使用import语句,将组件打包成一个chunk,当路由被匹配时才会加载: const Foo = () =&g…

    Vue 2023年5月27日
    00
  • Vue手写实现异步更新详解

    下面我将详细讲解“Vue手写实现异步更新详解”的完整攻略。 Vue手写实现异步更新详解 什么是异步更新? 在Vue中,当数据发生变化时,Vue会在下一个事件循环(microtask)中对DOM进行异步更新。这样做的好处是避免了过多、过于频繁的DOM操作,提高了性能和响应速度。 如何手写实现异步更新? Vue的异步更新是通过nextTick方法实现的。我们可以…

    Vue 2023年5月28日
    00
  • Vue2 模板template的四种写法总结

    Vue2 模板template的四种写法总结: Vue2 中,我们可以使用 template 来书写 HTML 模板,但是它也有多种写法,下面我们来总结一下。 1. 字符串模板形式 我们可以在组件中定义字符串模板。 <template> <div> <h1>{{ title }}</h1> <p>{…

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