Vue获取DOM的几种方法
虽然Vue实现了MVVM模型,将数据和表现进行了分离,我们只需要更新数据就能使DOM同步更新,但是某些情况下,还是需要获取DOM元素进行操作(比如引入的某个库要求传入一个根dom元素作为根节点,或者写一些自定义指令),本文主要介绍几种在Vue中获取DOM元素的方法。
使用DOM API直接找元素
<script>
...
mounted () {
let elm = this.$el.querySelector('#id')
}
</script>
这种方法足够简单直观,Vue组件在patch阶段结束时会把this.$el
赋值为挂载的根dom元素,我们可以直接使用$el
的querySelector, 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的几种方法的更多相关文章
- vue获取dom元素高度的方法
获取高度: <div ref="自定义名称" > </div>要在钩子mounted里面dom结构生成后去获取dom的高度,宽度,修改样式等操作!!! mo ...
- javascript获取DOM对象三种方法
1. getElementByID() getElementByID()方法可返回对拥有指定ID的第一个对象的引用 2. getElementByTagName() getElementByTagNa ...
- Vue获取dom和数据监听
Vue获取dom对象 在js和jq中我们都能获取dom对象例如 // 获取id=1的div标签 <div id=d1>dom对象</div> // js语法 let ele = ...
- PHP中获取星期的几种方法
PHP中获取星期的几种方法 PHP星期几获取代码: 1 date(l); 2 //data就可以获取英文的星期比如Sunday 3 date(w); 4 //这个可以获取数字星期比如123,注意0 ...
- VC++获取IDC_EDIT的7种方法
VC++获取IDC_EDIT的7种方法 http://blog.csdn.net/baizengfei/article/details/7997618 //第一种方法 int number1, num ...
- C#获取当前路径的7种方法
总结C#获取当前路径的7种方法 C#获取当前路径的方法如下: 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName ...
- Java获取随机数的几种方法
Java获取随机数的几种方法 .使用org.apache.commons.lang.RandomStringUtils.randomAlphanumeric()取数字字母随机10位; //取得一个3位 ...
- spring 获取 WebApplicationContext的几种方法
spring 获取 WebApplicationContext的几种方法 使用ContextLoader WebApplicationContext webApplicationContext = C ...
- Struts2 后台获取路径的几种方法
Struts2 后台获取路径的几种方法 package actions.app; import java.io.File; import org.apache.struts2.ServletActio ...
- VC获取cookies的几种方法
方法一: CInternetSession::GetCookie This member function implements the behavior of the Win32 function ...
随机推荐
- FPGA 原理、结构、开发流程简述
简介本文主要介绍了博主在阅读天野英晴主编的<FPGA 原理和结构>一书时的读书笔记,方便更好的了解和入门 FPGA.本博客图片均来自于参考文献 [1]. FPGA 特性和粒度FPGA 是一 ...
- 高效XML绑定框架JIBX
高效XML绑定框架JIBX demo源码地址 https://gitee.com/clover-clover/clover.git 具体路径: clover/clover-frame/clover-f ...
- JS脱敏姓名、身份证、电话、邮箱
一.姓名脱敏 handleName(name) { let arr = Array.from(name) let result = '' if (arr.length === 2) { result ...
- PyCharm的安装使用
一.安装 1.进入官网点击下载 2.打开文件夹 3.点击next 4.选择安装路径 5.勾选创建桌面图标选项,点击next 6.点击安装 二.使用 1.import pycharm setting是指 ...
- 关于import-route static 和default-route-advertise区别知识总结
关于import-route static 和default-route-advertise区别知识总结 一.相关解释 import-route static 命令不能引入外部路由的默认路由,OSP ...
- python 金融大数据风控建模实战--基于机器学习
王青天 孔越编著, 2020年6月第一版 第一章介绍,介绍金融科技fintech是指使用技术提供财务解决方案.人工智能和机器学习技术可以帮助包括欺诈预防.风险管理.客户服务和营销等多个环节的智能化.个 ...
- vs输出重定向
1.右键点击解决工程->项目属性 2.配置属性->生成事件->生成后事件 在命令行中输入:"$(TargetPath) >$(outdir)\1.txt" ...
- 综合java admin后台记录
在新冠将来未来的气氛下,做一些年终封箱吧,这个事没做完,但暂时可能也没时间做,待来年了 https://hooray.gitee.io/fantastic-admin/ https://github. ...
- AIIE21th003: 2021年第二届国际工业工程和人工智能大会(IEAI 2021)
会议亮点: 1.IEAI2021由ACM新加坡分会赞助举办,它是MSIE 2021的分会. 2.被接收的文章会被发表在ACM国际论文集上,并被EI Compendex, Scopus, Thomson ...
- linux创建数据库以及数据库用户密码
登录linux服务器成功后: 登录mysql: mysql -uroot -p 输入密码:xxxx 创建数据库: create database test 创建用户及密码: create user ' ...