【问题标题】:data does not update in vue js数据在 vue js 中不更新
【发布时间】:2018-06-28 09:50:56
【问题描述】:

我有一个像这样的简单表格

<form @submit.prevent="getSummary">
    <input type="text" v-model="userAcccount" placeholder="Enter Account 
    Number">
    <button type="submit" class="btn btn-xs btn-default">Submit</button>
</form>

而我在vue的methods对象中的getSummary方法是这样的

methods: {
        getSummary () {               
            axios.get('core/handle.php', {
                params: {
                  accountNumber: this.userAcccount
                }
              })
              .then(function (response) {
                this.userData = response.data;
                console.log(this.userData);
              })
              .catch(function (error) {
                alert(error);
            });
        }
    }

我的数据对象包含

data: {
        userAcccount: '',
        userData: []
    },

我正在尝试使用来自 axios 的响应更新 userData,然后使用它来填充表 出于测试目的,我只是尝试了这个

<span v-if="userData.length > 0">
      some data 
</span>
<span v-else>
      data not found
</span>

console.log 显示 userData 已更新,但上面的这段代码没有改变。

【问题讨论】:

  • 你的控制台打印什么console.log(response)?

标签: javascript vue.js axios


【解决方案1】:

您无法通过then 函数中的this 访问VM。您有三种方法可以解决此问题:

  1. 将外部this作为执行上下文显式绑定到函数(ES5函数有自己的this):

    .then(function (response) {
        this.userData = response.data; 
        console.log(this.userData);
    }.bind(this))
    
  2. this 上下文存储在局部变量中,例如selfthat:

    getSummary () {
      const self = this;
      axios.get('core/handle.php', {
        params: {
          accountNumber: this_.userAcccount
        }
      })
      .then(function (response) {
        self.userData = response.data;
        console.log(self.userData);
      })
      .catch(function (error) {
        alert(error);
      });
    }
    
  3. 使用没有自己的 this 的 ES6 箭头函数:

    .then(response => {
      this.userData = response.data;
      console.log(this.userData);
    })
    

Javascript 中this 的概念与许多其他编程语言有很大不同,因为它描述了函数的执行上下文。这不是一个容易掌握的概念,但这帮助我进入了它:

http://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/

作为参考,MDN 总是一个好去处:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

【讨论】:

  • 非常感谢第三个选项的帮助。我尝试了解其他选项并了解如何使用它们。
  • 不客气。这是更深入地学习 Javascript 时要克服的最棘手的事情之一。
  • 我不适合我,axios.get(url).then(response => { this.items = response.data.response; });但它不起作用,并且 this.items 是空的。
【解决方案2】:

使用 ES6 箭头函数,您可以通过稍微重写来访问回调中的响应,如下所示:

.then(response => {
    this.userData = response.data;
    console.log(this.userData);
})

这是因为您当前正在使用 this 到达 axios 请求上下文,这显然是空的,因为 userData 不在您的范围内。通过使用箭头函数语法,您可以访问userData 所在的父组件。

【讨论】:

    【解决方案3】:

    保存this 的上下文,你就可以开始了。

    methods: {
            getSummary () {
               var this_= this;
                axios.get('core/handle.php', {
                    params: {
                      accountNumber: this_.userAcccount
                    }
                  })
                  .then(function (response) {
                    this_.userData = response.data;
                    console.log(this_.userData);
                  })
                  .catch(function (error) {
                    alert(error);
                });
            }
        }
    

    如果这不起作用,请在this_.userData = response.data 之后将this_.$forceUpdate(); 添加到您的响应函数中,它将始终有效;)

    【讨论】:

    • 当你说“保存这个上下文,你就可以开始了。”你什么意思
    猜你喜欢
    • 2017-04-11
    • 2017-03-06
    • 2019-01-03
    • 2015-10-01
    • 2020-10-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多