【Vue 快速入门系列】列表的基本使用

news2024/11/18 21:40:47

文章目录

    • 前言
    • 列表的基本使用
    • Key的原理
    • 列表过滤
    • 列表排序

前言

本篇文章讲述Vue中最基本的列表使用,如何迭代列表取值,如何对列表进行过滤、排序等。

列表的基本使用

在Vue中使用列表的时候灰常简单,只需要将Vue属性内的列表数据与dom标签进行绑定即可,使用固定的指令v-for可以迭代列表并渲染出包含数据的dom元素。以下是v-for指令的基本用法:
v-for的用法:

   用于展示列表数据
   语法:v-for="(p.index) in[of] xxx" :key="..."
   这里的xxx可以是数组、对象、字符串、指定的循环次数
   这个key的作用官方是这么解释的
   key属性主要用在Vue的虚拟DOM算法,在新旧nodes对比时辨识VNodes;
   如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法;
   而使用key时,它会基于key的变化重新排列元素顺序,并且会移除/销毁key不存在的元素;
   后面会针对性分析key的用处与原理,以及vue的diff算法。

效果如下:
在这里插入图片描述
代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    <style>
        li{
            font-size: 25px;
        }
    </style>
</head>
<body>
    <div id="demo">
        <!-- 遍历数组 -->
        <ul>
            <li v-for="p in persons" :key="p.id">
                {{p.id}}--{{p.name}}--{{p.age}}
            </li>
        </ul>
        <!-- 遍历对象 -->
        <ul>
            <li v-for="(k,v) in school">
                {{v}}:{{k}}
            </li>
        </ul>
        <!-- 遍历字符串 -->
        <ul>
            <li v-for="(p,index) in s">
                {{index}}:{{p}}
            </li>
        </ul>
        <!-- 遍历指定次数 -->
        <ul>
            <li v-for="(p,index) of n">Hello{{p}}:{{index}}</li>
        </ul>
    </div>
</body>
<script>
    let vm=new Vue({
        el:"#demo",
        data:{
            // 准备工作数组
            persons:[
                {id:"001",name:"张三",age:40},
                {id:"002",name:"张四",age:44},
                {id:"003",name:"张五",age:45},
                {id:"004",name:"李三",age:45},
                {id:"005",name:"李四",age:40},
                {id:"006",name:"李五",age:44},
                {id:"007",name:"王三",age:45},
                {id:"008",name:"王四",age:45},
                {id:"009",name:"王五",age:45}
            ],
            //准备工作对象
            school:{
                name:"南阳理工学院",
                cls:"工科",
                include:"15个教学院"
            },
            // 准备工作字符串
            s:"Hello",
            // 准备工作循环次数 
            n:5
        }
    })
</script>
</html>

Key的原理

先来看一个面试题:react、vue中的key有什么作用?(key的内部原理)

1. 虚拟DOM中key的作用:
		key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】, 
		随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下:
				
2.对比规则:
		(1).旧虚拟DOM中找到了与新虚拟DOM相同的key:
			①.若虚拟DOM中内容没变, 直接使用之前的真实DOM!
			②.若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM。

		(2).旧虚拟DOM中未找到与新虚拟DOM相同的key
			创建新的真实DOM,随后渲染到到页面。
						
3. 用index作为key可能会引发的问题:
		1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作:
						会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低。

		2. 如果结构中还包含输入类的DOM:
						会产生错误DOM更新 ==> 界面有问题。

4. 开发中如何选择key?:
		1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。
		2.如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,
			使用index作为key是没有问题的。

列表过滤

列表过滤实际是一个模糊搜索得过程,通过filter过滤器将需要的数据筛选出来
过滤方式有两种:
  数据监视:
    通过监视搜索框内的数据是否变化,一旦有了变化立即进行筛选
  计算属性:
    将要展示得内容作为计算属性,进行筛选,当搜索框的数据有变化时就对要展示得内容进行计算

过滤之前:

过滤之后:
在这里插入图片描述

原理:
监视搜索框绑定的属性,当属性值发生变化之后就对展示的列表进行过滤,列表是Vue的属性,所以改变之后会重新渲染页面。

