首页IT科技springboot框架和vue框架一样吗([Vue warn]: Error in v-on handler: “TypeError: Cannot read properties of undefined (reading ‘$refs‘))

springboot框架和vue框架一样吗([Vue warn]: Error in v-on handler: “TypeError: Cannot read properties of undefined (reading ‘$refs‘))

时间2025-08-02 19:21:58分类IT科技浏览6048
导读:报错:...

报错:

[Vue warn]: Error in v-on handler: "TypeError: Cannot read properties of undefined (reading $refs)"

 背景:1.在做vue项目时                ,在功能弹框中                        ,想实现新增内容                。

             2. 报错原因是要触发menuCheckall组件后         ,才可以提交            ,因为不触发menuCheckall的时候dom未加载                        ,没有编译渲染进dom里面                        。

1.使用了

this.form.menuIds = this.$refs.menuCheckall.$refs.tree.getCheckedKeys();

其中menuCheckall是子组件         。

this.$refs[form].validate((valid) => { if (valid) { this.form.menuIds = this.$refs.menuCheckall.$refs.tree.getCheckedKeys(); addOrUpdateRole(this.form).then((res) => { console.log(res); if (res.code == 0) { this.$message.success(提交成功); this.dialogShow = false; this.$emit(call-back); } else { this.$message.error(res.message); } }); } });

2.但是报错了             ,原因是:

mouted加载数据以后        ,隐藏的弹出框并没有编译渲染进dom里面            。所以click弹出的时候$refs并没有获取到dom元素导致  undefined                        。

对话是一个虚拟dom,visible!==true之前                        ,dom未挂载在根节点上                 ,导致无法识别             。

3.解决办法:

在网上查了一些解决方法    ,大致有三种:

1)$nextTick dom下一次更新之后

this.$nextTick(()=>{ this.form.menuIds = this.$refs.menuCheckall.$refs.tree.getCheckedKeys(); })

 这种方法虽然可以提交成功                        ,但是还是会报错        。

 2)如果是第一次就点击新增就没必要reset, 根据元素undefined判断

                if (this.$refs.menuCheckall.$refs.tree.getCheckedKeys() !== undefined) {

                    this.form.menuIds =this.$refs.menuCheckall.$refs.tree.getCheckedKeys();

                } 

此种方法仍报错也不可提交                     ,不适用于我的情况                        。

3)在方法前加了关键字async

这个我没有试

4)最后发现,问题在v-if

改为v-show即可

原因:

v-show作用:当用v-show来隐藏元素时                    ,只会在初次加载时渲染此dom节点                         ,之后都是通用display来控制显隐     ,如果此时使用v-if                ,那会频繁的操作dom                        ,会极大的影响性能         ,但用display则不会

而v-if作用:当用v-if来隐藏元素时            ,初次加载时就不用渲染此dom节点                        ,提升页面加载速度

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
庄河市信息网招聘信息(庄河市信息网最新招聘) 帝国cms如何使用(帝国cms源码怎么安装)