我有一个在VueJS中使用bind方法的脚本。过滤器的目的是返回基于性别或所有人的人。
我有HTML代码:
<div id="demo">
<div class="radio">
<label>
<input type="radio" name="gender" v-model="gender" value="all"> All
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="gender" v-model="gender" value="male"> Male
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="gender" v-model="gender" value="female"> Female
</label>
</div>
<ul>
<!-- Don't forget about Vue's filterBy filter. This is only for ex. -->
<li v-for="person in people | gender">{{ person.name }}: {{ person.gender }}</li>
</ul>
</div>
以下是JavaScript代码:
new Vue({
el: '#demo',
data: {
gender: 'all',
people: [
{ name: 'Jeff', gender: 'male' },
{ name: 'Jack', gender: 'male' },
{ name: 'Steven', gender: 'male' },
{ name: 'Kate', gender: 'female' },
{ name: 'Susan', gender: 'female' },
{ name: 'Claire', gender: 'female' }
]
},
filters: {
gender: function(people) {
if (this.gender == 'all') return people;
return people.filter(function(person) {
return person.gender == this.gender;
}.bind(this));
}
}
});
在这种情况下,我不太明白 bind(this)的作用。有谁可以向我解释一下?谢谢,
答案 0 :(得分:3)
所以这是关于this
的闭包和上下文。当你将(this)绑定到一个函数时,它会将this
的上下文(或“词法范围”)更改为绑定函数,this
保留在外部闭包中,而不是在函数内部。绑定,从而使方法和属性可从该外部范围获得。
在您的示例中,您正在使Vue的数据属性“性别”(等于“全部”) - 您引用为this.gender
- 在gender()函数的闭包中可用,否则它将是未定义。
作为一个注释,这是ES5非常常见的模式。但是如果你转向ES6的箭头功能,因为它很常见,这个绑定实际上是默认的。您的gender()函数将在ES6中编写。
gender (people) => {
if (this.gender == 'all') return people
return people.filter((person) => person.gender === this.gender)
}
更简洁,无需绑定this
:)
更新:2019 - 我也不会使用变量和具有相同名称的函数 - this.gender(变量)和this.gender()(函数)。
答案 1 :(得分:0)
箭头功能会更有意义
person => person.gender == this.gender
箭头函数始终绑定到声明它们的对象,普通函数会将其绑定到调用它们的对象。