最近碰到一个Angular中无法获取DOM进行实例化的问题:记录一下
项目使用 Project Clarity 框架,父组件中包含子组件,父组件中用d框控制子组件的显示和隐藏,当d框显示时,ng读到父组件中的子组件,然后进行加载渲染,但是TS的执行在DOM渲染完成之后,因为我试图在ngAfterViewInit中获取DOM元素,用getElementById取到的值居然是null,而getElementsByClassName获取到对象,但是用数组方式访问时却不识别,百思不得其解
通过Debug我发现,当子组件TS执行时,父组件页面中的DOM并未加载出来,我使用定时器延迟之后就可以了,刚开始我以为是ngIf 的问题导致了这个执行顺序错误,
为了解决这个问题,我另外写了个demo,父组件控制子组件的显示,但是demo中并未出现项目中的问题,我可以在ngAfterViewInit中获取到子组件的DOM,因此我判断是 Project Clarity 框架的原因,他的d框使得DOM的加载慢了一点
但是使用ElementRef可以获取到在框架中获取不到的DOM,但是因为项目逻辑问题,这个方法并不能解决我的问题
问题找到了,但是没有解决,很郁闷!
注意:本篇没有干货
ref有以下用法用法:
1、ref 加在普通的元素上,用thisrefname 获取到的是dom元素
2、ref 加在子组件上,用thisrefname 获取到的是组件实例,可以使用组件的所有方法。
3、利用 v-for 和 ref 获取一组数组或者dom 节点
效果图:
1、ref 需要在dom渲染完成后才会有,在使用的时候确保dom已经渲染完成。比如在生命周期 mounted(){} 钩子中调用,或者在 this$nextTick(()=>{}) 中调用。
vue 问题笔记 ref获取不到指定的DOM节点问题解决
使用场景,牌匾文字上的公司名要根据字数多少自动变大变小,要先拿到文字内容
html:
<div class="head-h1" ref="company_name" >{{datascompany_name}}</div>
js:当页面刚加载完,通过接口获取{{datascompany_name}}的值,要对里面的值编辑时
this$refscompany_name 拿不到值
解决办法:
接口响应完,this$nextTick()方法里面 *** 作DOM,它才能接收到DOM更新的值
官方解释:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
this$nextTick(_=>{
。。。。
this$refs company_name
})
以上就是关于无法在ngAfterViewInit之后获取到DOM元素全部的内容,包括:无法在ngAfterViewInit之后获取到DOM元素、vue中ref获取不到dom问题解决,关于this.$nextTick的使用、vue 无法获取DOM的innerHtml等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)