javascript - Vuejs : Detect Change Event On Computed Value

标签 javascript vue.js

目标

我想检测 searchTerms 的更改事件。

问题

观察者目前在每次按键时触发,但我不想要那么多事件。

上下文 ( View Fiddle )

<template>
<div id="app">
  <table class="table">
    <tr>
      <td><label>Name</label></td>
      <td><input class="form-control" v-model="customer.name" autofocus></td>
    </tr>
    <tr>
      <td><label>Short Code</label></td>
      <td><input class="form-control" v-model="customer.shortCode"></td>
    </tr>
    <tr>
      <td><label>Address</label></td>
      <td><input class="form-control" v-model="customer.address"></td>
    </tr>
    <tr>
      <td><label>Caller</label></td>
      <td><input class="form-control" v-model="customer.caller"></td>
    </tr>
    <tr>
      <td><label>Phone</label></td>
      <td><input class="form-control" v-model="customer.phone"></td>
    </tr>
  </table>

  <div class="models">
    <pre><strong>customer:</strong> {{ customer | json }}</pre>
    <pre><strong>searchTerms:</strong> {{ searchTerms | json }}</pre>
  </div>
</div>
</template>

<script>
new Vue({
  el: '#app',
  data: {
    customer: {
      name: 'Donnie',
      phone: '',
      caller: '',
      address: '',
      shortCode: 'DO'
    }
  },

  computed: {
    searchTerms: function() {
      let terms = {};

      _.forOwn(this.customer, (value, key) => {
        if (value.length >= 3) {
          terms[key] = value;
        }
      });

      return terms;
    }
  },

  watch: {
    'searchTerms': function() {
      if (_.isEmpty(this.searchTerms)) {
        return;
      }

      alert('searchTerms Changed');
    }
  }
});
</script>

最佳答案

计算属性 searchTerms 每次运行时都会创建一个新对象。这意味着对 searchTerms 的引用发生了变化,导致观察者触发。

您只希望观察器在其中一个 发生变化时触发。最简单的方法是查看 searchTerms 的字符串化版本,而不是对象。

这是更新后的 fiddle :https://jsfiddle.net/qLzu0seq/5/

这里是代码片段(最好将代码保存在 stackoverflow 中,而不是外部站点):

new Vue({
  el: '#app',
  data: {
    customer: {
      name: 'Donnie',
      phone: '',
      caller: '',
      address: '',
      shortCode: 'DO'
    }
  },

  computed: {
    searchTerms: function() {
      let terms = {};

      _.forOwn(this.customer, (value, key) => {
        if (value.length >= 3) {
          terms[key] = value;
        }
      });

      return terms;
    },
    searchTermsStringified: function() {
    	return JSON.stringify(this.searchTerms);
    }
  },

  watch: {
    'searchTermsStringified': function() {
      if (_.isEmpty(this.searchTerms)) {
        return;
      }

      alert('searchTerms Changed');
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.4/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.js"></script>

<div id="app">
  <table class="table">
    <tr>
      <td><label>Name</label></td>
      <td><input class="form-control" v-model="customer.name" autofocus></td>
    </tr>
    <tr>
      <td><label>Short Code</label></td>
      <td><input class="form-control" v-model="customer.shortCode"></td>
    </tr>
    <tr>
      <td><label>Address</label></td>
      <td><input class="form-control" v-model="customer.address"></td>
    </tr>
    <tr>
      <td><label>Caller</label></td>
      <td><input class="form-control" v-model="customer.caller"></td>
    </tr>
    <tr>
      <td><label>Phone</label></td>
      <td><input class="form-control" v-model="customer.phone"></td>
    </tr>
  </table>

  <div class="models">
    <pre><strong>customer:</strong> {{ JSON.stringify(customer,null,2) }}</pre>
    <pre><strong>searchTerms:</strong> {{ JSON.stringify(searchTerms,null,2) }}</pre>
  </div>
</div>

关于javascript - Vuejs : Detect Change Event On Computed Value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40935296/

相关文章:

javascript - 如何避免 Nest.Js/Node.Js 进程占用 100% 的 CPU?

javascript - 如何使用 jquery 删除 br?

javascript - 为什么不需要的数据被推送到我的数组中?

javascript - 如何在 Vue.js 中调整大小时立即获取元素的宽度和高度

javascript - 将 id 附加到 vue.js 中的路由器链接

javascript - 为什么不在我的react元素中添加css样式?

javascript - 使用 AJAX 在 Node.js 上进行数据库查询

javascript - 创建(){}与创建: function() {}

vue.js - 在 Vue.js 2.0 中对 v-model 进行格式化的正确方法是什么

Vue.js 从方法访问变量