在 Vue 中的监听器与计算属性

发布于 2022-05-27 23:15:16 字数 2784 浏览 1066 评论 0

Vue的 watch()函数 可以起到与 计算属性 。 例如,假设您要跟踪用户购物车中的商品数量。 你可以代表 numItems 作为计算属性:

const app = new Vue({
  data: () => ({ items: [{ id: 1, price: 10, quantity: 2 }] }),
  computed: {
    numItems: function numItems() {
      return this.items.reduce((sum, item) => sum + item.quantity, 0);
    }
  },
  template: `<div>numItems is {{numItems}}</div>`
});

您还可以定义一个观察者来更新 numItems 每次都有财产 items 变化:

const app = new Vue({
  data: () => ({
    items: [{ id: 1, price: 10, quantity: 2 }],
    numItems: 2
  }),
  watch: {
    items: function updateNumItems() {
      this.numItems = this.items.reduce((sum, item) => sum + item.quantity, 0);
    }
  },
  template: `<div>numItems is {{numItems}}</div>`
});

您应该使用哪种方法? 通常,您应该使用计算属性来更新值。 您应该只将观察者用于“副作用”,例如 console.log(),或 HTTP 请求。 这就是为什么。

保持同步更新

问题与 numItems作为观察者,您可能会意外更新 numItems不更新 items. 这意味着 numItems可能不同步。

const app = new Vue({
  data: () => ({
    items: [{ id: 1, price: 10, quantity: 2 }],
    numItems: 2
  }),
  watch: {
    items: function updateNumItems() {
      this.numItems = this.items.reduce((sum, item) => sum + item.quantity, 0);
    }
  },
  methods: {
    myMethod: function() {
      // Perfectly valid, since `numItems` is a data property.
      this.numItems = 5;
    }
  },
  template: `<div>numItems is {{numItems}}</div>`
});

另一方面,如果您尝试更新计算属性,Vue 会将其视为无操作并打印以下警告:

[Vue warn]: Computed property "numItems" was assigned to but it has no setter.

所以 numItems保证与内容保持同步 items,即使您不小心尝试覆盖它。

何时使用观察者

您想要执行异步操作以响应不断变化的数据 。 例如,如果您想自动保存 cart 每次更改时,您可能会执行以下操作:

const app = new Vue({
  data: () => ({
    items: [{ id: 1, price: 10, quantity: 2 }],
  }),
  watch: {
    items: async function saveCart() {
      await axios.put('/cart', items);
    }
  },
  template: ...
});

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

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

发布评论

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

关于作者

虐人心

有一天你能到我的心里去,你会看到那里全是你给的伤悲。

0 文章
0 评论
24514 人气
更多

推荐作者

亽野灬性zι浪

文章 0 评论 0

少年亿悲伤

文章 0 评论 0

南七夏

文章 0 评论 0

qq_EJoXxu

文章 0 评论 0

17780639550

文章 0 评论 0

萌逼全场

文章 0 评论 0

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