Vue的JS部分如何获取DOM元素

本文详细介绍了在Vue中如何正确使用$refs属性来获取DOM元素,包括在mounted()钩子函数中使用,以及如何在组件内容修改后获取更新后的DOM元素。通过实例展示了在特定场景下,如mounted中,如何利用this.$nextTick()确保获取到最新状态的DOM。
  1. 给html中原始标签对或子组件中定义ref属性,在mounted(){}方法或者此方法后使用this.$refs.具体的ref值来获取DOM元素。因为使用mounted以前的钩子函数时,还未将组件挂载到DOM上,自然也无法通过$refs获取DOM上的元素;
  2. 需要区分的是,打印this.$refs.具体的ref值, 若是原始标签对则输出的结果是原始标签对,若ref属性在子组件标签中,则输出的是组件对象,而不是组件对应template中的内容;
  3. this.$refs 输出的是当前组件中包含的定义了ref属性的标签或子组件的集合;
  4. 在组件渲染过程中,如mounted期间对组件的内容进行了修改后继续用this.$refs.被修改组件对应的ref,这个时候获取的是修改之前的DOM元素,为了获取修改之后的DOM元素,必须使用this.$nextTick()方法,并在该方法的回调函数中使用this.$refs,此时便是获取到修改之后的DOM元素。当然要获取修改之后的DOM元素可以在updated函数下,但是在某些具体的场景下需要在mounted中获取修改后的DOM元素;

<!DOCTYPE html>
<html>
	<head>
		<meta charset='utf-8'>
		<title>Vue组件中获取DOM元素的方式之$refs的使用</title>
	</head>

	<body>
		<div id='app'></div>
		<script type='text/javascript' src='node_modules/vue/dist/vue.js'></script>
		<script type='text/javascript'>
			Vue.component('Btn',{
				template:`
					<button>我是按钮</button>
				`
			})

			let App = {
				data:function() {
					return {
						isShow:false
					}
				},
				template:`
					<div>
						<input type='text' ref='input1'/>
						<input type='text' ref='input2' v-show='isShow'/>
						<Btn ref='btn1'/>
					</div>
				`,
				//对应输出结果为下面第一张图
				// mounted:function() {
				// 	console.log(this.$refs)
				// 	console.log(this.$refs.input1)
				// 	console.log(this.$refs.input2)
				// 	console.log(this.$refs.btn1)
				// }
			 	mounted:function() {

					// 修改ref=input2的v-show值,让其显示, 接着获取该DOM并让其获得焦点,但是没法获得焦点,这是因为mounted内无法获得更新DOM后的DOM元素,这个时候需要调用this.$nextTick方法,在其回掉函数中重新执行代码this.$refs.input2.focus()
					this.isShow = true
					// this.$refs.input2.focus()
					this.$nextTick(function() {
						this.$refs.input2.focus()
					})
				},
			}

			let  vm = new Vue({
				el:'#app',
				data:function() {
					return {

					}
				},
				components:{
					App
				},
				template:`
					<App/>
				`

			})
		</script>
	</body>
</html>

对应已注释mounted中的内容
在这里插入图片描述
mounted中对this.$nextTick的使用使得mounted中可以获得已更新的DOM元素。在本代码中让已更新的DOM元素获得焦点
在这里插入图片描述

### Vue3 中获取 DOM 元素宽高的方法 在 Vue3 组件中,可以通过 `ref` 和组合式 API 的方式来获取 DOM 元素的宽高。以下是具体实现: #### 使用 `ref` 和 `$nextTick` Vue3 提供了新的组合式 API,其中 `ref` 可用于绑定 DOM 节点。为了确保 DOM 已经渲染完成后再执行操作,推荐使用 `onMounted` 配合 `nextTick`。 ```javascript <template> <div class="box" ref="wrap"></div> </template> <script> import { ref, onMounted, nextTick } from 'vue'; export default { setup() { const wrap = ref(null); onMounted(() => { nextTick(() => { if (wrap.value) { const width = wrap.value.offsetWidth; // 宽度 const height = wrap.value.offsetHeight; // 高度 console.log(`宽度: ${width}, 高度: ${height}`); } }); }); return { wrap }; }, }; </script> <style scoped> .box { width: 100%; height: 200px; background-color: pink; } </style> ``` 通过这种方式可以安全地访问 DOM 元素的宽高[^1]。 #### 使用 `getComputedStyle` 除了直接读取 `offsetWidth` 和 `offsetHeight` 外,还可以借助 `window.getComputedStyle` 方法获取更详细的样式信息。需要注意的是,该方法返回的结果带有单位(如 `'100px'`),因此可能需要进一步处理。 ```javascript const style = window.getComputedStyle(wrap.value); if (style) { const width = parseInt(style.width); // 去掉单位后的数值 const height = parseInt(style.height); // 去掉单位后的数值 console.log(`宽度: ${width}, 高度: ${height}`); } ``` 此方法适用于需要精确控制样式的场景[^2]。 #### 利用计算属性动态更新尺寸 如果希望实时监控某个 DOM 元素的变化情况,则可以在 Vue3 的响应式机制下定义一个计算属性或者监听器来进行动态调整。 ```javascript computed: { elementSize() { const element = this.$refs.wrap; if (!element) return null; return { width: element.clientWidth, height: element.clientHeight, }; }, }, watch: { elementSize(newVal) { console.log('DOM 尺寸发生变化:', newVal); }, }, ``` 不过这种方法更适合于传统选项式 API,在组合式 API 下通常会采用自定义 Hook 或者 Refs 结合的方式替代它[^3]。 综上所述,以上三种途径均能有效解决 vue3 获取 dom 元素宽高的需求,并且各有优劣之处取决于实际应用场景的选择。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值