VueJS中的绑定函数含义

Dal*_*yen 5 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>
Run Code Online (Sandbox Code Playgroud)

以下是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));
        }
    }

});
Run Code Online (Sandbox Code Playgroud)

我不太了解bind(this)在这种情况下的作用。谁能向我解释?谢谢,

Tre*_*pps 6

所以这是关于的闭包和上下文this。当您将此函数绑定到函数时,它将绑定函数的上下文(或“词法范围”)this更改为绑定函数,this保留在外部闭包中,而不是在绑定的函数内部,从而使方法和属性可从该函数中获取。外部范围。

在您的示例中,您要使Vue的数据属性'gender'(等于'all')(在您引用时称为该属性)this.gender可在endering()函数的闭包中使用,否则它将是未定义的。

注意,这是ES5中非常常见的模式。但是,如果移至ES6的箭头功能,因为它很常见,因此此绑定实际上是默认设置。您的sex()函数将在ES6中这样编写。

gender (people) => {
  if (this.gender == 'all') return people
  return people.filter((person) => person.gender === this.gender)
}
Run Code Online (Sandbox Code Playgroud)

更加简洁,无需绑定this:)

更新:2019-我也不会使用同名的变量和函数-this.gender(变量)和this.gender()(函数)。