我有一个脚本,它在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)在这种情况下能做什么.谁能给我解释一下吗?谢谢

推荐答案

这是关于闭包和this的上下文.当你绑定(这)到一个函数时,它会将this的上下文(或"词法范围")更改为在绑定函数内,this保留在外部闭包中,而不是在被绑定的函数内,从而使方法和属性从该外部范围可用.

在您的示例中,您正在使Vue的数据属性"gender"(等于"all")(您将其引用为this.gender)在gender()函数的闭包中可用,否则它将是未定义的.

值得注意的是,这是ES5中非常常见的模式.但是如果你转向ES6的箭头函数,因为它非常常见,这个绑定实际上是默认的.在ES6中,您的gender()函数将这样编写.

gender (people) => {
  if (this.gender == 'all') return people
  return people.filter((person) => person.gender === this.gender)
}

更简洁,无需绑定this:)

更新:2019年——我也不会使用一个变量和一个同名函数——这是一个错误.性别(变量)和这个.性别()(功能).

Vue.js相关问答推荐

如何禁用Vuetify v—stepper操作按钮

V-img不显示文件夹中的图像

Nuxt 3 I18N浏览器检测不起作用

是否可以使用 Vuetify/VueJS 为轮播设置默认图像而不是第一个图像?

Nuxt.js 中的开发工具样式编辑问题

Eslint Vue 3 解析错误:'>' expected.eslint

有条件地在 Vue 中添加一个 CSS 类

Vue.js 如何计算总数?

为什么 Vue 路由/Webpack 开发服务器现在在页面刷新时显示无法获取/路径?

PhpStorm 中Expected预期表达式

Nuxt & Vuetify:如何控制 CSS 文件的加载顺序?

Vue路由保持活动和挂载行为

NUXT如何将数据从页面传递到布局

删除一行后刷新 Bootstrap-Vue 表

输入文件 Select 事件在 Select 同一文件时未触发

根据路由动态插入 CSS 类到导航栏

在 vue.js 组件中react this.props.children

将 Vue props与默认值合并

Vuejs 组件等待 facebook sdk 加载

Vue.js 显示空格(换行符)