Vue.js------vue基础

news2025/9/21 12:06:34
  • 1. 能够了解更新监测, key作用, 虚拟DOM, diff算法
  • 2. 能够掌握设置动态样式
  • 3. 能够掌握过滤器, 计算属性, 侦听器
  • 4. 能够完成品牌管理案例

一.Vue基础_更新监测和key

1.v-for更新监测 

 目标:目标结构变化, 触发v-for的更新 

  • 情况1: 数组翻转
  • 情况2: 数组截取
  • 情况3: 更新值

 口诀:

数组变更方法, 就会导致v-for更新, 页面更新

  • push 方法是 JavaScript 数组对象的一个方法,用于向数组的末尾添加一个或多个新元素,并返回添加新元素后数组的新长度 
  • pop 方法是 JavaScript 数组对象的一个方法,用于移除数组的最后一个元素,并返回被移除的元素。
  • shift 方法是 JavaScript 数组对象的一个方法,用于移除数组的第一个元素,并返回被移除的元素。
  • unshift 方法是 JavaScript 数组对象的一个方法,用于向数组的开头添加一个或多个新元素,并返回添加新元素后数组的新长度。
  • splice 方法是 JavaScript 数组对象的一个方法,用于在指定位置插入或删除元素,并返回被删除的元素组成的数组。
  • sort 方法是 JavaScript 数组对象的一个方法,用于对数组的元素进行排序。默认情况下,sort 方法会将数组的元素转换为字符串,然后按照 Unicode 码点顺序进行排序。
  • reverse 方法是 JavaScript 数组对象的一个方法,用于颠倒数组中元素的顺序,即将数组中的元素从后向前排列。

数组非变更方法, 返回新数组, 就不会导致v-for更新, 可采用覆盖数组或this.$set() 

  • filter 方法可以帮助程序员方便地对数组进行筛选,从而得到符合特定条件的元素集合。
  •  

新建一个文件夹,用vscode打开文件,在用命令vue create demo创建项目

 

<template>
  <div>
    <ul>
      <li v-for="(val,index) in arr" :key="index">{{ val }}</li>
    </ul>
    <button @click="revBtn">数组翻转</button>
    <button @click="sliceBtn">截取前三个</button>
    <button @click="updateBtn">点击改掉第一个元素的值</button>
  </div>
</template>

<script>
  export default {
    data(){
      return {
        arr: [5,3,9,2,1]
      }
    },
    methods: {
      revBtn(){
        // 1.数据翻转可以让v-for更新
        this.arr.reverse()
      },
      sliceBtn(){
        // 2.数组slice方法不会造成v-for更新
        // slice不会改变原始数组
        this.arr.slice(0,3)
        // console.log(re)

        // 解决v-for更新 ---覆盖原始数组
        let newArr = this.arr.slice(0,3)
        this.arr = newArr
      },
      updateBtn(){
        // 3.更新某个值的时候,v-for是监测不到的
        // this.arr[0] = 1000;

        // 解决-This.$set()
        // 参数1:更新目标结构
        // 参数2:更新位置
        // 参数3:更新值
        this.$set(this.arr,0,1000)
      }
    }
  }
</script>

<style>

</style>

在截取前三个问题中,如何解决v-for更新,如下图: 

 

在点击改掉第一个元素的值中,如何解决v-for更新问题,如下: 

 

1. 哪些数组方法会导致v-for更新页面?

         可以改变原数组的方法

2. 有的数组方法不导致v-for更新页面, 如何处理?

        拿返回的新数组, 直接替换旧数组 this.$set()方法更新某个值  

2.v-for就地更新  

 目标:当数组改变后是如何更新的

旧-虚拟DOM结构:                                          新-虚拟DOM结构:

新旧DOM产生后对比, 然后决定是否复用真实DOM/更新内容

<template>
    <div>
        <ul>
            <li v-for="(val, ind) in arr" :key="ind">{{ val }}</li>
        </ul>
        <button @click="btn">下标1位置插入新来的</button>
    </div>
</template>

<script>
    export default {
        data(){
            return {
                arr: ["老大","老二","老三"]
            }
        },
        methods: {
            btn(){
                this.arr.splice(1,0,'新来的')
            }
        }
    }
