Vue如何实现列表过滤与排序

这篇文章主要讲解了“Vue如何实现列表过滤与排序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue如何实现列表过滤与排序”吧!

    一、数据过滤

    watch实现

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Vue初识</title>
        <script type="text/javascript" src="./js/vue.js"></script>
    </head>
    <body>
    <div id="root">
        <!--遍历数组-->
        <h3>人员列表(遍历数组)</h3>
        <input type="text" placeholder="请输入名字" v-model="keyword"/>
        <ul>
            <li v-for="(p,index) in filterPersons" :key="p.id">
                {{p.name}}--{{p.age}}---{{p.sex}}
            </li>
        </ul>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false
        //创建vue实例
        new Vue({
            el: "#root",
            data: {
                keyword: '',
                persons: [
                    {id: 1, name: "马冬梅", age: 18, sex: "女"},
                    {id: 2, name: "周冬雨", age: 19, sex: "女"},
                    {id: 3, name: "周杰伦", age: 20, sex: "男"},
                    {id: 4, name: "温兆伦", age: 21, sex: "男"},
                ],
                filterPersons: []
            },
            watch: {
                keyword: {
                    immediate: true,
                    handler(val) {
                        this.filterPersons = this.persons.filter((p) => {
                            return p.name.indexOf(val) !== -1
                        })
                    }
                }
            }
        })
    </script>
    </body>
    </html>

    computed 实现

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Vue初识</title>
        <script type="text/javascript" src="./js/vue.js"></script>
    </head>
    <body>
    <div id="root">
        <!--遍历数组-->
        <h3>人员列表(遍历数组)</h3>
        <input type="text" placeholder="请输入名字" v-model="keyword"/>
        <ul>
            <li v-for="(p,index) in filterPersons" :key="p.id">
                {{p.name}}--{{p.age}}---{{p.sex}}
            </li>
        </ul>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false
        //创建vue实例
        new Vue({
            el: "#root",
            data: {
                keyword: '',
                persons: [
                    {id: 1, name: "马冬梅", age: 18, sex: "女"},
                    {id: 2, name: "周冬雨", age: 19, sex: "女"},
                    {id: 3, name: "周杰伦", age: 20, sex: "男"},
                    {id: 4, name: "温兆伦", age: 21, sex: "男"},
                ]
            },
            computed: {
                filterPersons() {
                    return this.persons.filter((p) => {
                        return p.name.indexOf(this.keyword) !== -1
                    })
                }
            }
        })
    </script>
    </body>
    </html>

    二、列表排序

    Vue如何实现列表过滤与排序  vue 第1张

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Vue初识</title>
        <script type="text/javascript" src="./js/vue.js"></script>
    </head>
    <body>
    <div id="root">
        <!--遍历数组-->
        <h3>人员列表(遍历数组)</h3>
        <input type="text" placeholder="请输入名字" v-model="keyword"/>
        <button @click="sortType=2">年龄升序</button>
        <button @click="sortType=1">年龄降序</button>
        <button @click="sortType=0">原顺序</button>
        <ul>
            <li v-for="(p,index) in filterPersons" :key="p.id">
                {{p.name}}--{{p.age}}---{{p.sex}}
            </li>
        </ul>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false
        //创建vue实例
        new Vue({
            el: "#root",
            data: {
                keyword: '',
                sortType: 0,
                persons: [
                    {id: 1, name: "马冬梅", age: 30, sex: "女"},
                    {id: 2, name: "周冬雨", age: 31, sex: "女"},
                    {id: 3, name: "周杰伦", age: 18, sex: "男"},
                    {id: 4, name: "温兆伦", age: 19, sex: "男"},
                ]
            },
            computed: {
                filterPersons() {
                    const arr = this.persons.filter((p) => {
                        return p.name.indexOf(this.keyword) !== -1
                    })
                    if (this.sortType) {
                        arr.sort((p1, p2) => {
                            return this.sortType == 1 ? p2.age - p1.age : p1.age - p2.age
                        })
                    }
                    return arr
                }
            }
        })
    </script>
    </body>
    </html>

    三、数据更新的一个问题

    首先演示更新时的一个问题,页面增加一个按钮,点击更新马冬梅的信息。先演示奏效的方法:

    <button @click="updateMei">更新马冬梅信息</button>
    		methods:{
                updateMei(){
                    this.persons[0].name = "马老师"
                    this.persons[0].age = 50
                    this.persons[0].sex = "男"
                }
            }

    Vue如何实现列表过滤与排序  vue 第2张

    再演示不奏效的方法,修改方法:

    methods:{
                updateMei(){
                    //不奏效
                    this.persons[0]={id: 1, name: "马老师", age: 50, sex: "男"}
                }
            }

    运行程序,点击页面按钮,数据是不发生变化的。

    对数组修改时,只有调用数组的相关操作方法才能奏效,包括:

    • push作用:在末尾添加元素

    • pop作用:删除最后一个元素

    • shift作用:删除第一个元素

    • unshift作用:在首位添加元素

    • splice作用:向/从数组添加/删除项目,并返回删除的项目

    • sort作用:对数组的元素进行排序,并返回数组

    • reverse作用:反转数组中元素的顺序

    这样写就可以更新了

    this.persons.splice(0,1,{id: 1, name: "马老师", age: 50, sex: "男"})

    四、Vue.set 方法

    Vue如何实现列表过滤与排序  vue 第3张

    <div id="root">
        <h3>个人信息</h3>
        <h3>姓名:{{name}}</h3>
        <h3>实际年龄:{{age.rAge}}</h3>
        <h3>对外年龄:{{age.sAge}}</h3>
        <h3>学校信息</h3>
        <h3>学校名称:{{school.name}}</h3>
        <h3 v-show="school.address">学校地址:{{school.address}}</h3>
        <button @click="addAddress">添加学校地址属性</button>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false
        //创建vue实例
        new Vue({
            el: "#root",
            data: {
                name:"张三",
                age:{
                    rAge:30,
                    sAge:25
                },
                school:{
                    name:"某不知名大学"
                }
            },
            methods:{
                addAddress(){
            		//以下两种写法都可以
                    //Vue.set(this.school,"address","北京")
                    this.$set(this.school,"address","北京")
                }
            }
        })
    </script>

    但是 Vue.set 是有局限的,我们之前给 data 下的 school 增加了地址属性,但是我们不能给 data 直接增加属性

    如果页面上有数组

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Vue初识</title>
        <script type="text/javascript" src="./js/vue.js"></script>
    </head>
    <body>
    <div id="root">
      	...
        <ul>
            <li v-for="(h,index) in hobby" :key="index">{{h}}</li>
        </ul>
    
        <button @click="changeHobby">修改爱好</button>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false
        //创建vue实例
        new Vue({
            el: "#root",
            data: {
                ...
                hobby:[
                    "抽烟",
                    "喝酒",
                    "烫头"
                ]
            },
            methods:{
                changeHobby(){
                	//这样改是可以的
                    Vue.set(this.hobby,0,"学习")
                    //直接修改是有问题的
                    //this.hobby[0] = "学习"
                }
            }
        })
    </script>
    </body>
    </html>

    五、Vue监视数据的原理

    1、vue 会监视 data 中所有层次的数据

    2、如何监测对象中的数据?

    通过 setter 实现监视,且要在 new Vue时就传入要监测的数据

    • (1).对象中后追加的属性,Vue默认不做响应式处理

    • (2).如需给后添加的属性做响应式,请使用如下API:

    Vue.set(target. propertyName/index,value)vm.$set(target.propertyName/index,value)

    3、如何监测数组中的数据?

    通过包裹数组更新元素的方法实现,本质就是做了两件事:

    • (1).调用原生对应的方法对数组进行更新

    • (2).重新解析模板进而更新页面

    4、在 Vue 修改数组中的某个元素一定要用如下方法:

    • (1).使用这些API:push()pop()shift()unshift()splice()sort()reverse()

    • (2).Vue.set()vm.$set()

    特别注意: Vue.set() 和vm. $set()不能给 vm 或 vm 的根数据对象添加属性!

    六、综合练习

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Vue初识</title>
        <script type="text/javascript" src="./js/vue.js"></script>
    </head>
    <body>
    <div id="root">
        <h3>个人信息</h3>
        <button @click="student.age++">年龄+1</button>
        <button @click="addSex">添加性别属性,默认值:男</button>
        <button @click="student.sex = '未知'">修改性别</button>
        <h5>姓名:{{student.name}}</h5>
        <h5>年龄:{{student.age}}</h5>
        <h5 v-if="student.sex">性别:{{student.sex}}</h5>
        <br/><br/>
        <button @click="addHobby">添加一个爱好</button>
        <button @click="changeHobby">修改第一个爱好为:开车</button>
        <button @click="filterHobby">过滤掉爱好中的抽烟</button>
        <h3>爱好</h3>
        <ul>
            <li v-for="(h,index) in student.hobby" :key="index">{{h}}</li>
        </ul>
        <br/><br/>
        <button @click="addFriend">在列表首位添加一个朋友</button>
        <button @click="updateFirstFriendName">修改第一个朋友名字为:李四</button>
        <h3>朋友们</h3>
        <ul>
            <li v-for="(f,index) in student.friends" :key="index">{{f.name}}--{{f.age}}</li>
        </ul>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false
        //创建vue实例
        new Vue({
            el: "#root",
            data: {
                student:{
                    name: "张三",
                    age: 18,
                    hobby: [
                        "抽烟",
                        "喝酒",
                        "烫头"
                    ],
                    friends: [
                        {
                            name: "jerry",
                            age: 20
                        },
                        {
                            name: "tony",
                            age: 19
                        }
                    ]
                }
            },
            methods: {
                addSex(){
                    //以下两种写法都可以
                    //Vue.set(this.student,"sex","男")
                    this.$set(this.student,"sex","男")
                },
                addFriend(){
                    this.student.friends.unshift({name: "铁柱", age: 25})
                },
                updateFirstFriendName(){
                    this.student.friends[0].name = "李四"
                },
                addHobby(){
                    this.student.hobby.push("学习")
                },
                changeHobby(){
                    //以下三种写法都可以
                    //Vue.set(this.student.hobby,0,"开车")
                    this.$set(this.student.hobby,0,"开车")
                    //从0开始删除1个,插入开车
                    //this.student.hobby.splice(0,1,"开车")
                },
                filterHobby(){
                    this.student.hobby = this.student.hobby.filter((h)=>{
                        return h !== "抽烟"
                    })
                }
            }
        })
    </script>
    </body>
    </html>

    Vue如何实现列表过滤与排序  vue 第4张

    Vue如何实现列表过滤与排序  vue 第5张

    Vue如何实现列表过滤与排序  vue 第6张

    感谢各位的阅读,以上就是“Vue如何实现列表过滤与排序”的内容了,经过本文的学习后,相信大家对Vue如何实现列表过滤与排序这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是蜗牛博客,小编将为大家推送更多相关知识点的文章,欢迎关注!

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    评论

    有免费节点资源,我们会通知你!加入纸飞机订阅群

    ×
    天气预报查看日历分享网页手机扫码留言评论Telegram