大前端学习之旅(9)-vue列表过滤与排序实现中的this问题
        【摘要】 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)