当前位置: 首页 > news >正文

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

文章目录

    • 一、计算属性(computed)vs监视属性(watch)
    • 二、监视属性(watch)
      • 第一步:构建主体架构
        • (1)引入vue.js,创建vue实例
        • (2)准备好html容器,将属性导入
      • 第二步:完成列表筛选部分
        • (1)让输入框的value值和vue实例中的属性进行双向绑定
        • (2)watch监视obj中keyword的变化
      • 第三步:完成列表排序部分
    • 三、计算属性(computed)
    • 四、效果图

一、计算属性(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就是一个通过计算而得到的值,

四、效果图

在这里插入图片描述

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

相关文章:

  • 难点:树的代码
  • vulnhub blogger: 1
  • php项目宝塔搭建实战ThinkAdmin通用公众号小程序后台开发框架
  • Web前端系列技术之Web APIs基础(从基础开始)⑥
  • FPGA学习笔记(四)通过数码管学习顶层模块和例化的编写
  • kafka 代码使用
  • 两个单链表相交的一系列问题
  • 连接查询
  • ArrayList源码解析
  • iptables防火墙 (SNAT、DNAT)
  • idea2021.3.3 创建maven-scala项目并解决遇到的问题:通过add frameworks support找到不到scala插件
  • 模板模式【Java设计模式】
  • openGL 材质
  • windows 10 局域网设置固定 IP 地址
  • Python之猜数字游戏
  • JavaScript 如何正确处理 Unicode 编码问题!
  • SegmentFault for Android 3.0 发布
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【刷算法】求1+2+3+...+n
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • es6(二):字符串的扩展
  • Hibernate【inverse和cascade属性】知识要点
  • IndexedDB
  • Javascript设计模式学习之Observer(观察者)模式
  • PaddlePaddle-GitHub的正确打开姿势
  • PHP 小技巧
  • WebSocket使用
  • 构建工具 - 收藏集 - 掘金
  • 关于List、List?、ListObject的区别
  • 深入浏览器事件循环的本质
  • 通过git安装npm私有模块
  • 交换综合实验一
  • # C++之functional库用法整理
  • $$$$GB2312-80区位编码表$$$$
  • (20050108)又读《平凡的世界》
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)负载均衡,回话保持,cookie
  • .htaccess配置常用技巧
  • .Net Core与存储过程(一)
  • .NET 事件模型教程(二)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .ui文件相关
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @NestedConfigurationProperty 注解用法
  • @SuppressWarnings注解
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [20190401]关于semtimedop函数调用.txt