v-for遍历数组或者对象,渲染结构、v-bind动态设置class和style

news2024/9/25 13:18:27

(一)v-for数组变化(增加一项,删除一项), 会更新页面吗?那么数组改变后,是如何更新的呢?

1. v-for

  • 作用:可以遍历数组或者对象,用于渲染结构。
  • 遍历数组语法:
    v-for="item in 数组名"
    v-for="(item, index) in 数组名“
  • 遍历对象语法:
    v-for = "(value , key) in 对象名"
  • 遍历数字语法:
    v-for = "item in 数字"
  • key值:
    ①、不写:默认按照下标给虚拟dom打标识。
    ②、index:按照下标给虚拟dom打标识index!就地复用dom节点效率会低。
    ③、id:按照下标给虚拟dom打标识id!就地复用dom节点效率会高!
<template>
  <div>
    <h1>v-for</h1>
    <p>获取图书列表:[{id:1,name:"zs",age:18},{id:2,name:"ls",age:18}]</p>
    <p>数组:直接使用v-for 循环!直接写在标签上即可,让那个标签循环,就写在那个标签上</p>
    <ul>
      <li v-for="(item,index) in list" :key="index">
        姓名:{{ item.name }} 年龄:{{ item.age }}
      </li>
      <!-- item:每个成员(自定义的名字) -->
      <!-- index:下标(自定义的名字) -->
      <!-- list:被遍历的数据 -->
    </ul>
  </div>
</template>
<script>
export default {
  data(){
    return{
      list:[
        {id:1,name:"张三",age:18},
        {id:2,name:"李四",age:66},
        {id:3,name:"王五",age:99},
      ]
    }
  }
}
</script>

<style>
  li{
    background-color: #ccc;
    font-size: 20px;
  }
</style>

在这里插入图片描述

(1)vue的就地复用策略

  • 就地复用:Vue会尽可能的就地(同等级,同位置)复用旧dom结构,对比虚拟dom,进行差异化更新。(效率更高)
  • 下面的就使用到了就地复用原则,数据变了,页面dom节点留下来,更新为新的dom节点!
    在这里插入图片描述
<template>
  <div>
    <h1>v-for</h1>
    <button @click="add">新增一个成员</button>
    <ul>
      <!--item:成员 index:下标  -->
      <li v-for="(item,index) in list" :key="index">
        姓名:{{ item.name }} 年龄:{{ item.age }}
      </li>
    </ul>
    <hr>
    <ul>
      <li v-for="item in list" :key="item.id">
        姓名:{{ item.name }} 年龄:{{ item.age }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data(){
    return{
      list:[
        {id:1,name:"张三",age:18},
        {id:2,name:"李四",age:66},
        {id:3,name:"王五",age:99},
      ]
    }
  },
  methods:{
    add(){
      // 往list内部添加一个新的成员
      let one = {
        // 模拟后台数据,id为了数据与数据之间的区分,不一定非得是整数!
        id:Math.random(),
        name:"新来的",
        age:19
      };
      // 添加到数组的第二个位置
      this.list.splice(1,0,one);
      // 1:代表从数组下标为1的位置进行操作
      // 0:代表不删除的个数为0
      // one:代表新添加的成员
    }
  }
}
</script>
<style>
  li{
    background-color: #ccc;
    font-size: 20px;
  }
</style>

(2)页面dom结构是一个树形结构

  • html渲染出来的真是dom树,是个树形结构(复杂)。每个标签都是树的某个节点。

(3)为什么不对比真实dom节点?每个小真实dom节点很复杂

  • console.dir(dom)以文件的形式展开,但是里面非常复杂。每个标签,虽然只是树形结构的一个小节点,但属性也非常多。 => 遍历真是dom找差异,非常费时。
  • 真实DOM属性过多,有很多无用的属性,无需遍历对比。
  • 如何优化呢?对比属性少的虚拟dom!

(4)虚拟dom是什么?

  • 虚拟dom:本质就是保存节点信息,描述真实dom的JS对象。(真实DOM在Vue这个电子档案)
<template>
	<div id="box">
		<p class="my_p">123</p>
	</div>
</template>
const dom = {
	type: 'div',
	attributes:[{id: 'box'}],
	children:[{
		type:'p',
		attributes: [{class: 'my_p'}],
		text: '123'
	}]
}
  • 虚拟dom(一个个js对象):可以用最少的属性结构,描述真实的dom。

