我有一个像这样的简单形式
<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已更新,但上面的这段代码没有改变。
答案 0 :(得分:4)
您无法通过this
功能内的then
访问虚拟机。您有三种方法可以解决此问题:
将外部this
显式绑定为函数的执行上下文(ES5函数有自己的这个):
.then(function (response) {
this.userData = response.data;
console.log(this.userData);
}.bind(this))
将this
上下文存储在本地变量中,例如self
或that
:
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);
});
}
使用没有自己的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
答案 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
所在的父组件。