虽然Vue实现了MVVM模型,将数据和表现进行了分离,我们只需要更新数据就能使DOM同步更新,但是某些情况下,还是需要获取DOM元素进行操作(比如引入的某个库要求传入一个根dom元素作为根节点,或者写一些自定义指令),本文主要介绍几种在Vue中获取DOM元素的方法。

使用DOM API直接找元素

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

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

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元素了。

值得注意的是包含v-for循环模板指令的情况,其循环元素和子元素上ref属性对应的都是一个数组(就算动态生成ref,也是数组):

<template>
<div v-for="item in qlist" :key="item.id" ref="qitem">
<h3>{{ item.title }}</h3>
<p ref="pinitem">{{ item.desc }}</p>
<p :ref="'contact'+item.id">{{ item.contact }}</p>
</div>
...
</template>
<script>
...
data () {
return {
qlist: [
{ id: 10032, title: 'abc', desc: 'aadfdcc', contact: 123 },
{ id: 11031, title: 'def', desc: '--*--', contact: 856 },
{ id: 20332, title: 'ghi', desc: '?/>,<{]', contact: 900 }
]
}
},
mounted () {
let foo = this.$refs['qitem'] // 一个包含dom元素的数组
let ps = this.$refs['pinitem'] // p元素是v-for的子元素,同样是一个数组
let contact1 = this.$refs['contact' + this.qlist[0].id] // 还是个数组
}
</script>

关于这个的原因,可以从Vue关于ref处理的部分代码得到:

function registerRef (vnode, isRemoval) {
var key = vnode.data.ref;
if (!isDef(key)) { return } var vm = vnode.context;
// vnode如果有componentInstance表明是一个组件vnode,它的componentInstance属性是其真实的根元素vm
// vnode如果没有componentInstance则不是组件vnode,是实际元素vnode,直接取其根元素
var ref = vnode.componentInstance || vnode.elm;
var refs = vm.$refs;
if (isRemoval) {
...
} else {
// refInFor是模板编译阶段生成的,它是一个布尔值,为true表明此vnode在v-for中
if (vnode.data.refInFor) {
if (!Array.isArray(refs[key])) {
refs[key] = [ref]; // 就算元素唯一,也会被处理成数组
} else if (refs[key].indexOf(ref) < 0) {
// $flow-disable-line
refs[key].push(ref);
}
} else {
refs[key] = ref;
}
}
}

使用自定义指令

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

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

关于自定义指令,在一些组件库和事件上报等场景下非常有用,以后再专门写一篇文章讨论一下吧。

Vue获取DOM的几种方法的更多相关文章

  1. vue获取dom元素高度的方法

    获取高度: <div ref="自定义名称" > </div>要在钩子mounted里面dom结构生成后去获取dom的高度,宽度,修改样式等操作!!! mo ...

  2. javascript获取DOM对象三种方法

    1. getElementByID() getElementByID()方法可返回对拥有指定ID的第一个对象的引用 2. getElementByTagName() getElementByTagNa ...

  3. Vue获取dom和数据监听

    Vue获取dom对象 在js和jq中我们都能获取dom对象例如 // 获取id=1的div标签 <div id=d1>dom对象</div> // js语法 let ele = ...

  4. PHP中获取星期的几种方法

    PHP中获取星期的几种方法   PHP星期几获取代码: 1 date(l); 2 //data就可以获取英文的星期比如Sunday 3 date(w); 4 //这个可以获取数字星期比如123,注意0 ...

  5. VC++获取IDC_EDIT的7种方法

    VC++获取IDC_EDIT的7种方法 http://blog.csdn.net/baizengfei/article/details/7997618 //第一种方法 int number1, num ...

  6. C#获取当前路径的7种方法

    总结C#获取当前路径的7种方法 C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName ...

  7. Java获取随机数的几种方法

    Java获取随机数的几种方法 .使用org.apache.commons.lang.RandomStringUtils.randomAlphanumeric()取数字字母随机10位; //取得一个3位 ...

  8. spring 获取 WebApplicationContext的几种方法

    spring 获取 WebApplicationContext的几种方法 使用ContextLoader WebApplicationContext webApplicationContext = C ...

  9. Struts2 后台获取路径的几种方法

    Struts2 后台获取路径的几种方法 package actions.app; import java.io.File; import org.apache.struts2.ServletActio ...

  10. VC获取cookies的几种方法

    方法一: CInternetSession::GetCookie This member function implements the behavior of the Win32 function  ...

随机推荐

  1. TDengine上手笔记

    TDengine简介 TDengine 是一款开源.高性能.云原生的时序数据库,且针对物联网.车联网.工业互联网.金融.IT 运维等场景进行了优化.您可以像使用关系型数据库 MySQL 一样来使用它. ...

  2. 运行Django项目报错

    运行 pip install -r requirements.txt -i https://pypi.douban.com/simple

  3. File.createTempFile()

    File.createTempFile()的两个参数,是前缀和后缀,临时文件的文件名,会在前缀和后缀中各截取一部分,再拼接上随机数进行生成: 推荐手动指定目录,尽量指定到项目路径下,默认的磁盘位置,有 ...

  4. js 浮点数加、减、乘、除。

    1.浮点数加法运算 function numAdd(arg1, arg2) { var r1, r2, m; try { r1 = arg1.toString().split("." ...

  5. mi

    小米耳机页面 <style> * { margin: 0; padding: 0; } body { width: 1226px; background-color: #f5f5f5; m ...

  6. matlab求解器的选择

    可以选择的变步长求解器有:ode45,ode23,ode113,odel5s,ode23s和discret.缺省情况下,具有状态的系统用的是ode45:没有状态的系统用的是discrete. 1)od ...

  7. node_modules/canvas npm ERR! command failed

    Installing packages. This might take a couple of minutes.Installing react, react-dom, and react-scri ...

  8. 像MIUI一样做Zabbix二次开发(1)——MIUI之于Android,乐维监控之于Zabbix

    摘要 文章主要介绍:7年做Zabbix二次开发,讲述那些从技术方向的选择,到开发.架构设计.深度定制,到我们的更多前瞻性想法. 关于MIUI "专注.极致.口碑.快"成了雷布斯的口 ...

  9. rust字节数组转换为string

    一.String::from_utf8 fn main() { let bytes = vec![0x41, 0x42, 0x43]; let s = String::from_utf8(bytes) ...

  10. 使用 DataType 特性应用于 Date 和 Price 属性

    [Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { g ...