经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
vue3中ref绑定dom或者组件失败的原因及分析
来源:jb51  时间:2023/4/21 8:57:33  对本文有异议

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组件方法的逻辑放到下一个时间片执行即可。(推荐

  1. function addFilterPropertyRule(row) {
  2.  
  3. let ruleParamObj = JSON.parse(row.hardwareParam)
  4. if (ruleParamObj) {
  5. makePropertityTree(ruleParamObj, treeData)
  6. }
  7. addOrEditRuleVisible.value = true
  8. currentRuleItem = row
  9. if (row.ruleJson) {
  10. nextTick(() => {
  11. treeRef.value.setCheckedNodes(JSON.parse(row.ruleJson), false)
  12. })
  13. }
  14. }

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

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

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

  1. <template>
  2. ? <div v-for="(item, i) in list" :ref="el => { if (el) divs[i] = el }">
  3. ? ? {{ item }}
  4. ? </div>
  5. </template>
  6. ?
  7. <script>
  8. ? import { ref, reactive, onBeforeUpdate } from 'vue'
  9. ?
  10. ? export default {
  11. ? ? setup() {
  12. ? ? ? const list = reactive([1, 2, 3])
  13. ? ? ? const divs = ref([])
  14. ?
  15. ? ? ? // 确保在每次更新之前重置ref
  16. ? ? ? onBeforeUpdate(() => {
  17. ? ? ? ? divs.value = []
  18. ? ? ? })
  19. ?
  20. ? ? ? return {
  21. ? ? ? ? list,
  22. ? ? ? ? divs
  23. ? ? ? }
  24. ? ? }
  25. ? }
  26. </script>
  • Ref
  1. <template>?
  2. ? <div ref="root">This is a root element</div>
  3. </template>
  4. ?
  5. <script>
  6. ? import { ref, onMounted } from 'vue'
  7. ?
  8. ? export default {
  9. ? ? setup() {
  10. ? ? ? const root = ref(null)
  11. ?
  12. ? ? ? onMounted(() => {
  13. ? ? ? ? // DOM 元素将在初始渲染后分配给 ref
  14. ? ? ? ? console.log(root.value) // <div>This is a root element</div>
  15. ? ? ? })
  16. ?
  17. ? ? ? return {
  18. ? ? ? ? root
  19. ? ? ? }
  20. ? ? }
  21. ? }
  22. </script>

总结

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号