(5)虚拟dom对比更新

在这里插入图片描述

  • 内存中创建虚拟dom,快速比较变化,给真实DOM打补丁(更新)。

(6)diff算法

  • 但是就算是虚拟dom,和真实dom一样,也是树形结构
  • 内部又是如何对比的呢?
①、策略1:先同层级根元素比较。
  • 如果根元素变化,那么不考虑复用,整个dom树删除重建。
    在这里插入图片描述
  • 如果根元素不变,对比出属性的变化更新,并考虑往下递归复用。
    在这里插入图片描述
②、策略2:对比同级兄弟元素
  • 默认按照下标进行对比复用。(:key=“index” 或者 不设置)
  • 就是上面图片显示的1个不动,3个更新
    在这里插入图片描述
  • key设置值唯一固定且不变。(:key=“item.id”)
  • 就是上面图片显示的3个不动,1个更新
    在这里插入图片描述
③、区别:
  1. 设置和不设置key有什么区别?
    ①、不设置key,默认同级兄弟元素按照下标进行比较。
    ②、设置了key,按照相同key的新旧元素比较。
  2. key值要求是?
    ①、字符串或者数组,唯一不重复。
    ②、有id用id,有唯一值用唯一值,实在没有,才用索引。
  3. key的好处?
    key的作用:提高虚拟DOM的对比复用性能。

(二)控制样式,要么操作类,要么操作行内样式,在Vue中,应该如何操作class类呢?如何操作style行内样式呢?

(1)v-bind对于class和style的增强:动态设置class和style

1、用v-bind动态设置标签的class类名

  • 语法::class="对象/数组"
    ①、对象:如果键值对的值为true,那么就有这个类,否则没有这个类。
    ②、数组:数组中的所有类,都会添加到盒子上。
  • v-bind对于类名操作的增强,注意点:class不会影响到原来的class属性。

2、用v-bind动态设置标签的style行内样式

  • 语法::style="对象/数组"
:class="{类名: 布尔值}, true使用, false不用
:class="[类名1,类名2]:style="{css属性名: 值}"
<div class="box" :style="{color:color, backgroundColor: bg }">123</div>

<div class="box" :style="[styleObj1, styleObj2]">123</div>

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

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

相关文章

robotframework之python扩展库编写

通过对robot自动化框架的使用&#xff0c;大大方便了我们做自动化测试。但很多时候官网提供的扩展库并不能满足我们的测试要求&#xff0c;此时就需要我们编写自己的扩展库。这里以ubuntu下使用python编写自定义扩展库举例说明。 最近笔者在做物联网方面的自动化测试&#xff…

FASTADMIN联合查询 搜索

控制器中添加relationSearch开关 控制器里面添加联合查询 MODEL里面添加 js里面添加即可 可以查看数据json 搜索开启searchFileds就可以了

❤️创意网页:生日快乐!穿越奇妙时光的温暖庆祝(HTML+CSS+JS)简单好用

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

【Linux】使用git 连接到远程gitee仓库

一.创建gitee仓库 登陆到自己的gitee&#xff0c;点击新建仓库 输入仓库名称&#xff0c;注意gitee初次创建仓库时只能设置成私有的 创建后的页面是这样的&#xff0c;复制HTTPS 二.git三板斧 1.安装git 打开xshell&#xff0c;输入命令&#xff1a; yum install git 可以输入…

SpringBoot中集成Flyway实现数据库sql版本管理入门以及遇到的那些坑

场景 Git/ SVN 是代码界的版本控制工具&#xff0c;那么&#xff0c;Flyway 就是一款数据库界的版本控制工具&#xff0c; 它可以记录数据库的变化记录。可能很多公司都是通过人工去维护、同步数据库脚本&#xff0c; 但经常会遇到疏忽而遗漏的情况&#xff0c;举个简单的例…

glob找不到文件而os.listdir可以

前几天遇到了一个问题&#xff0c;就是glob找不到文件而os.listdir可以 /mnt/data/datasets/abc[123]&#xff1a; ├── img_0001.jpg ├──img_0002.jpg代码 import os import glob path /mnt/data/datasets/abc[123] os.listdir(path) glob.glob(os.path.join(path, *.…

ES6: Proxy概念及用法

