Vue获取DOM的几种方法总结

目录
  • Vue获取DOM的方法
    • 1、使用DOM API直接找元素
    • 2、refs
    • 3、使用自定义指令
  • vue3.0获取虚拟dom方法

Vue获取DOM的方法

Vue实现了MVVM模型,将数据和表现进行了分离,我们只需要更新数据就能使DOM同步更新,但是某些情况下,还是需要获取DOM元素进行操作

本文主要介绍几种在Vue中获取DOM元素的方法

1、使用DOM API直接找元素

<script>
    ...
    mounted () {
        let elm = this.$el.querySelector('#id')
    }
</script>

Vue组件在patch阶段结束时会把this.$el赋值为挂载的根dom元素,我们可以直接使用$el的querySelector, querySelectorAll等方法获取匹配的元素。

2、refs

<template>
    <div ref="bar">{{ foo }}</div>
    <MyAvatar ref="avatar" />
    ...
</template>
<script>
    ...
    mounted () {
        let foo = this.$refs['bar'] // 一个dom元素
        let avatar = this.$refs['avatar'] // 一个组件实例对象
    }
</script>

使用组件实例的$refs即可拿到组件上ref属性对应的元素。

如果ref属性加在一个组件上,那么拿到的是这个组件的实例,否则拿到的就是dom元素了。

3、使用自定义指令

Vue提供了自定义指令,官方文档给出了如下的使用方法,其中el就是dom元素的引用

Vue.directive('focus', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})
 
// 在模板中
<template>
    <input v-model="name" v-focus />
</template>

vue3.0获取虚拟dom方法

最近使用vue3.0+vue-router4.x+element-plus ui框架联合开发了一个小的商城项目,首先简单说一下element-plus ui框架。

官网上介绍了element-plus ui框架适用于vue3.0开发pc端,使用时发现只是框架部分代码可以拿来直接使用,但是其余的代码还没有更新

下面总结vue3.0遇到的一些问题,老生长谈的就是虚拟dom的获取相对于vue2.x来说很是有点麻烦的,在vue2.x里面,我们只需在标签行内添加ref属性并赋值,那么我们就可以拿到这个dom节点,通过this.$refs.xxx即可拿到dom node

但是在vue3.0框架里面是解除了this这个对象,所以我们不能在使用this.$refs来获取dom,那么我们怎样才能拿到dom节点呢?请看下面的代码(请不要忘记像vue2.x那样在需要获取dom的标签上添加ref属性并赋值)

下面是传统组合式api获取虚拟dom方法:

<template>
    <div>
        <div class="box" ref="goodInfo"></div>
    </div>
</template>
<script>
import { onMounted, ref, reactive,nextTick } from 'vue'
export default{
 
    setup(){
    //获取dom
    let goodInfo=ref(null)
    // 狗子函数mounted
    onMounted(()=>{
      GetGoodDetail()
      console.log(goodInfo,'获取dom节点');
      console.log(goodInfo.value,'获取该dom节点的值');
      console.log(goodInfo.value.offsetHeight,'获取该dom节点的高度');
    })
    return {
      // dom对象
      goodInfo
      }
  }
 
}
</script>

补充一下:我们要通过ref这个vue3.0内置的方法向变量注入一个值,然后在钩子函数onMounted中获取我们想要得到的dom节点上的值,设置简单变量的值用ref,取值要用value来取,也就是上面代码显示的要得到该dom的高度我们要使用goodInfo.value.offsetHeight即可,

注意:不要忘记把获取dom节点变量丢出来o,否则会报错,因为我们传给goodInfo变量的值是null,而null是没有value的,

接下来介绍另外一种方式获取dom,语法糖:<script setup> 获取dom ,请看代码:

<template>
    <div class="container" v-wechat-title="$route.meta.title">
        
    <div class="tree_box">
        <el-tree accordion ref="treeRef" :data="myData.treeData" :props="treeProps" :current-node-key="myData.curId" node-key="id" @node-click="methods.handleNodeClick"
            highlight-current />
    </div>
</div>
</template>
 
<script setup>
 
import { ref,reactive, onMounted,nextTick } from 'vue';
//创建变量treeRef并赋值,同时html模板<el-tree ref="treeRef" />上的ref=treeRef,这样才可以获取到该dom节点。获取dom节点还是要treeRef.value才可以
let treeRef=ref(null)
 
