• Vue:列表排序和筛选(运用计算属性和监视属性(侦听属性))


    一、计算属性(computed)vs监视属性(watch)

    首先,带大家了解一下computed和watch的区别吧
    1.computed能完成的功能,watch都可以完成
    2.watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作

    二、监视属性(watch)

    感觉提到这种根据用户操作修改列表,大多数人应该都是想到根据什么变化然后渲染页面吧!
    那么接下来,我就首先给大家来展示监视属性的写法吧!

    第一步:构建主体架构

    (1)引入vue.js,创建vue实例
    <script src="../js/vue.js"></script>
    
    const vm = new Vue({
                el: "#root",
                data: {
                    persons: [
                        { id: 001, name: "周冬雨", age: 18, sex: "女" },
                        { id: 002, name: "马冬梅", age: 19, sex: "女" },
                        { id: 003, name: "周杰伦", age: 20, sex: "男" },
                        { id: 004, name: "温兆伦", age: 21, sex: "男" },
                    ],
                },
    })
    
    (2)准备好html容器,将属性导入
    
        <div id="root">
            
            <h2>人员列表h2>
            <input type="text" v-model="obj.keyword" placeholder="请输入姓名">
            <ul>
                <li v-for="(k,index) in persons" :key="k.id">
                    {{k.name}}-{{k.age}}-{{k.sex}}
                li>
            ul>
        div>
    

    这里说一下这个:key,在Vue非常重要的,是唯一标识符,大家先注意下,详细的后续单独出一期讲解。

    第二步:完成列表筛选部分

    (1)让输入框的value值和vue实例中的属性进行双向绑定

    首先,在vue实例对象的data中添加一个属性,

     data: {      
             obj: {
                   keyword: '',
             },
    },
    

    然后,然输入框中的value值去绑定这个keyword属性,这样的话我们就是拿到用户输入的值,并根据用户提供的值及时渲染页面,

     <input type="text" v-model="obj.keyword" placeholder="请输入姓名">
    

    用v-model进行双向绑定。

    (2)watch监视obj中keyword的变化

    因为keyword在obj中,我们可以监视obj的变化,不过要开启深度监视。
    这里进行筛选的时候,需要创建一个新数组,避免原数据被污染。

     data: { 
              newarr: [],
     },
    
    watch: {
                    obj: {
                        immediate: true,  // 初始化时让handler调用一下 
                        deep: true, //开启深度监视
                        handler() {
                            this.newarr = this.persons.filter(item => item.name.indexOf(this.obj.keyword) != -1) 
                            // 根据输入的名字进行筛选,有返回索引号,没有为-1
                        }
                    }
                }
    

    将v-for中的对象改变成遍历新数组

     <li v-for="(k,index) in newarr" :key="k.id">
                    {{k.name}}-{{k.age}}-{{k.sex}}
                </li>
    

    第三步:完成列表排序部分

    思路:通过按钮的点击事件来改变Vue实例里面的属性,再通过监视这个属性的变化来改变新数组。
    创建一个新属性sortType来控制排序的方式。把这个属性放在obj中。

     data: {      
             obj: {
                   keyword: '',
                   sortType: 0,
             },
    },
    

    在html中添加三个按钮,并配置点击事件来改变sortType的值

     <button @click="obj.sortType = 1">升序button>
            <button @click="obj.sortType = 2">降序button>
            <button @click="obj.sortType = 0">原序button>
    

    开始书写逻辑
    排序主要是用sort来进行排序,注意一下不要弄反就行。

    watch: {
                    obj: {
                        immediate: true,
                        deep: true,
                        handler() {
                            this.newarr = this.persons.filter(item => item.name.indexOf(this.obj.keyword) != -1)
                            if (this.obj.sortType) {
                                this.newarr.sort((a1, a2) => this.obj.sortType == 1 ? a1.age - a2.age : a2.age - a1.age)
                            } else {
                                this.newarr = this.persons
                            }
                        }
                    }
                }
    

    好了监视属性就讲到这里,接下来让我们来了解一下计算属性。

    三、计算属性(computed)

    计算属性属性本身不存在,是根据已有属性计算得来,这样的话可以避免我们创新声明一个新变量,
    总思路相似,直接带大家来看看源码吧!

    <body>
        
        <div id="root">
            <h2>人员信息h2>
            <input type="text" v-model="keyword" placeholder="请输入姓名">
            <input type="button" value="原序" @click="order=0">
            <input type="button" value="降序" @click="order=1">
            <input type="button" value="升序" @click="order=2">
            <ul>
                <li v-for="item in arrsort" :key="item.id">
                    姓名:{{item.name}} - 年龄:{{item.age}}
                li>
            ul>
        div>
        <script>
            const vm = new Vue({
                el: "#root",
                data: {
                    order: 0,
                    keyword: '',
                    persons: [
                        { id: 01, name: "张三", age: 19 },
                        { id: 02, name: "李四", age: 26 },
                        { id: 03, name: "王五", age: 15 },
                        { id: 04, name: "赵六", age: 20 },
                    ]
                },
                computed: {
                    arrsort() {
                        const arr = this.persons.filter(item => item.name.indexOf(this.keyword) != -1)
                        if (this.order) {
                            arr.sort((item1, item2) => this.order == 1 ? item2.age - item1.age : item1.age - item2.age)
                        }
                        return arr
                    }
                },
            })
        script>
    body>
    

    这里运用了一个计算属性的简写,而arrsort就是一个通过计算而得到的值,

    四、效果图

    在这里插入图片描述

    这样一对比,好的多了,不是吗!
    好了不开玩笑了,两者方法有利有弊,大家酌情选择哈!那我们下期再见!

  • 相关阅读:
    【深度学习】Vision Transformer
    JDictSelectTag 字典标签用法
    详解升讯威在线客服系统前端多国语言实现技术:原生支持葡文、印尼文、土耳其文、俄文
    长胜证券:华为“黑科技”点燃A股炒作激情
    学习笔记16--V2X技术
    思维导图在初中化学“物质构成的奥秘”教学中的应用
    C# ref用法,实现引用传递(地址传递)
    【(数据结构)— 单链表的实现】
    .NET微信网页开发相关文章教程
    SpringBoot HandlerInterceptor实战
  • 原文地址:https://blog.csdn.net/astar2022/article/details/127041307