【Vue】深入了解 Vue 的 DOM 操作:从基本渲染到高级操作的全面指南

文章目录

    • 一、Vue 中的基本 DOM 渲染
      • 1. 响应式数据
      • 2. 虚拟 DOM
    • 二、数据绑定与指令
      • 1. `v-bind`
      • 2. `v-model`
      • 3. `v-show` 与 `v-if`
      • 4. `v-for`
    • 三、与 DOM 相关的生命周期钩子
      • 1. `mounted` 钩子
      • 2. `updated` 钩子
    • 四、动态样式与类
      • 1. 动态样式
      • 2. 动态类
    • 五、Vue 3 中的新的 DOM 操作 API
      • 1. `ref` 函数
      • 2. `watchEffect` 函数

在 Vue.js 中,DOM(文档对象模型)操作是开发动态用户界面的核心。Vue 的数据驱动视图机制大大简化了 DOM 操作,使得开发者能够更加专注于业务逻辑而非手动操作 DOM。本文将详细介绍 Vue 中的 DOM 操作,包括基本的 DOM 渲染、数据绑定、条件渲染、列表渲染、和与 DOM 相关的生命周期钩子等。通过全面了解这些概念,你将能够更高效地使用 Vue 构建强大的应用程序。

一、Vue 中的基本 DOM 渲染

在 Vue 中,DOM 的渲染是通过 Vue 实例的数据驱动的。每当 Vue 实例的数据发生变化时,视图会自动更新。这种机制由 Vue 的响应式系统和虚拟 DOM 实现。以下是一个简单的示例:

<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello Vue!'
    }
  }
}
</script>

在这个例子中,message 数据属性被绑定到 <p> 元素的内容。当 message 的值发生变化时,视图会自动更新以反映这一变化。

1. 响应式数据

Vue 的响应式系统通过 Object.defineProperty(在 Vue 3 中是通过 Proxy)来实现数据的双向绑定。每当响应式数据发生变化时,相关的 DOM 元素会被自动更新。

2. 虚拟 DOM

Vue 使用虚拟 DOM 作为实际 DOM 的轻量级副本。虚拟 DOM 是一个 JavaScript 对象,它表示了 DOM 结构。当数据发生变化时,Vue 会生成新的虚拟 DOM 并与旧的虚拟 DOM 进行比较(称为“diff 算法”),然后只更新实际 DOM 中发生变化的部分。这种方法大大提高了性能。

二、数据绑定与指令

Vue 提供了多种指令来操作 DOM,这些指令以 v- 开头。常用的指令包括 v-bindv-modelv-showv-ifv-for 等。

1. v-bind

v-bind 指令用于绑定元素的属性到 Vue 实例的数据。例如:

<template>
  <img v-bind:src="imageSrc" alt="Vue.js">
</template>

<script>
export default {
  data() {
    return {
      imageSrc: 'https://vuejs.org/images/logo.png'
    }
  }
}
</script>

在这个示例中,v-bind:src<img> 标签的 src 属性绑定到 imageSrc 数据属性。这样,图片的源地址会随着 imageSrc 的变化而自动更新。

2. v-model

v-model 指令用于在表单控件和 Vue 实例的数据之间创建双向绑定。例如:

<template>
  <input v-model="inputValue" placeholder="Type something...">
</template>

<script>
export default {
  data() {
    return {
      inputValue: ''
    }
  }
}
</script>

在这个例子中,v-model 用于双向绑定 <input> 元素的值和 inputValue 数据属性。用户输入的内容会被实时更新到 inputValue 中。

3. v-showv-if

v-showv-if 都用于条件渲染,但有一些不同之处。

  • v-show:通过设置 CSS 的 display 属性来控制元素的显示与隐藏。即使元素被隐藏,它仍然存在于 DOM 中。例如:

    <template>
      <p v-show="isVisible">This is visible</p>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isVisible: true
        }
      }
    }
    </script>
    
  • v-if:条件渲染的效果更为彻底。元素会根据条件动态地添加或移除。例如:

    <template>
      <p v-if="isVisible">This is visible</p>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isVisible: true
        }
      }
    }
    </script>
    

    isVisiblefalse 时,<p> 元素会被从 DOM 中完全移除。

