我有 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个调用。
使用去抖函数进行数据加载会是一个好的解决方案吗?
或者更确切地说,对整个产品
使用单个观察程序,并将新的p1
和p2
与旧的字符串化版本进行比较,以确定是否应触发数据加载?
正如其他一些开发人员所说,您可以使用计算属性来监控product. p1
或product. 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>
对此有几种方法,各有利弊。
我做的一个简单方法是使用watch函数访问您要观看的每个属性,然后返回一个新的空对象。Vue知道在watch函数中访问了product. p1
和product. 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
})
}
赞成的意见:
缺点:
p1
和p2
,在下一个微任务(即$nextTick()
)之前被设置回其先前的值;但在大多数情况下,这不太可能成为问题
这些缺点中的一些也适用于其他方法。
更紧凑的版本是:
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让该模式更具声明性? 寻找一些巧妙的破坏技巧或类似的东西。