数据不会在vue

时间:2018-01-19 07:44:04

标签: javascript vue.js axios

我有一个像这样的简单形式

<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中的方法对象中的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已更新,但上面的这段代码没有改变。

3 个答案:

答案 0 :(得分:4)

您无法通过this功能内的then访问虚拟机。您有三种方法可以解决此问题:

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

    .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);
    })
    
  4. 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

答案 1 :(得分: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_.$forceUpdate();之后将this_.userData = response.data添加到您的回复功能,它将始终有效;)

答案 2 :(得分:3)

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

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

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