</script>

<style>

</style>

 

 v-for更新时, 是如何操作DOM的?

             循环出新的虚拟DOM结构, 和旧的虚拟DOM

结构对比, 尝试复用标签就地更新内容

 3.真实DOM

目标:在document对象上, 渲染到浏览器上显示的标签 

 

虚拟DOM  

目标:本质是保存节点信息, 属性和内容的一个JS对象 ,真实DOM属性过多, 遍历耗时

 

目标:在内存中比较变化部分, 然后给真实DOM打补丁(更新)

 

  1. 内存中生成一样的虚拟DOM结构(==本质是个JS对象==)

    因为真实的DOM属性好几百个, 没办法快速的知道哪个属性改变了

    比如template里标签结构

    <template>
        <div id="box">
            <p class="my_p">123</p>
        </div>
    </template>

    对应的虚拟DOM结构

    const dom = {
        type: 'div',
        attributes: [{id: 'box'}],
        children: {
            type: 'p',
            attributes: [{class: 'my_p'}],
            text: '123'
        }
    }
  2. 以后vue数据更新

    • 生成新的虚拟DOM结构

    • 和旧的虚拟DOM结构对比

    • 利用diff算法, 找不不同, 只更新变化的部分(重绘/回流)到页面 - 也叫打补丁

==好处1: 提高了更新DOM的性能(不用把页面全删除重新渲染)==

==好处2: 虚拟DOM只包含必要的属性(没有真实DOM上百个属性)==

1. 虚拟DOM是什么?

本质就是一个JS对象, 保存DOM关键信息

2. 虚拟DOM好处?

      提高DOM更新的性能, 不频繁操作真实DOM,

      在内存中找到变化部分, 再更新真实DOM(打补丁)

3.diff算法  

目标:同级比较-根元素变化-整个dom树删除重建  

 

旧虚拟DOM

<div id="box">
    <p class="my_p">123</p>
</div>

新虚拟DOM

<ul id="box">
    <li class="my_p">123</li>
</ul>
情况2: 根元素没变, 属性改变, ==元素复用==, 更新属性

旧虚拟DOM

<div id="box">
    <p class="my_p">123</p>
</div>

新虚拟DOM

<div id="myBox" title="标题">
    <p class="my_p">123</p>
</div>

01、第一章webpack+vue基础/1-20 虚拟DOM+Diff算法

1. diff算法如何比较新旧虚拟DOM? 同级比较

2. 根元素变化? 删除重新建立整个DOM树

3. 根元素未变, 属性改变? DOM复用, 只更新属性

4.无key 

目标:从第二个往后更新内容 – 性能不高

 情况3: 根元素没变, 子元素没变, 元素内容改变
无key - 就地更新

v-for不会移动DOM, 而是尝试复用, 就地更新,如果需要v-for移动DOM, 你需要用特殊 attribute key 来提供一个排序提示

<ul id="myUL">
    <li v-for="str in arr">
        {{ str }} 
        <input type="text">
    </li>
</ul>
<button @click="addFn">下标为1的位置新增一个</button>
export default {
    data(){
        return {
            arr: ["老大", "新来的", "老二", "老三"]
        }
    },
    methods: {
        addFn(){
            this.arr.splice(1, 0, '新来的')
        }
    }
};

 

目标:最大限度尝试就地修改/复用相同类型元素

 

有key, 值为索引  

目标:有key属性, 基于key的来比较新旧虚拟DOM, 移除key不存在元素

目标:先产生新旧虚拟DOM, 根据key比较, 还是就地更新  

 

有key, 值唯一不重复的字符串或数字

目标:有key属性, 基于key的来比较新旧虚拟DOM, 移除key不存在元素

  • 给每个数据换成对象, 准备id, 把id的值作为key  

 

有key, 值为id

目标:先产生新旧虚拟DOM, 根据key比较

 

1. 子元素或者内容改变会分diff哪2种情况比较?

无key, 就地更新

有key, 按照key比较

2. key值要求是?

唯一不重复的字符串或者数值

3. key应该怎么用?

有id用id, 无id用索引

4. key的好处? 可以配合虚拟DOM提高更新的性能

v-for什么时候会更新页面呢?

           数组采用更新方法, 才导致v-for更新页面

