在VueJS中绑定函数含义

时间:2016-05-11 18:04:20

标签: javascript vue.js

我有一个在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)的作用。有谁可以向我解释一下?谢谢,

2 个答案:

答案 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

箭头函数始终绑定到声明它们的对象,普通函数会将其绑定到调用它们的对象。