const myData=reactive({
    curId:''
})
//配置el-tree--props
const treeProps = {
    children: 'children',
    label: 'title',
    value:'id',
}
onMounted(() => {
    //默认展开el-tree指定的节点
    nextTick(() => {
       myData.curId=3
       treeRef.value.setCurrentKey(myData.curId)
    })
})
 
</script>

总结一下:vue3.x 语法糖方式获取dom

首先:创建变量treeRef并赋值

let treeRef=ref(null)

其次:html模板<el-tree ref="treeRef" />上的ref=treeRef

最后:获取dom节点还是要treeRef.value才可以

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vue 3.0 使用ref获取dom元素的示例

    前言 附上vue3.0文档:Vue3中文文档 - vuejs Vue 2.x获取DOM <div ref="myRef"></div> this.$refs.myRef Vue 3.0获取单个DOM <template> <div ref="myRef">获取单个DOM元素</div> </template> <script> import { ref, onMounted } fr

  • Vue nextTick延迟回调获取更新后DOM机制详解

    目录 简述 事件循环机制 vue数据驱动视图的处理(异步变化DOM) Vue.nextTick原理 Vue.nextTick的应用 created生命周期中操作DOM 修改数据,获取DOM值 简述 相信大家在写vue项目的时候,一定会发现一个神奇的api,Vue.nextTick.为什么说它神奇呢,那是因为在你做某些操作不生效时,将操作写在Vue.nextTick内,就神奇的生效了.那这是什么原因呢? 让我们一起来研究一下. vue 实现响应式并不是数据发生变化后 DOM 立即变化,而是按照一定

  • 如何在Vue中获取DOM元素的实际宽高

    目录 前言 一.获取元素 二.获取元素宽高 补充:vue项目获取dom元素宽高总是不准确 总结 前言 最近使用 D3.js 开发可视化图表,因为移动端做了 rem 适配,所以需要动态计算获取图表容器的宽高,其中涉及到一些原生DOM API的使用,避免遗忘这里总结一下. 一.获取元素 在 Vue 中可以使用 ref 来获取一个真实的 DOM 元素. 为了保险起见,所有的 DOM 操作建议都放在 $nextTick() 方法中. <template> <div class="box

  • 解决vue项目获取dom元素宽高总是不准确问题

    dom元素内部内容是动态的,重置数据后直接获取宽高总是不准确: this.$refs.editor[0].offsetHeight; 原因:重置数据后获取dom元素宽高时,dom元素还未渲染完毕: 解决方法:利用Vue.nectTick(callback) this.$nextTick(() => { this.$refs.editor[0].offsetHeight; }) Vue.nectTick() 是在下次DOM更新循环结束之后执行延迟回调 补充知识:vue 获取 指定元素的高度宽度等(

  • Vue nextTick获取更新后的DOM的实现

    目录 生命周期 update Vue.nextTick Promise 结语&参考资料 前两天在开发时遇到一个需求:打开对话框的时候自动聚焦其中的输入框.由于原生的 autofocus 属性不起作用,需要使用组件库提供的 focus 方法手动手动获取焦点.于是有如下代码: <el-button @click="openDialog">点击打开 Dialog</el-button> <el-dialog :visible.sync="dia

  • vue3使用自定义hooks获取dom元素的问题说明

    目录 使用自定义hooks获取dom元素问题 分享下楼主自己的观点 vue获取/操作组件的dom元素 下面是我的代码内容(非全部内容) 最后总结 使用自定义hooks获取dom元素问题 在自定义hooks的onMounted事件里面 获取ref元素,组件调用hooks的时候必须要传递响应式对象. 分享下楼主自己的观点 代码如下 <script> // demo.vue import { defineComponent, ref } from 'vue' import useBars from

  • Vue获取DOM元素并修改属性的方法

    Vue获取DOM元素 Vue获取DOM元素有两种方法 直接给相应的元素加id,然后再使用document.getElementById("id");获取 使用ref,给相应的元素加ref=“name”然后再使用this.$refs.name获取到该元素 Vue获取到元素并修改属性或者样式 使用上述的第二种方法,获取到元素,然后使用this.$refs.元素元素的ref对应的name.style.属性名(样式或者其他的属性名) = “你要设置的值”或者元素的ref对应的name.属性名(

  • Vue获取DOM的几种方法总结

    目录 Vue获取DOM的方法 1.使用DOM API直接找元素 2.refs 3.使用自定义指令 vue3.0获取虚拟dom方法 Vue获取DOM的方法 Vue实现了MVVM模型,将数据和表现进行了分离,我们只需要更新数据就能使DOM同步更新,但是某些情况下,还是需要获取DOM元素进行操作 本文主要介绍几种在Vue中获取DOM元素的方法 1.使用DOM API直接找元素 <script>     ...     mounted () {         let elm = this.$el.q

  • vue获取DOM元素并设置属性的两种实现方法

    这里我想到了2个方法: 方法一: 直接给相应的元素加id,然后再document.getElementById("id");获取,然后设置相应属性或样式 方法二: 使用ref,给相应的元素加ref="name" 然后再this.$refs.name获取到该元素 注意:在获取相应元素之前,必须在mount钩子进行挂载,否则获取到的值为空, 如果是给子组件加id并修改自定义属性,则直接会加载改子组件对应的外层div上,并不会改变该子组件原本的自定义属性的值 如果给子组件

  • vue获取dom元素注意事项

    mounted(){ setTimeout(()=>{ this.contentToggle(); },1000) }, methods:{ contentToggle(){ console.log(this.$refs.bodyFont.offsetHeight); } } vue想要获取dom元素的高,一般情况下我们都可以想到写在mounted函数里,即dom加载完再获取,但是结果并不如我们所想,又想到用一个 this.$nextTick(()=>{ //函数 }) 来获取,发现根本没用啊

  • Vue 权限控制的两种方法(路由验证)

    下面介绍两种权限控制的方法: 路由元信息(meta) 动态加载菜单和路由(addRoutes) 路由元信息(meta) 如果一个网站有不同的角色,比如 管理员 和 普通用户 ,要求不同的角色能访问的页面是不一样的 这个时候我们就可以 把所有的页面都放在路由表里 ,只要 在访问的时候判断一下角色权限 .如果有权限就让访问,没有权限的话就拒绝访问,跳转到404页面 vue-router 在构建路由时提供了元信息 meta 配置接口,我们可以在元信息中添加路由对应的权限,然后在路由守卫中检查相关权限,

  • vue封装axios的几种方法

    基础版 第一步:配置axios 首先,创建一个Service.js,这里面存放的时axios的配置以及拦截器等,最后导出一个axios对象.我平常elementUI用的比较多,这里你也可以使用自己的UI库. import axios from 'axios' import { Message, Loading } from 'element-ui' const ConfigBaseURL = 'https://localhost:3000/' //默认路径,这里也可以使用env来判断环境 let

  • Struts2获取参数的三种方法总结

    Struts2获取参数的三种方法总结 前言: Struts2不在建议我们使用原生的servletAPI来获取参数,这样做的目的是事项Struts2的action与servlet进行解耦,可以在日后更加方便的对action类进行测试. Struts2获取参数的三种办法: (1)属性驱动方式 (2)模型驱动方式 (3)对象驱动方式 one by one 属性驱动方式 /* * 参数获取方式之属性驱动方式 */ public class TestAction extends ActionSupport

  • JavaScript实现获取dom中class的方法

    本文实例讲述了JavaScript实现获取dom中class的方法.分享给大家供大家参考.具体实现方法如下: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script> function getClass(node,classname) { if(node.getEle

  • Android编程实现获取图片资源的四种方法

    本文实例讲述了Android编程实现获取图片资源的四种方法.分享给大家供大家参考,具体如下: 1. 图片放在sdcard中: 复制代码 代码如下: Bitmap imageBitmap = BitmapFactory.decodeFile(path)//path 是图片的路径,跟目录是/sdcard 2. 图片在项目的res文件夹下面 //得到application对象 ApplicationInfo appInfo = getApplicationInfo(); //得到该图片的id(name

  • php获取参数的几种方法总结

    php获取参数的几种方法总结 $value = $_POST["value"];//取得post中的 $value=$_REQUEST["value"];//取得get或者post中的参数(哪个有就取得哪个) $value=$_GET["value"];//取得get中的参数

随机推荐