源代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    <style>
        table{
            width: 100%;
        }
    </style>
  </head>
  <body>
    <div id="demo">
      搜索:<input type="text" v-model="searched" />
      <table border="true">
        <tr>
          <th>学号</th>
          <th>姓名</th>
          <th>年龄</th>
        </tr>
        <tr v-for="p in templs">
          <th>{{p.id}}</th>
          <th>{{p.name}}</th>
          <th>{{p.age}}</th>
        </tr>
      </table>
    </div>
  </body>
  <script>
    let vm = new Vue({
      el: "#demo",
      data: {
        searched: "",
        persons: [
          { id: "001", name: "张三", age: 40 },
          { id: "002", name: "张四", age: 44 },
          { id: "003", name: "张五", age: 45 },
          { id: "004", name: "李三", age: 45 },
          { id: "005", name: "李四", age: 40 },
          { id: "006", name: "李五", age: 44 },
          { id: "007", name: "王三", age: 45 },
          { id: "008", name: "王四", age: 45 },
          { id: "009", name: "王五", age: 45 },
        ]
      },
      //  使用watch监视属性进行实现   
      /*watch:{
        //   这里是个编程小技巧,""空字符串被包含在所由字符串内
        //   如果一个字符串为abc那么a与空字符得索引都为0
        //   可以使用indexOf进行位置得判定
          searched:{
            immediate:true,
            handler(val){
              this.templs=this.persons.filter((p)=>{
                  return (p.name.indexOf(val)!=-1)
              })
            }
          }
      }*/
      //使用计算属性进行实现
      computed:{
          templs(){
              return this.persons.filter((p)=>{
                  return p.name.indexOf(this.searched)!=-1
              })
          }
      }
    });
  </script>
</html>

列表排序

原序:
在这里插入图片描述

降序:
在这里插入图片描述
升序:
在这里插入图片描述
除了点击按钮,也实现了先筛选再排序与先排序再筛选,具体的实现算法如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    <style>
        table{
            width: 100%;
        }
    </style>
    <!-- 
      加入排序功能,排序与过滤其实需要一块操作
     -->
  </head>
  <body>
    <div id="demo">
      搜索:<input type="text" v-model="searched" />
      <button @click="nammol">点我原序</button>
      <button @click="esc">点我升序</button>
      <button @click="cesc">点我降序</button>
      <table border="true">
        <tr>
          <th>学号</th>
          <th>姓名</th>
          <th>年龄</th>
        </tr>
        <tr v-for="p in templs">
          <th>{{p.id}}</th>
          <th>{{p.name}}</th>
          <th>{{p.age}}</th>
        </tr>
      </table>
    </div>
  </body>
  <script>
    let vm = new Vue({
      el: "#demo",
      data: {
        searched: "",
        persons: [
          { id: "001", name: "张三", age: 40 },
          { id: "002", name: "张四", age: 44 },
          { id: "003", name: "张五", age: 45 },
          { id: "004", name: "李三", age: 45 },
          { id: "005", name: "李四", age: 40 },
          { id: "006", name: "李五", age: 44 },
          { id: "007", name: "王三", age: 45 },
          { id: "008", name: "王四", age: 45 },
          { id: "009", name: "王五", age: 45 },
        ],
        tag:0,  //0原顺序 1升序 2降序
        templs:[]
      },
      methods: {
        nammol() {
          this.tag=0
        },
        esc(){
          this.tag=1
        },
        cesc(){
          this.tag=2
        }
      },
      //  使用watch监视属性进行实现数据的筛选及排序
      watch:{
          // 如果只监测一个search属性得话,没有办法在点击排序的时候进行排序
          searched:{
          //页面初次装载完毕执行一次。
            immediate:true,
            handler(val){
              this.templs=this.persons.filter((p)=>{
                  return (p.name.indexOf(val)!=-1)
              })
              if (this.tag){
                this.templs.sort((v1,v2)=>{
                  return this.tag===1?v2.age-v1.age:v1.age-v2.age
                })
              }
            }
          },
          //针对已经过滤出来的数据进行排序,如果是原序输出就重新筛选一遍(如果不写这个当tag做出改变的时候并不会有dom响应)
          tag:{
            handler(){
              if (this.tag){
                this.templs.sort((v1,v2)=>{
                  return this.tag===1?v2.age-v1.age:v1.age-v2.age
                })
              }
              else{
                this.templs=this.persons.filter((p)=>{
                  return (p.name.indexOf(this.searched)!=-1)
              })
              }
            }
          }
      }
      //使用计算属性进行实现
      
      // computed:{
      //     templs(){
      //         const temp= this.persons.filter((p)=>{
      //             return p.name.indexOf(this.searched)!=-1
      //         })
      //         if (this.tag){
      //           temp.sort((v1,v2)=>{
      //             return this.tag===1?v2.age-v1.age:v1.age-v2.age
      //           })
      //         }
      //         return temp
      //     }
      // }
    });
  </script>