vue是如何提高更新性能的?

         采用虚拟DOM+diff算法提高更新性能

虚拟DOM是什么?

        本质是保存dom关键信息的JS对象
diff算法如何比较新旧虚拟DOM?

       根元素改变 – 删除当前DOM树重新建

       根元素未变, 属性改变 – 更新属性

       根元素未变, 子元素/内容改变

             无key – 就地更新 / 有key – 按key比较

 5.动态class

目标: 用v-bind给标签class设置动态的值

  • 语法 :class="{类名: 布尔值}"  

如何给标签class属性动态赋值?

       :class=“{类名: 布尔值}”, true使用, false不用

6.动态style  

目标: 给标签动态设置style的值

语法 :style="{css属性名: 值}"

 

给style赋值和class区别是?

             :class="{类名: 布尔值}”, true使用, false不用

             :style="{css属性名: 值}"  

7.案例-品牌管理(铺)  

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

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

相关文章

专为玄学设计的7B大模型:依托10,000+高质量指令,全面覆盖玄学领域的大模型

前言 现如今&#xff0c;AI大模型已经无孔不入&#xff0c;连玄学领域也"在劫难逃"。前有新闻称数百万人正在"求神拜佛"般地与ChatGPT交流&#xff0c;后又有教堂聘请"AI传教士"协助神职人员进行宗教仪式。可以说&#xff0c;"科学的尽头就…

51单片机学习笔记16 小型直流电机和五线四相电机控制

51单片机学习笔记16 小型直流电机和五线四相电机控制 一、电机分类二、小型直流电机控制1. 简介2. 驱动芯片ULN2003D3. 代码实现dc_motor_utils.cmain.c 三、五线四相步进电机控制1. 步进电机工作原理2. 构造3. 极性区分4. 驱动方式5. 28BYJ-48步进电机&#xff08;1&#xff0…

python统计分析——一般线性回归模型

参考资料&#xff1a;python统计分析【托马斯】 当我想用一个或多个其他的变量预测一个变量的时候&#xff0c;我们可以用线性回归的方法。 例如&#xff0c;当我们寻找给定数据集的最佳拟合线的时候&#xff0c;我们是在寻找让下式的残差平方和最小的参数(k,d)&#xff1a; 其…

什么是容器安全,该怎么进行容器安全的检测防护

随着容器技术的迅速发展和普及&#xff0c;越来越多的企业开始采用容器化解决方案来优化应用部署、提高资源利用率和降低成本。然而&#xff0c;在对大规模部署和使用容器应用来提升业务系统开发速度的时候&#xff0c;大量的数据对象、多种安全风险都需要检测&#xff0c;容器…

头歌-机器学习 第11次实验 softmax回归

第1关&#xff1a;softmax回归原理 任务描述 本关任务&#xff1a;使用Python实现softmax函数。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.softmax回归原理&#xff0c;2.softmax函数。 softmax回归原理 与逻辑回归一样&#xff0c;softmax回归同样…

设计模式之迭代器模式(下)

3&#xff09;使用内部类实现迭代器 1.JDK中的迭代器示例 为了能够让迭代器可以访问到聚合对象中的数据&#xff0c;还可以将迭代器类设计为聚合类的内部类 package java.util;public abstract class AbstractList<E> extends AbstractCollection<E> implements…

Electron 桌面端应用的使用 ---前端开发

Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 入门…

Adobe After Effects 2024 v24.3 macOS 视频合成及特效制作软件 兼容 M1/M2/M3

Adobe After Effects 是一款适用于视频合成及特效制作软件,是制作动态影像设计不可或缺的辅助工具,是视频后期合成处理的专业非线性编辑软件。 macOS 12.0及以上版本可用 应用介绍 Adobe After Effects简称 AE 是一款适用于视频合成及特效制作软件,是制作动态影像设计不可或缺…

Linux CentOS 安装 MySQL 服务教程

Linux CentOS 安装 MySQL 服务教程 1. 查看系统和GNU C库(glibc)版本信息 1.1 查询机器 glibc 版本信息 glibc&#xff0c;全名GNU C Library&#xff0c;是大多数Linux发行版中使用的C库&#xff0c;为系统和应用程序提供核心的API接口。在Linux系统中&#xff0c;特别是在…

