Vue.js круговые вычисленные свойства

У меня есть приложение, которое требует обновления двух полей, которые зависят друг от друга по своим значениям.

Например:

<template>
    <tr>
        <td>{{total}}</td>
        <td><input type="text" v-model="calculateEarnedPercentage" @change="updatedForecastPercentage"></td>
        <td><input type="text" v-model="spent_dollar"></td>
    </tr>
</template>

<script>
    export default {
        data () {
            return {
                total: 1000000,
                spent_percentage: '',
                spent_dollar: 20000,
            }
        },
        methods: {
            updatedForecastPercentage () {
                this.vendor.regional_forecast_dollar = this.vendor.purchases / (this.vendor.regional_forecast_dollar / 100)
            }
        },
        computed: {
            calculateEarnedPercentage () {
                return (this.vendor.regional_forecast_dollar / this.vendor.purchases) * 100
            }
        }
    }
</script>

Два "потраченных" значения зависят от статического "общего" значения. Я буду хранить отработанный доллар, и процент будет первоначально получен из этого.

Теперь, если пользователь обновляет процент, мне нужно значение в долларах для обновления. Если они обновляют стоимость в долларах, мне нужен процент для обновления.

На данный момент это явно не работает. Циркулярные обновления происходят. Как вы проектируете свои данные, чтобы разрешить эту функциональность в Vue.js?

1 ответ

Похоже, вы могли бы использовать некоторые часы и мьютекс. Используя идею параллельной обработки, я построил JSfiddle, чтобы продемонстрировать эту идею.

<div id="app">
  <span>{{ total }}</span>
  <span><input type="text" v-model.number.lazy="spent_percentage"></span>
  <span><input type="text" v-model.number.lazy="spent_dollar"></span>

  <pre>{{ $data }}</pre>
</div>

new Vue({
  el: '#app',
  data () {
    return {
      total: 1000000,
      spent_percentage: 5.0,
      spent_dollar: 20000,
      mutex: false,
      vendor: {
        purchases: 2358,
        regional_forecast_dollar: 1
      }
    }
  },
  watch: {
    spent_percentage: function(value, old_value) {
      if (!this.mutex) {
        this.mutex = true

        this.spent_dollar = (this.vendor.purchases * value) / 100;
        this.spent_percentage = value;

        this.mutex = false
      }
    },
    spent_dollar: function(value, old_value) {
      if (!this.mutex) {
        this.mutex = true

        this.spent_dollar = value;
        this.spent_percentage = (value / this.vendor.purchases) * 100;

        this.mutex = false
      }
    }
  }
})
Другие вопросы по тегам