当前位置: 首页 > article >正文

vue3通过ref拿element弹框中的组件问题

  • 写在<el-dialog>中的组件,在一开始,弹框没有弹出来的时候,<el-dialog>中的组件是没有被渲染出来的,因此在<el-dialog>中使用ref标记某个组件,在el-dialog没有被渲染出来之前去拿的话,是拿不到的。
  • 我们需要在打开弹框时,清空表单验证错误提示,但是,第一次,一上来的时候,不能直接就调用menuDialogFormRef.value.resetFields(),因为menuDialogFormRef.value是null,原因上面说了。
  • 什么时候能拿到<el-dialog>中使用ref标记的组件呢? 能在showMenuDialog方法中的前面(在修改让dialog显示的变量的代码的前面)就在nextTcik里面拿吗?不行!依然拿不到,因此怀疑修改响应式变量后,而引发重新渲染前就会遍历掉修改响应式变量之前的nextTick中的函数,然后渲染完成后,再遍历掉响应式变量修改之后的nextTick中的函数。
    在这里插入图片描述
<template>
    <div class="main-box">
    
    	<el-button type="primary" @click="showMenuDialog(optTypeOptions.addMenu)">
           <i class="iconfont icon-jiahao"></i>
             <span>新增菜单</span>
         </el-button>
         
         <el-dialog v-model="menuDialogVisible" :title="menuDialogTitle" :close-on-click-modal="false" width="500px">
         
            <el-form :model="menuDialogForm" :rules="menuRules" ref="menuDialogFormRef" size="default">
            	<el-form-item></el-form-item>
            </el-form>
            
         </el-dialog>
         
    </div>
</template>

<script setup>
import { ref, reactive, onMounted, computed,nextTick } from 'vue'

const menuDialogFormRef = ref(null)
const menuDialogVisible = ref(false)

// 显示 角色表单 弹框
function showMenuDialog(optType, menuData) {
    console.log(optType,menuData,111);
    console.log(menuDialogFormRef.value,2222);

    // 第一次的时候, dialog里的form表单还没渲染出来,ref是没有值的, 所以调用不了resetFields方法,
    // 所以, 来个判断, 当ref有值了, 再调用resetFields方法, 因为如果没有值的话, 就说明是第一次渲染, 那就不需要清空错误提示 
    // 或者,把resetFields的调用放到nextTick里面(但是一定要放到让dialog显示的变量修改之后的代码的nextTick里面,
    //      因为如果放在让dialogLog显示的变量修改之前的nexTick话, 是不行的, 也会拿不到ref, 
    //      因此, 怀疑在修改变量后引发重新渲染之前, 就会检查nextTick里面,有的话就直接调用了,然后,引发重新渲染,重新渲染后, 再检查nexTick里面,有的话,就调用)
    menuDialogFormRef.value && menuDialogFormRef.value.resetFields()
    nextTick(()=>{
        console.log(menuDialogFormRef.value,3333); // 比如: 这里第一次是拿不到menuDialogFormRef.value的, 它是null, 第一次之后就能拿到,所以第一次去调用就会报错
    })

	// 不需要理会这里在做啥
    if(optType.name == 'addMenu') {
        console.log('addMenu');
        menuDialogForm.value = {menuType: 1,isDisabled: 0,orders: 1}
    } else if(optType.name == 'addSubMenuForMenu' || optType.name == 'addSubMenuForDir') {
        console.log('addSubMenu');
        menuDialogForm.value = {menuType: menuData.menuType == 1?2:3,isDisabled: 0,orders: 1}

    }else if(optType.name == 'updateMenu') {
        console.log('updateMenu');
        menuDialogForm.value = menuData

    }
    optTyping.value = optType.name
    
    // 一定要放在这句代码之后
    menuDialogVisible.value = true
    
    nextTick(()=>{
        console.log(menuDialogFormRef.value,444); // 这里才能拿到, nextTick一定要放在 menuDialogVisible.value = true
                                                  // 这个对dialog显示变量的修改的代码之后,才能拿到menuDialogFormRef, 
                                                  // 不然这里拿到的就是null
    })
}
</script>

http://www.kler.cn/a/16566.html

相关文章:

  • 数据结构与算法-前缀和数组
  • 字节、快手、Vidu“打野”升级,AI视频小步快跑
  • 使用支付宝沙箱完成商品下单
  • 计算机毕业设计必看必学35755flask旅游景区热度可视化平台原创定制程序,java、PHP、python、小程序、文案全套、毕设成品等
  • Ubuntu 的 ROS 操作系统turtlebot3环境搭建
  • 力扣 LeetCode 977. 有序数组的平方(Day1:数组)
  • java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏
  • virtio-net收包流程
  • 操作系统入门——知识合集[长期更新......]
  • Python调用二分法和牛顿法求方程的根
  • 密码学作业——置换密码部分
  • 真北游记 | 潮汕行的似水流年
  • 拷贝构造函数和赋值重载函数详解
  • 辅助驾驶功能开发-功能对标篇(16)-NOA 城市辅助系统-毫末智行
  • C++标准库 --- 动态内存 (Primer C++ 第五版 · 阅读笔记)
  • 解密.[support2022@cock.li].faust后缀勒索病毒加密的文件:拯救您的企业数据的完整指南!
  • 100+Python挑战性编程练习系列 -- day 2
  • python基于轻量级YOLOv5的生猪检测+状态识别分析系统
  • 读研读博不emo
  • 数字化医院PACS影像系统 三维影像后处理技术应用
  • 100篇帮小白入门——什么是嵌入式系统?
  • CANOE入门到精通——CANOE系列教程记录2
  • 【Python】芜湖市空气质量指数可视化(散点图、分类散点图、单变量分布图、线性回归拟合图、相关性热力图)
  • Linux常见的网络命令
  • ChatGPT技术原理 第五章:GPT模型
  • 《Effective Python 编写高质量Python代码的59个有效方法》学习笔记5