你试图做的大多是不必要的。
确实,this
JavaScript 中的值有时会令人困惑。不过,这也是一个众所周知的问题,也有众所周知的解决方案。
而这些解决方案,至少在与 Vue 实例相关的问题上,是:
但是不要相信我,让我们来看一个例子。获取您的源代码:
methods: {
load() {
ajax().then((obj) => self.name = obj.data);
}
},
作为参数,.then()
您必须传递一个函数。this
此类函数内部的值将取决于您如何传递它。
在第一种情况下(上述两个解决方案中的第一个解决方案),应该使用箭头函数(您已经这样做了)。因此,在您的代码中,self
是不必要的,因为this
箭头函数内部仍将指向 Vue 实例。
methods: {
load() {
console.log(this.name);
ajax().then((obj) => this.name = obj.data);
}
},
在上面的示例中,两者都this.name
引用相同的属性。请参阅下面的演示。
const ajax = () => {
return fetch('https://api.myjson.com/bins/18gqg9')
.then((response) => response.json())
};
new Vue({
el: '#app',
data: {
name: 'Alice'
},
methods: {
yoo() {
console.log('outside:', this.name);
ajax().then((obj) => { this.name = obj.name; console.log('inside arrow, after change:', this.name); });
}
}
})
<script src="https://unpkg.com/vue@latest/dist/vue.min.js"></script>
<div id="app">
<p>
name: {{ name }}
</p>
<button @click="yoo">AJAX!</button>
<p>Click the button above and check the console. The printed name variable is the same.</p>
</div>
现在,在第二种解决方案中,您将使用常规(非箭头)函数。但要确保this
保留 ,您将使用.bind(this)
,如下所示:
methods: {
load() {
console.log(this.name);
ajax().then(function (obj) { this.name = obj.data }.bind(this));
}
},
与前一种情况类似,在两个地方都this.name
指的是同一个属性。请参阅下面的演示。
const ajax = () => {
return fetch('https://api.myjson.com/bins/18gqg9')
.then((response) => response.json())
};
new Vue({
el: '#app',
data: {
name: 'Alice'
},
methods: {
yoo() {
console.log('outside:', this.name);
ajax().then(function(obj) { this.name = obj.name; console.log('inside arrow, after change:', this.name); }.bind(this));
}
}
})
<script src="https://unpkg.com/vue@latest/dist/vue.min.js"></script>
<div id="app">
<p>
name: {{ name }}
</p>
<button @click="yoo">AJAX!</button>
<p>Click the button above and check the console. The printed name variable is the same.</p>
</div>
因此,如您所见,在 Vue 实例中,此类self
变量的声明是不必要的。