大前端学习之旅(9)-vue列表过滤与排序实现中的this问题

举报
@Wu 发表于 2021/08/30 17:29:14 2021/08/30
【摘要】 VUE 列表筛选及排序中,this 的问题

在学习vue 列表过滤与排序时,遇到一条以下语句不是很理解,经过查找,终于明白了,再次记录下。

问题语句如下:

const {
       searchName,
       persons,
        orderType
} = this;

问题点,这条语句是用来做什么的?为什么这么做?

完整 代码如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
    <div id="demo">
        search: <input type="text" v-model="searchName">
        <ul>
            <li v-for="(p,index) in filterPersons" :key="index">
                {{index}} --- {{p.name}} --- {{p.age}}
            </li>
        </ul>
        <button @click="setOrderType(1)">年龄升序</button>
        <button @click="setOrderType(2)">年龄降序</button>
        <button @click="setOrderType(0)">原本顺序</button>
    </div>

    <script src="../js/vue.js"></script>
    <script>
        var vm = new Vue({
            el: '#demo',
            data: {
                searchName: '',
                /**
                 * 排序种类:
                 *  0 - 原本顺序
                 *  1 - 年龄升序
                 *  2 - 年龄降序
                 */
                orderType: 0,
                persons: [{
                        name: 'Tom',
                        age: 18
                    },
                    {
                        name: 'Jack',
                        age: 20
                    },
                    {
                        name: 'Bob',
                        age: 16
                    },
                    {
                        name: 'Kaka',
                        age: 25
                    }             
                ]
            },
            computed: {
                filterPersons() {
                    // 取出相关的数据
                    const {
                        searchName,
                        persons,
                        orderType
                    } = this;

                    let flag;
                    flag = persons.filter(p => p.name.indexOf(searchName) !== -1);

                    if (orderType !== 0) {
                        flag.sort(function (p1, p2) {
                            if (orderType === 2) {
                                return p2.age - p1.age;
                            } else {
                                return p1.age - p2.age;
                            }
                        });
                    }

                    return flag;
                }
            },
            methods: {
                setOrderType(orderType) {
                    this.orderType = orderType;
                }
            }
        });
    </script>
</body>

</html>

在这堆代码中的filterPerson函数的第一行进行了this的赋值,创建了一个对象赋给了一个常量
在一些教程中表示这是取出要用的数据
其实算是简化操作,因为后面我将其注释掉,然后在每个变量前面加上this依旧可以跑起来

computed: {
           filterPersons() {
           // 取出相关的数据
           // const {
           //     searchName,
           //     persons,
           //     orderType
           // } = this;

            let flag;
            flag = this.persons.filter(p => p.name.indexOf(this.searchName) !== -1);

            if (this.orderType !== 0) {
                flag.sort(function (p1, p2) {
                      if (this.orderType === 2) {
                          return p2.age - p1.age;
                       } else {
                          return p1.age - p2.age;
                       }
                 });
              }

              return flag;
             }
}

所以,在这个地方是将要用的数据事先放在了this中, 主要是函数中本身没有这几个变量,所以直接在函数内部使用是会报错的,因此需要去外面的vue实例中获取。如果不这么做,要多写很多个this

引申一下:

这里涉及到了对象的解构赋值

let {test,test2}={test1:'aaa',test2:'bbb'}
test1 // 'aaa'
test2 // 'bbb'

而上文中的this是vue里的this对象。相当于把this中对象的值赋值给函数 filterPersons()的变量,一定意义上讲,扩大了函数filterPersons()变量的使用范围,这个变量的作用域跟vue里this相应属性的作用域一样了。

总的来概括就是提升变量作用于,方便调用。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。