Vue3 使用ElementUI 显示异常

element提供的样例不能正常显示&#xff0c;需要进行配置 1.npm install element-plus --save 2.main.js // main.ts import { createApp } from vue import ElementPlus from element-plus //全局引入 import element-plus/dist/index.css import App from ./App.vue const …

恶意软件现在扫描公司内部的网络是否存在严重漏洞

Palo Alto Networks 的专家发现 &#xff0c;攻击者最近越来越多地采用所谓的“扫描攻击”。此类攻击由恶意软件发起&#xff0c;旨在识别目标网络中的漏洞。 此外&#xff0c;大多数此类攻击的来源是安全网络中的合法设备。犯罪黑客是如何如此狡猾地欺骗计算机专家的呢&#…

Vue2(十五):replace属性、编程式路由导航、缓存路由组件、路由组件独有钩子、路由守卫、history与hash

一、router-link的replace属性 1、作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式 2、浏览器的历史记录有两种写入方式&#xff1a;分别为push和replace&#xff0c;push是追加历史记录&#xff0c;replace是替换当前记录。路由跳转时候默认为push 3、如何开启repla…

Day20_学点儿JavaEE_Cookie、Session

0 会话技术简介 生活中会话 我&#xff1a; 小张&#xff0c;你会跳小苹果码&#xff1f; 小张&#xff1a; 会&#xff0c;怎么了&#xff1f; 我&#xff1a; 公司年会上要表演节目&#xff0c;你教教我把 小张&#xff1a;没问题&#xff0c;一顿饭而已。 我&#xff1a; …

面向对象设计原则实验之“迪米特法则”

每一个软件单位对其它单位都只有最少的知识&#xff0c;而且局限于那些与本单位密切相关的软件单位。 某软件公司所开发 CRM 系统包含很多业务操作窗口。在这些窗口中某些界面控件之间存在复杂的交互关系&#xff0c;一个控件事件的触发将导致多个其他界面控件产生响应。例如&…

社交网络的分布式治理:分析Facebook在区块链社区中的角色

随着区块链技术的快速发展&#xff0c;社交网络的治理模式也逐渐受到关注。传统的社交网络往往由中心化的平台掌控&#xff0c;用户的权力和参与度受到限制&#xff0c;而区块链技术为社交网络的分布式治理提供了新的解决方案。本文将深入探讨社交网络的分布式治理&#xff0c;…

MySQL-创建和管理表:基础知识、创建和管理数据库、创建表、修改表、重命名表、删除表、清空表、拓展

创建和管理表 1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型 2. 创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库 3. 创建表3.1 创建方式13.2 创建方式23.3 查看数据表结构 4. 修改表4.1 追加一个列4.2 修改一个列4.3…

虚幻引擎启动报错记录

0x00007FFEF0C8917C (UnrealEditor-CoreUObject.dll)处(位于 UnrealEditor.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000030 时发生访问冲突。 解决办法&#xff1a;首先查看堆栈信息&#xff0c;我的项目启动是因为默认场景编译不过&#xff0c;进到编辑器配置文…

【bash】linux使用环境变量拼接字符串错误

有如下脚本init-env.sh #!/bin/bash export HADOOP_HOME/opt/hadoop export HADOOP_CONF$HADOOP_HOME/conf执行结果&#xff1a; source init-env.sh echo $HADOOP_CONF_DIR # 得到结果&#xff1a;conf/hadoop&#xff0c;预期因该是/opt/hadoop/conf原因就是linux下使用了w…

3.1 基本形式 机器学习

从本章本节开始就开始正式介绍机器学习的算法了&#xff01;我们首先登场的是---------线性模型。 w可以理解为权重&#xff0c;我们的x就是我们的样本点的各个特征数值&#xff0c;最后输出模型f&#xff08;x&#xff09;。其代表我们把样本点带入&#xff0c;以二分类为例&a…

头歌-机器学习 第10次实验 逻辑回归

第1关&#xff1a;逻辑回归核心思想 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的编程题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 什么是逻辑回归&#xff1b; sigmoid函数。 什么是逻辑回归 当一看到“回归”这两个字&a…