4. v-for

v-for 指令用于列表渲染。可以用来循环渲染数组或对象。例如:

<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.text }}</li>
  </ul>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' },
        { id: 3, text: 'Item 3' }
      ]
    }
  }
}
</script>

在这个例子中,v-for 用于循环渲染 items 数组中的每一项,并通过 :key 属性设置唯一标识,以帮助 Vue 高效地进行 DOM 更新。

三、与 DOM 相关的生命周期钩子

Vue 提供了多个生命周期钩子函数,可以在组件的不同阶段执行与 DOM 操作相关的逻辑。这些钩子函数帮助我们在适当的时间点执行 DOM 操作或插件初始化。

1. mounted 钩子

mounted 钩子在 Vue 实例挂载到 DOM 上之后调用,此时可以安全地访问 DOM 元素。例如:

<script>
export default {
  mounted() {
    console.log('组件已挂载到 DOM 上');
    this.$refs.myElement.focus();
  }
}
</script>

在这个例子中,我们在 mounted 钩子中使用 $refs 访问 DOM 元素,并调用其 focus 方法。

2. updated 钩子

updated 钩子在数据更新并导致 DOM 重新渲染后调用。这时可以执行与 DOM 更新相关的操作,例如:

<script>
export default {
  updated() {
    console.log('组件已更新');
    // 在 DOM 更新后执行的操作
  }
}
</script>

需要注意的是,updated 钩子可能会多次调用,因此要谨慎处理可能引发无限循环的操作。

四、动态样式与类

Vue 允许动态绑定元素的样式和类。这些功能通过 v-bind:stylev-bind:class 实现。

1. 动态样式

可以使用对象或数组语法来绑定动态样式。例如:

<template>
  <div :style="{ color: textColor, fontSize: fontSize + 'px' }">Styled Text</div>
</template>

<script>
export default {
  data() {
    return {
      textColor: 'red',
      fontSize: 16
    }
  }
}
</script>

在这个例子中,textColorfontSize 被动态绑定到 <div> 元素的 style 属性中。

2. 动态类

同样,可以使用对象或数组语法来绑定动态类。例如:

<template>
  <div :class="{ active: isActive, 'text-large': isLarge }">Styled Text</div>
</template>

<script>
export default {
  data() {
    return {
      isActive: true,
      isLarge: false
    }
  }
}
</script>

在这个例子中,activetext-large 类会根据 isActiveisLarge 的布尔值动态添加到 <div> 元素上。

五、Vue 3 中的新的 DOM 操作 API

在 Vue 3 中,Composition API 提供了新的方式来处理与 DOM 相关的操作。你可以使用 refwatchEffect 等 API 来更灵活地处理 DOM 和数据变化。

1. ref 函数

ref 函数用于创建一个响应式引用,可以用来访问和操作 DOM 元素。例如:

<template>
  <input ref="myInput">
</template>

<script>
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const myInput = ref(null);

    onMounted(() => {
      myInput.value.focus();
    });

    return {
      myInput
    }
  }
}
</script>

在这个例子中,ref 用于创建一个对 DOM 元素的引用,并在组件挂载后调用 focus 方法。

2. watchEffect 函数

watchEffect 函数可以用于监视响应式数据的变化并执行副作用操作。例如:

<script>
import { ref, watchEffect } from 'vue';

export default {
  setup() {
    const count = ref(0);

    watchEffect(() => {
      console.log(`Count is: ${count.value}`);
    });

    return {
      count
    }
  }
}
</script>

在这个例子中,watchEffect 监视 count 的变化,并在 count 更新时输出日志。


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

某4G区域终端有时驻留弱信号小区分析

