最新版vue3+TypeScript开发入门到实战教程之DOM操作

1、概述

Vue3框架的核心思想是数据驱动视图,应当避免直接操作DOM,但在实际开发中,必定会有特定的场景去直接与DOM元素打交道。如video标签等

2、Vue3中如何获取DOM

在Vue3中,获取DOM的方式有两种。虽然在Vue3中可用Vue2的语法获取DOM,但是不推荐使用Vue2语法。

  • 通过document.getElementById函数获取DOM
  • 通过ref标签属性来获取DOM

1.1通过document.getElementById的弊端

在组件中,通过document.getElementById获取DOM标签是可以,但有一个很大弊端,若父组件中有相同id的标签,优先获取父组件的标签。所以通过document.getElementById获取DOM必须要求项目唯一。

  • 创建组件Fish,并在App组件引入使用Fish组件
  • 在App组件与Fish组件创建id相同的标签
  • 在Fish组件中获取DOM

App组件内容

xml 复制代码
<template>
  <div class="app">
    <h2 id="fish">草鱼</h2>
  <Fish/>

  </div>
</template>
<script setup>
import Fish from './components/Fish.vue';
</script>

Fish组件内容

xml 复制代码
<template>
  <h2 id="fish">鲫鱼</h2>
  <h2 id="cat">狸花猫</h2>
  <button @click="getDOMFish()">获取DOM</button>
  <button @click="getDOMCat()">获取DOM</button>
</template>
<script setup>
function getDOMFish() {
  let fish= document.getElementById('fish');
  console.log(fish);

}
function getDOMCat() {
  let cat= document.getElementById('cat');
  console.log(cat);

}
</script>

运行操作如下图: 大

  • 点击获取鱼的DOM,优先获取的App组件(父组件)的DOM
  • 点击获取猫的DOM,获取是本组件内容

1.2通过ref标签属性来获取DOM

既然document.getElementById有次弊端,可以使用ref规避,只需要给DOM标记ref即可,即是Vue3的使用方法。

  • 将组件中id都改成ref
  • 通过ref函数获取DOM,注意ref不要传参且变量名称必须与标签ref的值相同 App组件内容
xml 复制代码
<template>
  <div class="app">
    <h2 ref="fish">草鱼</h2>
  <Fish/>

  </div>
</template>
<script setup>
import Fish from './components/Fish.vue';
</script>

Fish组件内容

xml 复制代码
<template>
  <h2 ref="fish">鲫鱼</h2>
  <h2 ref="cat">狸花猫</h2>
  <button @click="getDOMFish()">获取鱼的DOM</button>
  <button @click="getDOMCat()">获取猫DOM</button>
</template>
<script setup>
import { ref } from 'vue';
  let fish = ref();
  let cat = ref();
function getDOMFish() {
  console.log(fish.value);
}
function getDOMCat() {
  console.log(cat.value);
}
</script>

运行效果如下图: 当点击按钮,获取的DOM就是想要的了。

给组件标记ref获取到的是什么

给组件标记ref,获取的是组件实例。父组件获取实例后,可以得到Fish展示的数据。 在Vue3中,默认父组件获取子组件实例后,是无法获取到数据的,需要子组件将数据展示出来。

  • App组件引入Fish
  • Fish展示数据a,b,c
  • 获取Fish实例,打印数据 App组件内容
xml 复制代码
<template>
  <div class="app">
  <Fish ref="fish"/>
  <button @click="getDOMFish()">获取鱼的DOM</button>

  </div>
</template>
<script setup>
import { ref } from 'vue'
import Fish from './components/Fish.vue';
let fish = ref();
  function getDOMFish() {
    console.log(fish.value);
    console.log(fish.value.fish);
    console.log(fish.value.a);
    console.log(fish.value.b);
  }
</script>

Fish组件内容

xml 复制代码
<template>
  <h2>{{fish}}</h2>
</template>
<script setup>
import { ref,defineExpose } from 'vue';
  let fish = ref('鲫鱼');
  let a = ref('1');
  let b = ref('2');
  let c = ref('2');
  //将数据展示给父组件
defineExpose({ fish, a, b });
</script>

运行效果下图:

相关推荐
paopaokaka_luck2 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
溪语流沙3 小时前
【每天一个CSS | Day19】流光文字与一笔写成的手写签名
前端·javascript·css
CDwenhuohuo4 小时前
electron pc项目打包成桌面端
前端·javascript·electron
计算机毕设定制辅导-无忧学长6 小时前
《校园食堂在线订餐小程序的设计与实现》
java·vue.js·spring boot·微信小程序·uniapp·校园食堂在线订餐小程序
EatFan6 小时前
React 项目踩坑实录:useEffect 闭包陷阱、Context 性能陷阱与 React 18 升级避坑排查手册
前端·javascript·react.js·react·react hooks·useeffect·闭包陷阱
咖啡无伴侣8 小时前
1. 别再手动改代码格式了!Vue3 项目工程化规范搭建实战
vue.js·架构
w2sfot10 小时前
【JS加密在线】jsjiami.online(让JavaScript 更安全!)
开发语言·javascript·安全
知野小兔10 小时前
Vuex和Pinia状态管理
vue.js
VX_bysjlw98511 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
杨杰39814 小时前
我给嵌入式设备写了个 6MB 的 JavaScript 运行时(xuan)
javascript