</html>


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[架构之路-57]:目标系统 - 平台软件 - 用户空间驱动与硬件抽象层HAL

目录 前言&#xff1a; 第1章 驱动程序功能设计 1.1 关于用户空间驱动 1.2 硬件驱动程序的四大功能概述 1.3 OAM管理面功能&#xff1a;站在管理源的角度&#xff0c;看如何监控使能和监控硬件。 1.4 控制面功能&#xff1a;站在业务的角度看&#xff0c;如何使能和监控硬…

基于Android的五子棋游戏APP设计

目 录 第一章&#xff1a;绪论 1 1.1智能手机与Android系统的发展历程 1 1.1.1 智能手机 1 1.1.2 Android系统基本情况介绍 2 1.2课题现状及应用前景 3 1.2.1 五子棋简介 3 1.2.2 课题现状及应用前景 3 第二章&#xff1a;开发环境的搭建 5 2.1 系统开发环境 5 2.2 系统开发环境…

SpringCould(一)

视频链接&#xff1a;https://www.bilibili.com/video/BV1f94y1U7AB/?vd_source9545770e4a2968c05878ffac8589ec6c 视频选集&#xff1a;P1— P15 文章目录1.微服务简介1.1 单体架构不足1.2 微服务1.3 微服务的特点1.4 微服务的自动部署&#xff08;CI/CD&#xff09;(持续集成…

一文了解数据结构

目录 数据结构 什么是数据结构 链表 数组 栈 队列 哈希表 堆 数据结构 什么是数据结构 「数据结构」决定了数据的顺序和位置关系.数据存储于内存时&#xff0c;决定了数据顺序和位置关系的便是「数据结构」 链表 「链表」中的数据呈线性排列。链表中添加删除数据比较…

多旋翼无人机仿真 rotors_simulator:基于PID控制器的位置控制---水平位置控制

多旋翼无人机仿真 rotors_simulator&#xff1a;基于PID控制器的位置控制---水平位置控制前言水平位置控制串级P控制收敛结果收敛过程串级PID控制收敛结果收敛过程结果总结前言 无人机&#xff08;Unmanned Aerial Vehicle&#xff09;&#xff0c;指的是一种由动力驱动的、无…

机器学习从零到入门 GBDT 梯度提升决策树

GBDT 梯度提升决策树详解一、 梯度的概念1、日常生活中的梯度2、函数中的梯度2.1、走进数学2.2、从数学到机器学习(1)、损失函数的理解 loss function(2)、梯度的理解 gradient(3)、损失函数的梯度下降二、GBDT1、回归树 - Regression Decision Tree&#xff0c;DT2、梯度提升 …

利用Python实现mysql数据库的基础操作

一&#xff1a;环境准备&#xff1a; 1.安装第三方库&#xff1a;pymsql 在pycharm的terminal中执行命令&#xff1a;pip3 install pymsql 2.导入第三方库到py文件中 import pymsql 二&#xff1a;创建mysql数据库的链接对象&#xff1a; 1.封装一个Python类&#xff0c;在该…

Python爬虫入狱小技巧

呀&#xff0c;来坐牢的是吧&#xff0c;坐牢是不可能坐牢的&#xff0c;骚年&#xff0c;下面就是方法&#xff0c;早上学&#xff0c;晚上进去 一、整体思路 爬虫一开始要把思路理清楚&#xff0c;即从网页源代码或者网页数据接口&#xff0c;获取需要的数据.大致思路如下 …

【Java进阶】JUC并发基础

文章目录1.概念1.1 什么是JUC1.2 线程与进程1.3 线程的几种状态1.4 守护线程1.5 死锁与活锁1.6 乐观锁与悲观锁1.7 自旋锁2.Lock2.1 使用Lock2.2 Lock与Synchronized2.3 虚假唤醒3.八锁问题3.1 创建一个Phone实例多线程调用两个方法3.2 创建一个Phone实例多线程调用两个方法&am…