这些区域其实是长时间处于连接态的电信卡4G终端更容易出现。 出现问题时都是band1 100频点下发了针对弱信号的1650频点的连接态A4测量事件配置&#xff08;其阈值为-106&#xff09;。而这个条件很容易满足&#xff0c;一旦下发就会切到band3 1650频点。 而1650频点虽然下发ban…

文献解读-液体活检-第二十期|《连续循环肿瘤DNA检测可预测肝癌患者早期复发:一项前瞻性研究》

关键词&#xff1a;液体活检&#xff1b;基因测序&#xff1b;变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Serial circulating tumor DNA to predict early recurrence in patients with hepatocellular carcinoma: a prospective study标题…

uniapp判断h5/微信小程序/app端+实战展示

文章目录 导文使用条件编译的基本语法常见的平台标识符示例实战展示使用场景举例注意事项 导文 这里是导文 当你在开发Uni-app时&#xff0c;需要根据不同的平台&#xff08;比如App端、H5端、微信小程序等&#xff09;来执行不同的代码逻辑&#xff0c;可以使用条件编译来实现…

[PM]数据分析

概览 数据的定义 运营数据 分析的目的 数据分析流程 1.明确目标 2.数据来源 3.采集数据 4.数据整理 5.数据分析 趋势分析 当数据出现异常&#xff0c;一般从3个角度去查找问题&#xff1a; 1.技术层面&#xff0c;是不统计出错&#xff0c;或者产品出现bug 工 2.产品层面&am…

SCI一区级 | Matlab实现SSA-CNN-GRU-Multihead-Attention多变量时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现SSA-CNN-GRU-Multihead-Attention麻雀算法优化卷积门控循环单元融合多头注意力机制多变量时间序列预测&#xff0c;要求Matlab2023版以上&#xff1b; 2.输入多个特征&#xff0c;输出单个…

Navicat 17 for Mac 数据库管理软件

Mac分享吧 文章目录 效果一、准备工作二、开始安装1. 双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕。2. 应用程序/启动台显示Navicat图标&#xff0c;表示安装成功。 二、运行测试运行后提示&#xff1a;“Navicat Premium.pp”已损坏&#x…

实战打靶集锦-31-monitoring

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 ssh服务4.2 smtp服务4.3 http/https服务 5. 系统提权5.1 枚举系统信息5.2 枚举passwd文件5.3 枚举定时任务5.4 linpeas提权 6. 获取flag 靶机地址&#xff1a;https://download.vulnhub.com/monitoring/Monitoring.o…

网络安全常用易混术语定义与解读(Top 20)

没有网络安全就没有国家安全&#xff0c;网络安全已成为每个人都重视的话题。随着技术的飞速发展&#xff0c;各种网络攻击手段层出不穷&#xff0c;保护个人和企业的信息安全显得尤为重要。然而&#xff0c;在这个复杂的领域中&#xff0c;许多专业术语往往让人感到困惑。为了…

嵌入式人工智能(10-基于树莓派4B的DS1302实时时钟RTC)

1、实时时钟&#xff08;Real Time Clock&#xff09; RTC&#xff0c;全称为实时时钟&#xff08;Real Time Clock&#xff09;&#xff0c;是一种能够提供实时时间信息的电子设备。RTC通常包括一个计时器和一个能够记录日期和时间的电池。它可以独立于主控芯片工作&#xff…

飞睿智能毫米波雷达静止目标识别,酒店智能灯控人体感应传感器,呼吸探测感应器

在这个日新月异的智能时代&#xff0c;科技的每一次跃进都在悄然改变着我们的生活。今天&#xff0c;让我们一同探索一项前沿技术——飞睿智能毫米波雷达在酒店智能灯控领域的创新应用&#xff0c;它如何以“呼吸探测”这一微妙而精准的方式&#xff0c;重新定义酒店住宿的舒适…

给定一整数数组,其中有p种数出现了奇数次,其他数都出现了偶数次,怎么找到这p个数?

