当前位置: 首页 > 知识库问答 >
问题:

Vue.js - 观察对象的特定属性,并在更改时加载数据

宦瀚
2023-03-14

我有 Vue 组件,带有名为 product 的 prop,它是一个具有一堆属性的对象。而且它经常变化。

export default {
    props: {
        product: {
            type: Object,
            default: () => {},
        },
    },
    watch: {
        'product.p1'() {
            this.loadData()
        },
        'product.p2'() {
            this.loadData()
        },
    },
    methods: {
        loadData() {
            doApiRequest(this.product.p1, this.product.p2)
        }
    },
}

仅当<code>产品和<code>p2属性更改时,组件应加载新数据。一种方法是监视整个产品,并在更改时加载数据。但它会产生不必要的请求,因为<code>p1可能没有更改。

另一个思路是观察< code>product.p1和< code>product.p2,调用同一个函数在每个观察器中加载数据。但是,在产品的新版本中,可能会发生< code>p1和< code>p2都发生变化的情况,这将触发2个调用。

使用去抖函数进行数据加载会是一个好的解决方案吗?

或者更确切地说,对整个产品使用单个观察程序,并将新的p1p2与旧的字符串化版本进行比较,以确定是否应触发数据加载?

共有2个答案

梅宏盛
2023-03-14

正如其他一些开发人员所说,您可以使用计算属性来监控product. p1product. p2或两者的变化,然后在每种情况下只调用loadData()方法一次。这是假设的product.vue组件的代码:

<template>
    <div>
        this is product compo
    </div>
</template>

<script>
export default {
    name: "product",
    watch: {
        p1p2: function(newVal, oldVal) {
            this.loadData();
        }
    },
    props: {
        productProp: {
            type: Object,
            default: () => {},
        },
    },

    computed: {
        p1p2: function() {
            return this.productProp.p1 + this.productProp.p2;
        }
    },
    methods: {
        loadData() {
            console.log("load data method");
        }
    },
}
</script>
金慈
2023-03-14

对此有几种方法,各有利弊。

我做的一个简单方法是使用watch函数访问您要观看的每个属性,然后返回一个新的空对象。Vue知道在watch函数中访问了product. p1product. p2,因此它会在这些属性中的任何一个更改时重新执行它。然后,通过从watch函数返回一个新的空对象实例,Vue将触发watch处理程序,因为watch函数返回了一个新值(因此正在观看的内容“更改”)。

created() {
  this.$watch(() => {
    // Touch the properties we want to watch
    this.product.p1;
    this.product.p2;

    // Return a new value so Vue calls the handler when
    // this function is re-executed
    return {};
  }, () => {
    // p1 or p2 changed
  })
}

赞成的意见:

  • 你不必把任何东西串起来
  • 您不必对watch handler函数进行反跳

缺点:

  • 您无法跟踪<code>p1的先前值
  • 如果<code>发生此情况,请小心。产品可能为空/未定义
  • 当<code>p1发生变化时,它将始终触发;即使p1p2,在下一个微任务(即$nextTick())之前被设置回其先前的值;但在大多数情况下,这不太可能成为问题
  • 您需要使用<code>这个。$watch()。如果要使用<code>watch</code>选项,则需要监视计算属性

这些缺点中的一些也适用于其他方法

更紧凑的版本是:

this.$watch(
  () => (this.product.p1, this.product.p2, {}),
  () => {
    // changed
  }
})
 类似资料:
  • 问题内容: 我只是阅读了watch()方法的Mozilla文档。它看起来非常有用。 但是,我找不到与Safari类似的东西。既不是Internet Explorer。 您如何管理跨浏览器的可移植性? 问题答案: 我不久前为此创建了一个小object.watch垫片。它适用于IE8,Safari,Chrome,Firefox,Opera等。

  • 问题内容: 我有一个实体课 } 在某些情况下,我不想加载对象A,因为我已经有了该对象。对于C也是如此。但是这些是特定的场景,我根本不想加载那些对象。 有什么方法可以告诉Hibernate不要加载实体对象的某些属性。{没有渴望/获取建议。我只希望仅在特定情况下才发生这种情况] 注意:我现在使用Criteria来获取对象。 问题答案: 由于用于查询,因此可以在运行时根据条件使用“ fetch”关键字指

  • 我正在努力处理一个简单的RxJs查询,但我似乎无法理解。如果观察对象被包装在一个对象中,我似乎不知道如何合并它们。如果我直接从flatMap返回Observable,那么这个示例可以正常工作,但我还需要在输出中输入名称。我怎样才能做到这一点? 我正在使用RxJS 5.0.0-beta.2 基本数据结构: RxJs函数: 预期结果: 实际结果:

  • 问题内容: 回答“ 我如何知道数组内元素的值是否已更改”这一问题时受到启发 ,答案是使用 属性观察 器检查数组是否已被修改。 但是,如何确定属性查看器中集合类型中的已更新元素是什么?例如: 请注意,每次添加,更新或删除操作都已调用该代码,但是我如何才能确切知道受影响的元素是什么?有没有办法通过将数组除以 Property Observer 来实现这一目标? 我问的是Swift中的所有集合类型,因为

  • 我正在努力理解如何合并两个可观察对象并利用它们合并后的产品。我在mergeMap、switchMap、flatMap、大理石图等上看了无数视频,但我仍然不知道合并观测值是如何工作的。我觉得在使用RxJS的时候,我不会有效率,甚至不会正确。 我有一个要订阅的可观测值,我还想订阅代码中特定表单数组的valueChanges可观测值。但是,我需要确保只有在正确构建表单数组之后才能进行第二次订阅,否则将出

  • 我发现自己经常遇到这种模式。我有一个从api中返回的对象数组,我只需要操作所有对象中的一个属性。 有没有办法使用ES6/Babel或Typescript让该模式更具声明性? 寻找一些巧妙的破坏技巧或类似的东西。