私は複数のフィールドを持つテーブル行を持つコンポーネントを持っています。 によって1つのフィールドを更新すると、マージンまたは販売価格に基づいて別のフィールドが更新されます。VueJsウォッチャーを動的に管理する
しかし、私はすべてのフィールドを見ているように、私はバウンス効果を得ています。 _debounceを追加すると問題は解決しますが、問題は解決しません。この問題を解決するには、ウォッチャーにコールバックを使用してunwatch()をトリガーしますが、ウォッチャーを再追加すると、コールバックが見えなくなります。
私はコードの例として作業要点を持っています。
Vue.component('pricing', {
template: '#pricing-row',
props: ['item'],
mounted() {
this.addWatchers()
},
methods: {
resetWatchers() {
setTimeout(()=> {
this.addWatchers()
}, 700)
},
addWatchers() {
this.updateNet = this.$watch(
function() {
return this.item.net
},
function() {
// unmount other watchers
this.updateMargin()
this.updateSell()
// calculate sell price and update
this.setSellPrice()
// re-add watchers
this.resetWatchers()
}
),
this.updateMargin = this.$watch(
function() {
return this.item.margin
},
function() {
// unmount other watchers which can cause bounce effect
this.updateSell()
// calculate sell price and update
this.setSellPrice()
// re-add watchers
this.resetWatchers()
}
),
this.updateSell = this.$watch(
function() {
return this.item.sell
},
function(sellPrice) {
// unmount other watchers which can cause bounce effect
this.updateMargin()
// update margin
this.setMargin(sellPrice)
// re-add watchers
this.resetWatchers()
}
)
},
setSellPrice() {
let price = (100/(100 - this.item.margin)) * this.item.net
this.item.sell = price.toFixed(2)
},
setMargin(sellPrice) {
let profit = (sellPrice - this.item.net)
let price = (100 * profit)/sellPrice
this.item.margin = price.toFixed(2)
}
}
})
new Vue({
el: '#vue',
data: {
prices: [
{
id: 1,
net: 5,
margin: 10,
sell: 5.56
},
{
id: 2,
net: 7,
margin: 10,
sell: 7.78
},
]
}
})
私はメソッドを呼び出すmounted()
上に取り付けることにより、正しくウォッチャーを使用しています信じています。そしてその方法を思い出して再初期化するか?
本当にお役に立てれば幸いです。
をこの問題のより複雑なバージョンを見ることができ、これは非常に不幸なソリューションです。 'net'、' margin'と 'sell'属性の間の関係だけを記述できますか? – WaldemarIce
基本的には、売却価格を更新することにより、ネットとマージンに基づいて売却価格を自動的に再計算します。他のフィールドについても同様です。 – Lee
これは無限ループです。今、私は問題がどこにあるのか理解しています...単純な解決策は、 '売却 'プロパティを原価として考えています。直接使用することはできません。また、実質売価として、ネット、マージン、原価に基づいて計算されたプロパティを使用する必要があります。 – WaldemarIce