给定一长度为m的整数数组 &#xff0c;其中有p种不为0的数出现了奇数次&#xff0c;其他数都出现了偶数次&#xff0c;找到这p个数。 要求&#xff1a;时间复杂度不大于O(n)&#xff0c;空间复杂度不大于O(1)。 由于时间复杂度不大于O(n)&#xff0c;则不能在遍历数组中嵌套遍…

level 6 day2-3 网络基础2---TCP编程

1.socket&#xff08;三种套接字&#xff1a;认真看&#xff09; 套接字就是在这个应用空间和内核空间的一个接口&#xff0c;如下图 原始套接字可以从应用层直接访问到网络层&#xff0c;跳过了传输层&#xff0c;比如在ubtan里面直接ping 一个ip地址,他没有经过TCP或者UDP的数…

vscode 文件颜色变绿色

解决&#xff1a;关闭git功能 在设置中搜索Git:Enabled&#xff0c;取消Decorations: Enabled的勾选

Flutter中GetX的用法(超详细使用指南之路由依赖管理篇)

目录 1.前言 2.GetX 依赖管理概述 1.GetX 依赖管理的基本概念 2.与其他依赖管理工具的比较 3. 基础依赖注入 1.Get.put 2.Get.lazyPut 3.Get.putAsync 4.高级依赖注入 1.使用Get.create 2.依赖生命周期管理 5. 参考资料 1.前言 今天这篇博客主要介绍Getx的三大功能…

视频翻译保留原音色pyvideotrans+clone-voice

剪映的视频翻译时长限制5分钟以内&#xff0c;需要积分2700首次有减免大概21.6元&#xff08;1秒9积分/1元100积分&#xff09; • 视频翻译配音工具pyvideotrans 将视频从一种语言翻译为另一种语言&#xff0c;并添加配音 打包链接&#xff1a;夸克网盘分享 升级补丁&#…

lse:一款专为渗透测试和CTF设计的Linux枚举工具

关于linux-smart-enumeration linux-smart-enumeration是一款专为渗透测试和CTF设计的Linux枚举工具&#xff0c;该工具可以帮助广大研究人员收集与本地Linux系统安全相关的信息。 工具特性 该工具从2.0版本开始符合POSIX标准&#xff0c;并且经过了shellcheck和posh测试。它…

太速科技-基于XCVU9P+ C6678的8T8R的无线MIMO平台

基于XCVU9P C6678的8T8R的无线MIMO平台 一、板卡概述 板卡基于TI TMS320C6678 DSP和XCVU9P高性能FPGA&#xff0c;FPGA接入4片AD9361 无线射频&#xff0c;构建8输入8输出的无线MIMO平台&#xff0c;丰富的FPGA资源和8核DSP为算法验证和信号处理提供强大能力。 二…

解决显存不足问题:深度学习中的 Batch Size 调整【模型训练】

解决显存不足问题&#xff1a;深度学习中的 Batch Size 调整 在深度学习训练中&#xff0c;显存不足是一个常见的问题&#xff0c;特别是在笔记本等显存有限的设备上。本文将解释什么是 Batch Size&#xff0c;为什么调整 Batch Size 可以缓解显存不足的问题&#xff0c;以及调…

【开发踩坑】 MySQL不支持特殊字符(表情)插入问题

背景 线上功能报错&#xff1a; Cause:java.sql.SQLException:Incorrect string value:xFO\x9F\x9FxBO for column commentat row 1 uncategorized SQLException; SQL state [HY000]:error code [1366]排查 初步觉得是编码问题&#xff08;utf8 — utf8mb4&#xff09; 参考上…

昇思25天学习打卡营第17天|LLM-基于MindSpore的GPT2文本摘要

打卡 目录 打卡 环境准备 准备阶段 数据加载与预处理 BertTokenizer 部分输出 模型构建 gpt2模型结构输出 训练流程 部分输出 部分输出2&#xff08;减少训练数据&#xff09; 推理流程 环境准备 pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspo…