如何在vue中获取dom元素
- 在组件dom的部分,任意元素写上ref=”thisDom”
- 通过组件对象this.$refs.thisDom 获取到元素
下面来看例子:
(如果对vue周期不是十分清楚,可以点击查看这篇文章)
var App = {
template: `
<div>
<button ref="btn">我是按钮</button>
</div>`,
data: function () {
},
beforeCreated: function () {
// 这里不能操作数据,只是初始化了事件
console.log(this.$refs.btn) // 这里不会有任何输出
},
created: function () {
// 这里可以操作数据了
console.log(this.$refs.btn) // undefined 虽可以操作数据,但无法操作未进入dom结构的数据
},
beforeMount: function () {
// new Vue装载前 即将替换<div id="app"></div>
console.log(this.$refs.btn) // undefined 虽可以操作数据,但无法操作未替换dom结构的数据
},
mounted: function () {
// 装载new Vue之后
// 只有在这里才能进行dom操作
// 着这里我们通过this.$refs.btn获取到了这个dom元素
console.log(this.$refs.btn) // <button>我是按钮</button>
console.log(this) // this指向VueComponent{...}
})
},
}
new Vue({
el: "#app",
components: {
app: App
},
template: "<app/>",
})
总结:只有在new Vue装载之后,才能进行dom操作。如需进行dom操作,首先要在html元素中设置属性”ref=’el’” , 在vue内部通过”this.$refs.el“来获取dom元素
然而这里还有一个十分隐蔽的知识点,一般人我不告诉他…
请看下面代码:
var App = {
template: `
<div>
<input type="text" v-if="isShow" ref="input" />
</div>`,
data: function () {
return {
isShow: false
}
},
// 省略部分无关代码...
mounted: function () {
// 装载new Vue之后
// 只有在这里才能进行dom操作
console.log(this) // VueComponent{...}
this.isShow = true;
this.$refs.input.focus() // 如果直接使用这句 则会报错
},
}
在上面的代码里面,可以看到input的默认情况是删除的(isShow: false),当new Vue装载完毕,我们把元素插入,没有问题!可是下一步获取输入框的焦点时,惊奇的事情发生了——“this.$refs.input.focus()”居然报错了!
Error in mounted hook: “TypeError: Cannot read property ‘focus’ of undefined”
要解决这个问题,其实很简单,这里就是关于实战开发的技巧了
将上面的
this.$refs.input.focus()
改成下面的代码段即可
// 我们希望vue真正渲染dom到页面以后,才获取输入框的焦点
this.$nextTick(function () {
this.$refs.input.focus()
})