【vue】vue 如何获取并操作DOM元素

本文介绍了在Vue中通过两种方式操作DOM的方法:一是直接给元素添加ID并通过document.getElementById获取;二是使用ref属性并通过this.$refs访问。这两种方法分别适用于不同场景,并强调在Vue中应尽量避免直接操作DOM。

方法一: 直接给的元素加id,使用document.getElementById(“id”)获取,然后操作 dom 元素

mounted(){
	this.element = document.querySelector('#element_1');
	this.element.style.color = "red";
}

为什么是在mouted钩子使用?
因为只有在执行mounted的时候,vue才已经渲染了dom节点,这个时候是可以获取dom节点的

方法二: 使用ref,给元素添加ref=“name” ,使用 this.$refs.name 获取到该元素,再对元素进行操作

// 定义ref
<div ref="div_1">获取元素</div>
// 获取并操作
this.$refs.div_1.style.backgroundColor="red"

建议:vue中尽量不去操作 dom 元素,选用 ref 操作属性获取

Vue获取操作DOM有多种方法: 1. **使用DOM API直接找元素**:在Vue的`mounted`钩子函数中,可以使用`this.$el.querySelector`方法来获取DOM元素。例如: ```javascript <script> export default { mounted () { let elm = this.$el.querySelector('#id'); } } </script> ``` 该方法适用于在Vue组件内部通过选择器获取特定的DOM元素 [^1]。 2. **利用`ref`属性**:在Vue中可以为DOM元素添加`ref`属性,然后通过`this.$refs`来访问。示例代码如下: ```html <template> <div> <button ref="btn">按钮</button> <div ref="box"> <h1> ref</h1> <p> 测试</p> </div> <hr> <div ref="myDiv"> <p v-for="item in 10">{{item}}</p> </div> </div> </template> <script> export default { mounted() { const btn = this.$refs.btn; // 可以对btn进行操作 } } </script> ``` 这种方法简单直接,推荐在Vue中优先使用 [^4]。 3. **将元素改成组件使用`this.$el`**:在vue.js里,可以把某个DOM元素改成一个组件,之后通过`this.$el`获取元素。不过在小型项目或者未使用webpack等构建工具的项目中,创建组件可能不太划算 [^3]。 4. **自定义指令(directive)**:Vue提供了自定义指令的方式来操作DOM元素,适用于一些需要对DOM进行特殊操作的场景 [^3]。 5. **在Vue 3中获取操作DOM**: - **获取DOM节点的`width`**:使用`vNode.style.width`只能获取JS给定的`width`,无法获取CSS给定的`width`,这种方式可能获取到空值 [^5]。 - **给DOM节点添加`class`**:使用`vNode.classList.add('newClass')`为某个DOM节点添加类名 [^5]。 - **修改样式**:获取DOM元素节点后,设置`style`属性。例如: ```javascript import { ref, nextTick } from 'vue'; import headerOrangeMask from '@/assets/img/header-blue-mask.png'; export default { setup() { const myMask = ref(null); nextTick(() => { myMask.value.style.backgroundImage = `url(${headerOrangeMask})`; }); return { myMask }; } } ``` - **父组件调用子组件的函数方法**: - 子组件暴露要被父组件调用的方法,使用`defineExpose`。例如: ```javascript import { defineExpose } from 'vue'; export default { setup() { function noticeSwiper() { console.log("子组件中的方法执行了"); } defineExpose({ noticeSwiper }); return {}; } } ``` - 父组件中取得子组件的`dom`调用方法: ```html <template> <Notice ref="noticeNode"></Notice> </template> <script> import { ref } from 'vue'; import Notice from './Notice.vue'; export default { components: { Notice }, setup() { const noticeNode = ref(null); function getNotice() { store.dispatch('notice/getNoticeList').then(() => { noticeNode.value.noticeSwiper(); }); } return { noticeNode, getNotice }; } } </script> ``` [^5]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值