Vue 列表过滤与排序的实现

目录
  • 一、数据过滤
    • watch实现
    • computed 实现
  • 二、列表排序
  • 三、数据更新的一个问题
  • 四、Vue.set 方法
  • 五、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">
    <!--遍历数组-->
    <h2>人员列表(遍历数组)</h2>
    <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">
    <!--遍历数组-->
    <h2>人员列表(遍历数组)</h2>
    <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>

二、列表排序

<!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">
    <!--遍历数组-->
    <h2>人员列表(遍历数组)</h2>
    <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 = "男"
            }
        }

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

		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 方法

<div id="root">
    <h2>个人信息</h2>
    <h2>姓名:{{name}}</h2>
    <h2>实际年龄:{{age.rAge}}</h2>
    <h2>对外年龄:{{age.sAge}}</h2>
    <h2>学校信息</h2>
    <h2>学校名称:{{school.name}}</h2>
    <h2 v-show="school.address">学校地址:{{school.address}}</h2>
    <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">
    <h2>个人信息</h2>
    <button @click="student.age++">年龄+1</button>
    <button @click="addSex">添加性别属性,默认值:男</button>
    <button @click="student.sex = '未知'">修改性别</button>
    <h4>姓名:{{student.name}}</h4>
    <h4>年龄:{{student.age}}</h4>
    <h4 v-if="student.sex">性别:{{student.sex}}</h4>
    <br/><br/>
    <button @click="addHobby">添加一个爱好</button>
    <button @click="changeHobby">修改第一个爱好为:开车</button>
    <button @click="filterHobby">过滤掉爱好中的抽烟</button>
    <h2>爱好</h2>
    <ul>
        <li v-for="(h,index) in student.hobby" :key="index">{{h}}</li>
    </ul>
    <br/><br/>
    <button @click="addFriend">在列表首位添加一个朋友</button>
    <button @click="updateFirstFriendName">修改第一个朋友名字为:李四</button>
    <h2>朋友们</h2>
    <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 列表过滤排序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue实现列表拖拽排序的功能

    在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果:这里提供一种简单的实现方案. 此例子基于vuecli3 首先,我们先了解一下js原生拖动事件: 在拖动目标上触发事件 (源元素): ondragstart - 用户开始拖动元素时触发 ondrag - 元素正在拖动时触发 ondragend - 用户完成元素拖动后触发 释放目标时触发的事件: ondragenter - 当被鼠标拖动的对象进入其容器范围内时触发此事件 ondragover - 当某被拖动的对象在另一对象容器范围内拖动时触

  • vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新

    今天写项目的时候遇到了歌手排序的问题,联想到了我们平时的手机通讯录侧栏字母排序,按照ABCDE这样的顺序对名字进行排序. 我们先来看看效果 那就用vue来实现一遍 首先新建一个vue页面,取名为helloworld.vue 在页面里写入内容 <template> <div class="hello"> <div class="singer" id="singer"> <div class="si

  • Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解

    本文实例讲述了Vue+Node实现商品列表的分页.排序.筛选,添加购物车功能.分享给大家供大家参考,具体如下: 1.分页 商品列表的分页实现是后台根据前端请求的页面大小.页码位置,去数据库中查询指定位置的数据然后返回给前端.比如页面大小为8,要查第3页的数据,则跳过2*8条数据,然后返回接下来的8条数据. 实现滚动加载:页面刚一加载完成并不需要请求所有数据,只显示一部分.当用户下拉到页面底部时,再去请求数据并拼接到商品数据列表中.通过vue-infinite-scroll插件实现滚动加载,在框架

  • Vue中使用elementui与Sortable.js实现列表拖动排序

    本文实例为大家分享了使用elementui与Sortable.js实现列表拖动排序的具体代码,供大家参考,具体内容如下 一.安装使用Sortable.js 1.安装 cnpm install sortablejs --save 2.在需要的vue页面单独引入 <script>     import Sortable from 'sortablejs'     export default{         .........         data() {             retur

  • vue实现列表拖拽排序的示例代码

    本文主要介绍了vue实现列表拖拽排序的示例代码,具体如下: <template> <div class="test_wrapper" @dragover="dragover($event)"> <transition-group class="transition-wrapper" name="sort"> <div v-for="(item) in dataList&quo

  • Vue的列表之渲染,排序,过滤详解

    目录 1.列表(渲染.排序.过滤) 1.1条件渲染指令 1.1.1v-show 1.1.2v-if 1.1.3v-if和v-show的小案例 1.1.4v-for(key的原理) 1.2列表过滤 1.3列表排序 总结 1. 列表(渲染.排序.过滤) 1.1 条件渲染指令 有个小技巧: ​ 如果是查找对象中不存在的属性,返回的是一个undefined,利用这一个点不管是v-show或者是v-if,如果值等于undefined的就不显示,假设sex属性不存在 <p v-show="studen

  • Vue 列表过滤与排序的实现

    目录 一.数据过滤 watch实现 computed 实现 二.列表排序 三.数据更新的一个问题 四.Vue.set 方法 五.Vue监视数据的原理 六.综合练习 一.数据过滤 watch实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue初识</title> <script type=&q

  • Vue实用功能之实现拖拽元素、列表拖拽排序

    目录 Vue实现拖拽元素.列表拖拽排序 组件使用 补充:排序动画 总结 Vue实现拖拽元素.列表拖拽排序 需求:    1.左右两个容器,左边和右边的元素可以拖动互换    2.列表拖拽排序 组件使用 Vue.Draggable是一款基于Sortable.js实现的vue拖拽插件支持移动设备.拖拽和选择文本.智能滚动,可以在不同列表间拖拽.不依赖jQuery为基础,vue2过渡动画兼容.支持撤销操作,总之是一款非常优秀的vue拖拽组件 npm或yarn安装方式 yarn add vuedragg

  • Vue列表渲染的示例代码

    用v-for把一个数组对应为一个组件元素 我们用v-for指令根据一组数组的选项列表进行渲染.v-for指令需要使用item in items形式的语法: <ul> <li v-for="item in items"> {{ item.message }} </li> </ul> var vm = new Vue({ el: '#el', data: { items: [ {message: 'foo'}, {message: 'boar

  • Vue2.0 v-for filter列表过滤功能的实现

    使用计算属性app.js var app5 = new Vue({ el: '#app5', data: { shoppingList: [ "Milk", "Donuts", "Cookies", "Chocolate", "Peanut Butter", "Pepto Bismol", "Pepto Bismol (Chocolate flavor)", &quo

  • django rest framework 数据的查找、过滤、排序的示例

    对于管理系统,常常需要展示列表数据,我们对于列表内的数据常常需要查找.过滤.排序等操作,其中查找等操作大部分是在后台进行的.django rest framework可以轻松的实现数据的查找.过滤等操作.接下来我们将以实际的例子进行介绍. 示例代码github地址: https://github.com/jinjidejuren/drf_learn 例如cmdb系统,作为资产管理系统常常需要对数据进行过滤或查找,获取期望的信息. 实现model 1.在这个示例项目中,需要实现对物理服务器的条件过

  • vue实现图片拖动排序

    本文实例为大家分享了vue实现图片拖动排序的具体代码,供大家参考,具体内容如下 原理:现有一个图片的列表,拖动其中一个图片(触发dragstart),当拖动的图片移动到其他图片的位置(触发dragover),则将拖动的图片从原位置移动到该位置(触发dragend). dragstart:当用户开始拖动一个元素或者一个选择文本的时候 dragstart 事件就会触发. dragover:当元素或者选择的文本被拖拽到一个有效的放置目标上时,触发 dragover 事件(每几百毫秒触发一次). dra

  • vue实现拖拽排序效果

    本文实例为大家分享了vue实现拖拽排序效果的具体代码,供大家参考,具体内容如下 效果预览 组件 drag.vue <template>   <TransitionGroup name="group-list" tag="ul">     <li       v-for="(item, index) in list"       :key="item.name"       :draggable=&

随机推荐