Vue 中的计算属性

发布于 2022-08-11 12:34:10 字数 3160 浏览 176 评论 0

在 Vue 中, 计算属性 中放入过多的逻辑 模板 表达式,例如,假设您的应用有一个评论列表,并且您想要显示所有评论的平均值。

const app = new Vue({
  data: () => ({
    reviews: [
      { score: 5 },
      { score: 3 },
      { score: 4 }
    ]
  }),
  // Computing the average in a template expression is awkward
  template: `
    <div>
      {{reviews.reduce((sum, v) => sum + v.score, 0) / reviews.length}} ({{reviews.length}} reviews)
    </div>
  `
});

您可以创建一个计算属性,而不是在模板中计算平均值 average,并使用 average 而是在模板表达式中。

const app = new Vue({
  data: () => ({
    reviews: [
      { score: 5 },
      { score: 3 },
      { score: 4 }
    ]
  }),
  computed: {
    // `average` is a computed property. Vue will call `computeAverage()`
    // for you when a `data` property changes.
    average: function computeAverage() {
      if (this.reviews.length === 0) {
        return 0;
      }
      return this.reviews.
        reduce((sum, v) => sum + v.score, 0) / this.reviews.length;
    }
  },
  template: `
    <div>
      {{average}} ({{reviews.length}} reviews)
    </div>
  `
});

何时使用计算属性与方法

您还可以使用 Vue 方法来抽象出复杂的模板逻辑,如下所示。

const app = new Vue({
  data: () => ({
    reviews: [
      { score: 5 },
      { score: 3 },
      { score: 4 }
    ]
  }),
  methods: {
    // `average` is a method that's called in the template expression
    average: function average() {
      if (this.reviews.length === 0) {
        return 0;
      }
      return this.reviews.
        reduce((sum, v) => sum + v.score, 0) / this.reviews.length;
    }
  },
  template: `
    <div>
      {{average()}} ({{reviews.length}} reviews)
    </div>
  `
});

这两种方法都有效,但 Vue 会根据它们的 反应值 缓存计算的属性
换句话说,Vue 弄清楚了什么 data 您的计算属性依赖的字段,并且不会重新计算计算属性,除非其中之一 data 字段变化。

例如,如果您有一个仅依赖于的计算属性 field1,如果你修改了 Vue 不会重新计算属性 field2

const app = new Vue({
  data: () => ({
    field1: 'row',
    field2: 'your boat'
  }),
  computed: {
    // Vue will **only** call` getter()` when `field2` changes. Vue will
    // not call `getter()` when `field1` changes.
    field2Upper: function getter() {
      console.log('Called!');
      return this.field2.toUpperCase();
    }
  },
  template: `
    <div>
      <div>
        {{field1}} {{field2Upper.toLowerCase()}}
      </div>
      <button v-on:click="field1 += ' row'">Add</button>
    </div>
  `
});

如果您的计算属性很昂贵,则计算属性可以使您免于不必要的重新计算。 Vue 有一个聪明的算法来跟踪你的计算属性所依赖的属性 。 当函数 getter() 以上访问 field2,Vue 拦截该属性访问并将其添加到字段列表中 getter() 取决于。

 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

雨巷深深

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

留蓝

文章 0 评论 0

18790681156

文章 0 评论 0

zach7772

文章 0 评论 0

Wini

文章 0 评论 0

ayeshaaroy

文章 0 评论 0

初雪

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文