【问题标题】:Vue Watch doesnt Get triggered when using axiosVue Watch 使用 axios 时不会触发
【发布时间】:2018-04-20 16:22:54
【问题描述】:

大家好,我有这段代码可以使用 axios 从数据库中获取数据,并且在 .then() 函数中我设置了一个数据属性,手表不会触发。这是我目前拥有的一些代码。并提前感谢您!

export default {

    name: '..',
    data() {
        return {
            autocompleteOn: false
        }
    },

    watch: {
        autocompleteOn(oldVal, newVal) {
            console.log('autocomplet') // doesnt trigger this
        }
    },

    methods: {
        fetchAutocompleteResults: _.debounce((filter) => {
            let $this = this;



            let data = {
                filter: filter,
                page: $this.page
            };

            filter.resources.response = [];
            filter.loading = true;

            axios.post(BASE_URL + '/search/filter', data).then(function(response) {
                if (response.data.length) {
                    filter.autocompleteOn = true;
                    $this.autocompleteOn = true;
                    filter.resources.response = filter.resources.response.concat(response.data);
                    $this.currentFilter = filter;
                    $this.page++;
                    console.log($this.autocompleteOn); // this is correct
                }

                filter.loading = false;
            });
        }, 300)
    }

}

【问题讨论】:

  • filter.autocompleteOn 正确吗?试试这个data.filter.autocompleteOn

标签: javascript vue.js


【解决方案1】:

带有箭头功能的debounce 使this 成为Vue 实例以外的东西(例如window)。

代替:

methods: {
    fetchAutocompleteResults: _.debounce((filter) => {

用途:

methods: {
    fetchAutocompleteResults: _.debounce(function (filter) {
//                                       ^^^^^^^^        ^^^

演示:

new Vue({
  el: '#app',
  data() {
    return {
      autocompleteOn: false
    }
  },
  watch: {
    autocompleteOn(oldVal, newVal) {
      console.log('autocomplet') // doesnt trigger this
    }
  },
  methods: {
    fetchAutocompleteResults: _.debounce(function (filter) { // CHANGED from arrow function
      let $this = this;

      let data = {
        filter: filter,
        page: $this.page
      };

      filter.resources.response = [];
      filter.loading = true;
      
      // changed data for demo
      data = [{title: 'foo', body: 'bar', userId: 1}];

      // changed URL for demo
      axios.post('https://jsonplaceholder.typicode.com/posts', data).then(function(response) {
        if (response.data.length) {
          filter.autocompleteOn = true;
          $this.autocompleteOn = true;
          filter.resources.response = filter.resources.response.concat(response.data);
          $this.currentFilter = filter;
          $this.page++;
          console.log($this.autocompleteOn); // this is correct
        }

        filter.loading = false;
      });
    }, 300)
  }
})
<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>

<div id="app">
  <button @click="fetchAutocompleteResults({resources: {}})">fetchAutocompleteResults</button>
</div>

【讨论】:

  • 不是真的,我实际上必须运行代码才能发现它?
  • 完美,谢谢!在使用 _.debounce() 函数的情况下,我将使用函数。
  • @MikołajMarciniak 实际上,你永远不应该在 vue 的方法声明中使用箭头函数。每次都会弄乱上下文(this)。请参阅文档:vuejs.org/v2/api/#methods(灰色背景部分)
  • 关于this 关键字如何受到影响的非常好的建议,谢谢。
猜你喜欢
  • 2018-03-21
  • 2019-07-29
  • 2021-12-30
  • 2014-12-31
  • 2016-03-10
  • 2021-05-17
  • 2013-07-21
  • 2020-04-10
  • 2015-07-22
相关资源
最近更新 更多