在created钩子函数中对DOM进行操作

文章讲述了在Vue开发中,理解created和mounted生命周期钩子的重要性,特别是在需要操作DOM时。ref用于注册DOM元素或子组件的引用,而在created阶段由于DOM未渲染,不适合进行DOM操作,应在mounted阶段进行。同时提到了$nextTick在数据更新后延迟操作DOM的用途,解决了一开始在created阶段尝试操作DOM导致的问题。

今天突然想去了解一下 ref 概念,歪打正着的想明白了之前遇到的问题,使用element-ui中的 tree 组件,在初始化回显勾选为什么不成功的问题。
不知道有没有人和我一样,在vue初始化渲染需要进行一些操作时,特别喜欢在 created 中去操作,这就造成了一些可以避免的错误和不必要的代码。初始化中操作dom,我们首先要了解在 created这个阶段和在mounted阶段进行初始化有什么区别:

created,这个阶段模板已经创建完成,可以请求data和method,但是dom树没有渲染成,因此无法进行dom操作;
mounted,这个阶段模板已经渲染完成,可以进行一些dom操作,所以通常需要进行一些dom操作时,就在这个阶段进行请求。

在了解这个区别之后,我们需要ref是什么?

ref是被用来给元素或子组件注册引用信息的。如果是普通的DOM元素上,引用的信息指向就是DOM元素;如果是子元素,引用信息将会注册在父组件的$refs的对象上,引用就指向组件实例。(下面代码是普通DOM元素)
<template>
	<div>
	//记录一下我碰到过的特殊写法的ref
	<el-table
     :ref="'multipleTable' + id"
     :data="data"
     @select="allCheck()"
     >
     </el-table> 
     //一般情况的写法
     <div ref="boxDom" @click="getDom"></div>     
	</div>
</template>

data () {
    return {
      id: 1 ,
      data: [
      {
       id: 1,
       value: '张三'
      }
      ]
    }
  },
methods: {
   allCheck() {
        console.log(this.$refs[`multipleTable${id}`][0])
    },
     getDom(){
     //一般的
     console.log(this.$refs.boxDom)
    }
  }

前面两个概念都知道了之后,我们还需要再了解一个$nextTick的作用。

简单点来理解就是修改数据后想立刻获取这个dom的数据,如果是调用$nextTick回调函数的话,获取到的数据会是更新后的数据;如果不是,那获取到的就会是旧数据。mounted中发送请求就是放在nexttick中。

在这一系列的了解下就知道我犯了什么错,我在created阶段就想操作dom树,所以勾选就一直不成功,加了一个$nextTick回调函数后,才成功。这种方法虽然可行,但如果在初始化就需要操作Dom,还是放在mounted中更好,更保险。如果又遇到类似操作dom不出来的情况,不妨看看是不是放错地方了,或者把操作dom的代码放入nextTick函数中。下面是将dom操作放入created的代码:

 <el-tree
          ref="rightsTree"
          :data="option"
          :props="{
            label: 'name',
            value: 'id',
            children: 'child',
          }"
          show-checkbox
          node-key="id"
          :default-expanded-keys="defaultCheckedKeys"
          :default-checked-keys="defaultCheckedKeys"
          @check="currentChecked"
        />
async created() {
// 需要对DOM树进行操作
  this.getCheckedMenu()
  },
methods: {
  getCheckedMenu() {
    // 将需要对DOM树进行的操作放到$nextTick回调中
     this.$nextTick(function() {
     // this.defaultCheckedKeys是需要勾选的节点数组,例如this.defaultCheckedKeys=[1,3,5]
         this.$refs.rightsTree.setCheckedKeys(this.defaultCheckedKeys)
          console.log(this.$refs.rightsTree)
     })
    }
  }
<think>根据提供的引用内容,用户询问在Vuecreated生命周期函数中获取DOM元素的方法。引用[1]和[3]明确指出,在created阶段,DOM尚未生成,因此无法直接获取DOM元素。引用[2]和[4]建议在mounted生命周期中操作DOM,因为此时DOM已经更新。 关键点: 1. created阶段:实例已创建,数据初始化完成,但DOM未挂载(el未初始化),因此无法访问DOM元素。 2. mounted阶段:DOM已挂载,可以操作DOM。 因此,在created中直接获取DOM元素是不可能的。如果需要在DOM存在后操作,应使用mounted钩子。 但是,如果用户确实需要在created中获取DOM(尽管不可行),可以解释原因并提供替代方案。 回答结构: 1. 明确说明created中无法获取DOM元素,并解释原因(引用支持)。 2. 推荐在mounted中获取DOM,并说明原因(引用支持)。 3. 如果需要在数据变化后操作更新后的DOM,建议使用nextTick(引用[1]提到)。 4. 注意事项:避免在mounted中修改状态导致无限循环(引用[4])。 生成相关问题: - 在created中为什么不能获取DOM? - 如何在mounted中安全操作DOM? - 使用nextTick的作用是什么? </think> ### Vue created生命周期中获取DOM元素的方法 在Vue.js中,**created生命周期函数中无法直接获取DOM元素**,原因如下: 1. **created阶段DOM尚未渲染** 根据引用[3],在created阶段"vue实例的数据对象data有了,$el还没有"。此时组件模板尚未编译成DOM,任何访问DOM操作(如`document.getElementById()`或`this.$refs`)都会返回`undefined`或null[^3]。 2. **正确操作DOM的时机** - ✅ **mounted钩子**:此时组件已完成DOM挂载,可通过`this.$refs`安全访问DOM元素[^2] - ✅ **nextTick()方法**:若需在数据更新后操作更新后的DOM,应在mounted中使用: ```javascript mounted() { this.$nextTick(() => { // 此处可操作更新后的DOM const element = this.$refs.myElement; }); } ``` 引用[1][^4]强调此方法可确保获取到最新的DOM结构。 3. **created阶段的替代方案** 若需在created阶段准备数据,但**不直接操作DOM**: - 初始化数据(如API请求) - 设置响应式状态 - 计算属性预处理 ```javascript created() { // 正确:数据初始化 this.loadData(); // 错误:尝试访问DOM(将失败) // console.log(this.$refs.element); // undefined } ``` ### 总结建议 - 🚫 **避免在created操作DOM**:因DOM未存在 - ✅ **改用mounted+$nextTick**:确保DOM就绪后操作[^1][^4] - ✅ **优先使用refs而非原生DOM API**:保持框架兼容性 > 示例:正确访问DOM > ```javascript > export default { > mounted() { > this.$nextTick(() => { > const titleEl = this.$refs.title; // 获取标题元素 > console.log(titleEl.textContent); > }); > } > } > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值