vue3中ref绑定dom或者组件失败的原因及分析

 更新时间:2023年04月19日 15:30:07   作者:ITzhongzi  
这篇文章主要介绍了vue3中ref绑定dom或者组件失败的原因及分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

vue3 ref绑定dom或者组件失败原因分析

场景描述

在vue3中经常用到使用ref绑定组件或者dom元素的情况,很多时候,明明使用ref绑定了相关组件,但是经常ref绑定失败的情况。

ref绑定失败情况举例

ref绑定失败的绝大多数情况是,在ref和组件绑定的时候,该组件还未渲染,所以绑定失败。

或者组件刚开始未渲染,ref未绑定,当组件开始渲染,ref也开始绑定,但是ref和组件并未绑定完成,这个时候使用组件相关的方法就会出现问题。

  • ref绑定的组件使用了v-if,或者他的父组件使用了v-if导致页面开始渲染的时候,这些组件并没有渲染,所以绑定失败。
  • element-plus中有很多 dialog弹窗等组件,这些组件开始是隐藏的,只有用户点击了按钮才展示,所以很多时候是在用户点击按钮的时候,ref才开始和组件绑定,这个时候绑定还未完成,我们通过ref的变量使用组件的方法,就会出现Uncaught TypeError: Cannot read properties of null (reading 'setCheckedNodes')的错误

解决方案

使用vue3的nextTick方法,让调用ref组件方法的逻辑放到下一个时间片执行即可。(推荐

function addFilterPropertyRule(row) {

    let ruleParamObj = JSON.parse(row.hardwareParam)
    if (ruleParamObj) {
        makePropertityTree(ruleParamObj, treeData)
    }
    addOrEditRuleVisible.value = true
    currentRuleItem = row
    if (row.ruleJson) {
        nextTick(() => {
            treeRef.value.setCheckedNodes(JSON.parse(row.ruleJson), false)
        })
    }
}

使用一个延时定时器,让调用ref组件方法的逻辑等一会再执行。(不推荐) 

vue3组合式API的v-for及ref绑定DOM

组合式 API 模板引用在 v-for 内部使用时没有特殊处理。需要绑定函数自定义处理。

<template>
  <div v-for="(item, i) in list" :ref="el => { if (el) divs[i] = el }">
    {{ item }}
  </div>
</template>
 
<script>
  import { ref, reactive, onBeforeUpdate } from 'vue'
 
  export default {
    setup() {
      const list = reactive([1, 2, 3])
      const divs = ref([])
 
      // 确保在每次更新之前重置ref
      onBeforeUpdate(() => {
        divs.value = []
      })
 
      return {
        list,
        divs
      }
    }
  }
</script>
  • Ref
<template> 
  <div ref="root">This is a root element</div>
</template>
 
<script>
  import { ref, onMounted } from 'vue'
 
  export default {
    setup() {
      const root = ref(null)
 
      onMounted(() => {
        // DOM 元素将在初始渲染后分配给 ref
        console.log(root.value) // <div>This is a root element</div>
      })
 
      return {
        root
      }
    }
  }
</script>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue使用element实现上传图片和修改图片功能

    vue使用element实现上传图片和修改图片功能

    前几天做到一个关于图片上传功能,下面这篇文章主要给大家介绍了关于vue使用element实现上传图片和修改图片功能的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Vue 项目运行完成后自动打开浏览器的方法汇总

    Vue 项目运行完成后自动打开浏览器的方法汇总

    这篇文章主要介绍了Vue 项目运行完成后自动打开浏览器的多种实现方法,方法一比较适用于vue3,每种方法通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-02-02
  • vue 懒加载组件chunk相对路径混乱问题及解决

    vue 懒加载组件chunk相对路径混乱问题及解决

    这篇文章主要介绍了vue 懒加载组件chunk相对路径混乱问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue 3开发中VueUse强大Hooks库

    Vue 3开发中VueUse强大Hooks库

    VueUse提供了一个丰富且强大的Hooks库,可以帮助开发者快速实现各种功能,提高开发效率,本文来详细的介绍一下,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • vue3使用Element-plus的el-pagination分页组件时无法显示中文

    vue3使用Element-plus的el-pagination分页组件时无法显示中文

    本文主要介绍了vue3使用Element-plus的el-pagination分页组件时无法显示中文,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • 详解vuejs中执行npm run dev出现页面cannot GET/问题

    详解vuejs中执行npm run dev出现页面cannot GET/问题

    这篇文章主要介绍了详解vuejs中执行npm run dev出现页面cannot GET/问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Vue3使用vue-qrcode-reader实现扫码绑定设备功能(推荐)

    Vue3使用vue-qrcode-reader实现扫码绑定设备功能(推荐)

    本文介绍了在Vue3中使用vue-qrcode-reader版本5.5.7来实现移动端的扫码绑定设备功能,用户通过扫描二维码自动获取设备序列号,并填充到添加设备界面,完成设备绑定的全过程,包含ScanCode.vue和DeviceAdd.vue两个主要界面的实现方式
    2024-10-10
  • v-distpicker地区选择器组件使用实例详解

    v-distpicker地区选择器组件使用实例详解

    代码添加了一个vDistpickerHandle的事件处理函数对地区选择器中的数据进行处理,将数据存储到form对象的相应属性中,方便数据提交,这篇文章主要介绍了v-distpicker地区选择器组件使用,需要的朋友可以参考下
    2024-02-02
  • Vue+Openlayer实现图形的拖动和旋转变形效果

    Vue+Openlayer实现图形的拖动和旋转变形效果

    Openlayer具有自己的扩展插件ol-ext,可以用来实现图形的拖拽、旋转、缩放、拉伸、移动等操作,本文将主要介绍通过Openlayer实现图形的拖动和旋转,需要的同学可以学习一下
    2021-11-11
  • vue整合项目中百度API示例详解

    vue整合项目中百度API示例详解

    这篇文章主要为大家介绍了vue整合项目中百度API示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论