基于热传导矩阵(HCM)边缘检测方法在红外图像中的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

3道真题训练|学会链表的前世今生

&#x1f64b;很多朋友都问我学完基础知识以后怎样提高编程水平&#xff1f;当然是刷题啦&#xff01;很多小伙伴都在纠结从哪里开始&#xff0c;今天给大家推荐一个身边朋友都在使用的刷题网站&#xff1a;点击进入牛客网刷题吧&#xff01; &#x1f64b;‍♂️今天是Java …

中文文本分类,基本模型的pytoch实现

学习说明&#xff1a;最近发现了一个宝藏仓库&#xff0c;将常见的文本分类方法做了一个介绍、及封装。现在将学习这仓库的一些笔记记录如下 参照资料 649453932/Chinese-Text-Classification-Pytorch: 中文文本分类&#xff0c;TextCNN&#xff0c;TextRNN&#xff0c;FastT…

宣布 .NET MAUI 支持 .NET 7 Release Candidate 2

支持 .NET 7 Release Candidate 2的 .NET 多平台应用程序 UI (MAUI) 现在可在 Windows 和 Mac 上的 Visual Studio 17.4 Preview 4 中使用。RC2 的主要主题是质量和对带有 iOS 16 的 Xcode 14 的 .NET 支持。此版本包含在生产中使用的上线支持许可证。 在相关新闻中&#xff0…

Linux 内存node和zone

文章目录前言一、内存模型二、&#xff08;N&#xff09;UMA2.1 简介2.2 节点2.3 UMA节点与Flat Memory Model2.4 zone2.4.1 zone2.4.2 zone_type参考资料前言 一、内存模型 所谓memory model&#xff0c;其实就是从cpu的角度看&#xff0c;其物理内存的分布情况&#xff0c;…

图解操作系统-cpu cache

不同物理器件的访问速度不一&#xff1a;速度快的代价高、容量小&#xff1b;代价低且容量大&#xff0c;速度较慢。 为充分发挥各种器件优点&#xff0c;计算机存储数据的物理器件不会只选择一种&#xff0c;而是以CPU为核心&#xff0c;由内而外地组建一整套存储体系结构。它…

亿可控_第2章_指标数据采集与断连监控

亿可控_第2章_指标数据采集与断连监控 文章目录亿可控_第2章_指标数据采集与断连监控第2章 指标数据采集与断连监控学习目标1. EMQ指标主题订阅1.1 Eclipse paho简介1.2 发送与订阅消息1.2.1 发送消息1.2.2 订阅消息1.3 订阅指标主题1.3.1 需求分析1.3.2 实现思路1.3.3 代码实现…

23模式---单例模式

单例模式&#xff0c;属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例&#xff08;根据需要&#xff0c;也有可能一个线程中属于单例&#xff0c;如&#xff1a;仅线程上下文内使用同一个实例&#xff09; 这个也是23设计模型中最…

Python 图像处理OpenCV:几何变换(笔记)

包括图像缩放、图像平移、图像旋转、图像的仿射变换、图像的透射变换及图像金字塔等内容。 图像缩放&#xff1a; 缩放是对图像的大小进行调整&#xff0c;即使图像放大或缩小。cv2.resize(src,dsize,fx0,fy0,interpolationcv2.INTER_LINEAR)src : 输入图像dsize: 绝对尺寸&a…

Linux运维面试题总结—Linux基础、计算机网络基础

文章目录一、三次握手四次挥手二、如何划分vlan三、为什么划分vlanvlan三个模式&#xff1a;vxlan和vlan区别是什么&#xff1f;四、OSI七层模型及对应协议五、Linux中 查找大于10M的文件并删除六、查看cup占用情况&#xff0c;查看内存&#xff0c;查看磁盘IO使用情况&#xf…

图像处理黑科技——弯曲矫正、去摩尔纹、切边增强、PS检测

目录0 前言1 弯曲矫正2 去摩尔纹3 图像切边增强4 PS检测5 总结0 前言 合合信息是行业领先的人工智能及大数据科技企业&#xff0c;专注文字识别领域16年&#xff0c;在智能文字识别及商业大数据等核心领域处于国内领先地位&#xff0c;全球企业和个人用户提供创新的数字化、智…