Proxy如其名&#xff0c; 它的作用是在对象和和对象的属性值之间设置一个代理&#xff0c;获取该对象的值或者设置该对象的值&#xff0c; 以及实例化等等多种操作&#xff0c; 都会被拦截住&#xff0c; 经过这一层我们可以统一处理&#xff0c;我们可以认为它就是“代理器” …

使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?

# 问题原因 关于这个问题&#xff0c;其实答案相对统一&#xff0c;实际上用大白话说起来也容易理解。 1.初始化问题 先看一下Java初始化类的顺序&#xff1a;父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块…

前端学习——Web API (Day3)

事件流 事件流和两个阶段说明 事件捕获 事件冒泡 阻止冒泡 解绑事件 事件委托 案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" …

day1-搜索插入位置

搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: …

flutter开发实战-底部bottomNavigationBar➕PageView

flutter开发实战-底部bottomNavigationBar tabbar在app中非常常见&#xff0c;底部BottomNavigationBar属性 一、BottomNavigationBar属性 BottomNavigationBar组件的常用属性&#xff1a; type&#xff1a;tabbar样式&#xff0c;默认为白色不显示&#xff1b;fixedColor:t…

AR眼镜:可视化声音

推荐&#xff1a;将 NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 音频可以包括各种各样的声音&#xff0c;从人类语音到非语音声音&#xff0c;如狗吠和警笛声。在为有听力障碍的人设计可访问的应用程序时&#xff0c;应用程序应该能够识别声音并理…

【二分查找】面试题 08.03. 魔术索引

面试题 08.03. 魔术索引 解题思路 改写递归二分查找的思路首先查找mid的值是不是mid 如果是 由于有多个解&#xff0c;那么递归搜索左半边的空间然后如果没找到&#xff0c;首先搜索左半边的空间&#xff0c;然后搜索右半边的空间 class Solution {public int res -1;privat…

mybatis-plus案例报错

报错信息: Error creating bean with name ‘dataSource’ defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Generic.class]: Bean instantiation via factory method failed; nested exception is org.springframework…

ELK 企业级日志分析系统(一)

ELK 一、ELK理论日志管理方案为什么要使用ELK完整日志系统基本特征ELK 简介ELK 的工作流程 二、ELK实验ELK Elasticsearch 集群部署ELK Logstash 部署&#xff08;在 apche节点上操作&#xff09;ELK Kiabana 部署&#xff08;在 Node1 节点上操作) 一、ELK理论 日志管理方案 …

django对数据库中的表进行重新生成

删除数据库中的表删除项目中migrations包下的初始化文件 进入到manage.py目录下执行命令python manage.py makemigrations执行完上述命令之后&#xff0c;再执行命令python manage.py migrate就可以啦 关于详细的数据表生成见博文&#xff1a;https://blog.csdn.net/David_hou…

IO多路复用之select,poll,epoll

所以&#xff0c;我们调用 select 会把所有要管理的 socket 的 fd (文件描述符&#xff0c;Linux下皆为文件&#xff0c;简单理解就是通过 fd 能找到这个 socket)传到内核中。 此时&#xff0c;要遍历所有 socket&#xff0c;看看是否有感兴趣的事件发生。如果没有一个 socket…

Linux常见维护报错,修复MBR引导/修复grub2菜单/内核文件丢失

目录 一&#xff0c;修复MBR 1.模拟MBR损坏 2.重启查看系统 3.借助当前系统的光盘来进行修复 4.进入修复模式 进行修复 5.恢复正常 二&#xff0c;修复grub2菜单 1.出现情况 2.进入修复模式 3.进行修复grub2菜单 4.退出重启即可 三&#xff0c;内核文件丢失 1.进入安全模式 2.挂…

进销存软件哪个好?怎么选?(附模板)

已经把挑选进销存软件的几个注意点归纳的很到位了&#xff1a; 软件价格收费模式&#xff08;按年付费还是一次性买断&#xff09;功能要贴合本企业使用注重数据的准确性与安全性操作一定要简单要有良好的售后服务支持 在这几点的基础上&#xff0c;我简单说一下&#xff1a;…

运维开发面试题第四期(最后有数据库的题)

linux 如何查看当前linux系统的版本号&#xff08;uname -a 内核 cat /proc/version版本&#xff09;、系统状态《如CPU使用&#xff08;top - bn&#xff09;&#xff0c;内存使用情况&#xff08;vmstat,free-m&#xff09;》、如何查看监控磁盘 io负载&#xff08;iostat/ls…