Vue3 父组件传值给子组件+以及使用NModal组件

前言:我想实现表格中点击详情弹窗出一个表格展示该行详细信息。想着这个弹窗里用子组件展示。分担父组件下,怕代码过多。(使用NModal组件弹窗展示)

等我一波百度,嗯,实现方法挺多嘛,什么refs什么的,看似条条大路通罗马,我一试,一试一条死路/(ㄒoㄒ)/~~,最后也没用到refs(我还是更倾向于用这个,毕竟vue2都是这样),一直说找不到$refs,我还去了解了底层**getCurrentInstance()**逻辑,有些又说不提倡这种方式,这个方法能看到我定义的的ref方法名,但是里面是null,又或者我当时子组件不是用的<script setup lang="ts">而是用的export default defineComponent下的setup(){},所以我不信邪,我子组件又改成了export default 还是不行。最后使用的defineProps
在这里插入图片描述

父组件:重点在 <child-detail :id="childRef"/>import childDetail from './childDetail.vue',以及需要改变childRef值的方法detailsEvent()

<template><div class="content-box"><n-form label-placement="left"inlinelabel-width="120px"><n-form-item label="UserName/Email"><n-input v-model:value="usersListRef.name_email" type="text" @input="queryConditional":style="{ width: '420px' }" placeholder="Please enter username or email (At least three letters)" /></n-form-item><!-- <n-form-item label="Email"><n-input v-model:value="usersListRef.email" type="text" :style="{ width: '280px' }" placeholder="Please enter email" /></n-form-item> --></n-form><n-space vertical :size="12" ><n-data-table style="min-height:calc(100vh - 223px);":bordered="false":single-line="false":columns="columns":data="data":loading="loading":pagination="pagination"striped /></n-space></div><n-modalv-model:show="showModal"class="custom-card"preset="card":style="bodyStyle"title="Details"size="huge":bordered="false":segmented="segmented"><!-- <template #header-extra>!</template> --><child-detail :id="childRef"/><!-- <n-data-table:bordered="false":single-line="false":columns="columns":data="data":loading="loading":max-height="300":pagination="pagination"striped /> --><!-- <template #footer>尾部</template> --></n-modal>
</template><script lang="ts">
import {NInput, NSpace,NButton, NForm, NFormItem, NDataTable, NModal} from 'naive-ui'
import {ref, defineComponent, Ref, getCurrentInstance, onMounted } from 'vue'
import { apiTokenRequest } from "@/stores/modules/apiEncapsulation"
import type { PaidlicenseResult } from "../../api/classes";
import type { DataTableColumns } from 'naive-ui'
import type { DataResult } from "../../api/classes";
import { h } from 'vue'
import { NTag, NAvatar } from 'naive-ui'
import { createDiscreteApi} from "naive-ui"
import childDetail from './childDetail.vue'interface UsersListType {username : string | nullemail: string | nullname_email: string | nullpageSize: number
}interface UsersListAll {id: string
}export default defineComponent({components: {NInput,NSpace,NButton,NForm,NFormItem,NDataTable,NModal,PaidLicenseDetail// NSwitch
},setup(){const childRef = ref("")const proxy = getCurrentInstance()!.proxyconst {message} = createDiscreteApi(["message"])const { dialog } = createDiscreteApi(["dialog"])let showModal = ref(false)const loadingRef = ref(true)const imgUrl = new URL('../../assets/AccountCircleOutlined.svg', import.meta.url).hrefconst usersListRef = ref<UsersListType>({username: null,email: null,name_email: null, pageSize: 12})const usersListAllResult : Ref<UsersListAll[]> = ref([])const getPaidResultMethod =  async ()=>{await apiTokenRequest<UsersListAll[]>("url","get").then(function(res){if(res){console.log('list===', res);usersListAllResult.value = resloadingRef.value = falseconsole.log('usersListAllResult===>',  usersListAllResult.value);}})}getPaidResultMethod()const queryConditional =async () => {console.log('条件查询===>', res);}const createColumns = ({detailsLicenses,deleteItem,handleChange,statusRes}: {detailsLicenses: (rowData: UsersListAll) => void,deleteItem: (rowData: UsersListAll) => void,handleChange: (rowData: UsersListAll) => void,statusRes: (status: number) => boolean,}): DataTableColumns<UsersListAll> => {return [{title: 'Name',key: 'name'},{title: 'Avatar',key: 'headerUrl',width:"120px",render (row) {return h(NAvatar,{style: {height:'50px',width:'50px',},color: '#fff',round:true,bordered: true,src:row.headerUrl ? row.headerUrl:imgUrl},)}},{title: 'Action',key: 'actions',width:"260px",render (row) {return [h(NButton,{size: 'small',type: "info",// quaternary: true,onClick: () => detailsLicenses(row)},{ default: () => 'Licenses' }),h( // 启、禁用NButton,{size: 'small',style: {marginLeft: "10px",width: "70px"},type: 'primary',// quaternary: true,onClick: () => handleChange(row)},{ default: () =>  row.status>0 ? 'Enable':'Disable' }),h( // 删除NButton,{size: 'small',style: {marginLeft: "10px",},type:"error",// quaternary: true,onClick: () => deleteItem(row)},{ default: () => 'Delete' }),]}}]}const detailsEvent = async (rowData:UsersListAll)=>{showModal.value = truechildRef.value= rowData.id}const deleteEvent = async (rowData:UsersListAll)=>{}const handleChangeEvent = async (rowData:UsersListAll)=>{}return{childRef,usersListRef,usersListAllResult,showModal,loading: loadingRef,queryConditional,data: usersListAllResult,columns: createColumns({detailsLicenses (rowData) {message.info('send mail to ' + rowData.name)detailsEvent(rowData)},deleteItem(rowData){deleteEvent(rowData)},handleChange(rowData){handleChangeEvent(rowData)}}),pagination: {pageSize: usersListRef.value.pageSize// pageSize: 2},bodyStyle: {width: '60vw',// height: '60vh'},segmented: {content: 'soft',// footer: 'soft'} as const,}}
})
</script><style scoped>
</style>

子组件:都是重点。

<template><n-data-table:bordered="false":single-line="false":data="detailsData":loading="loading":columns="childColumns":max-height="300":pagination="pagination"striped /> 1111111{{ props?.id }}
</template><script lang="ts">
import {NInput, NSpace,NButton, NForm, NFormItem, NDataTable, NModal} from 'naive-ui'
import { defineComponent, ref, Ref, defineProps, onMounted } from 'vue'
import { apiTokenRequest } from "@/stores/modules/apiEncapsulation"
import type { Result } from "../../api/classes";
import type { DataTableColumns } from 'naive-ui'export default defineComponent({components:{NDataTable},
})
</script><script setup lang="ts">const props = defineProps({id:{type: String,}})const pagination = ref( {pageSize: 10})const loading = ref(true)let childColumns :anyconst detailsData : Ref<PaidlicenseResult[]> = ref([])const getDetail= async (id:string|undefined)=>{await apiTokenRequest<Result[]>("url","get").then(function(res){if(res){console.log('details===', res);loading.value = falsedetailsData.value = reschildColumns  = columns()console.log('=====detailsData===', detailsData.value);}})}getDetail(props.id)const columns = () => {return [{title:'id',key: 'id'}]}
</script>

我原本想await 调用getDetail() 会报错。setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered. ,想用await是数据还没请求完,表格列名又加载了(当时还没有使用childColumns = columns()),就会同时出现这些报错type check failed for prop "columns". Expected Array, got Function Unhandled error during execution of setup function还有Unhandled error during execution of scheduler flush. This is likely a Vue internals bug. Please open an issue at。后面我想着,那就等数据请求成功后再调用columns(),用childColumns 字段赋值给组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/621176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC RESTful

文章目录 1、RESTful简介a>资源b>资源的表述c>状态转移 2、RESTful的实现3、HiddenHttpMethodFilter 1、RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 a>资源 资源是一种看待服务器的方式&#xff0c;即&…

HCIA-Datacom实验指导手册:1、华为 VRP 系统基本操作

1、华为 VRP 系统基本操作 一、实验目的:二、实验拓扑:三、实验目的:四、配置步骤:步骤 1 通过 Console 方式登录到 Router 的 CLI步骤 2 查看设备基本信息步骤 3 完成设备基本配置步骤 4 保存设备当前配置步骤 5 操作设备的文件系统步骤 6 重启设备五、结果验证1、比较保存…

[蓝桥杯 2016 省 AB] 四平方和

题目描述 四平方和定理&#xff0c;又称为拉格朗日定理&#xff1a; 每个正整数都可以表示为至多 4个正整数的平方和。 如果把 0 包括进去&#xff0c;就正好可以表示为 4 个数的平方和。 比如&#xff1a; 50^20^21^22^2。 71^21^21^22^2。 对于一个给定的正整数&#…

大数据深度学习卷积神经网络CNN:CNN结构、训练与优化一文全解

文章目录 大数据深度学习卷积神经网络CNN&#xff1a;CNN结构、训练与优化一文全解一、引言1.1 背景和重要性1.2 卷积神经网络概述 二、卷积神经网络层介绍2.1 卷积操作卷积核与特征映射卷积核大小多通道卷积 步长与填充步长填充 空洞卷积&#xff08;Dilated Convolution&…

详解Spring事件监听

第1章&#xff1a;引言 大家好&#xff0c;我是小黑。今天咱们来聊下Spring框架中的事件监听。在Java里&#xff0c;事件监听听起来好像很高大上&#xff0c;但其实它就像是我们日常生活中的快递通知&#xff1a;当有快递到了&#xff0c;你会收到一个通知。同样&#xff0c;在…

YOLOv8原理与源码解析

课程链接&#xff1a;https://edu.csdn.net/course/detail/39251 【为什么要学习这门课】 Linux创始人Linus Torvalds有一句名言&#xff1a;Talk is cheap. Show me the code. 冗谈不够&#xff0c;放码过来&#xff01;代码阅读是从基础到提高的必由之路。 YOLOv8 基于先前…

解决JuPyter500:Internal Server Error问题

目录 一、问题描述 二、问题分析 三、解决方法 四、参考文章 一、问题描述 在启动Anaconda Prompt后&#xff0c;通过cd到项目文件夹启动Jupyter NoteBook点击.ipynb文件发生500报错。 二、问题分析 base环境下输入指令&#xff1a; jupyter --version 发现jupyter环境…

Java之Lambda表达式

1.介绍 Lambda表达式是JDK8开始后的一种新语法形式。作用是简化匿名内部类的代码写法 2.Lambda表达式的简化格式 (匿名内部类被重写方法的形参列表) -> {被重写方法的方法体代码}3.Lambda表达式的限制 只允许操作函数式编程接口&#xff0c;即有且仅有一个抽象方法的接口…

maven管理使用

maven基本使用 一、简介二、配置文件三、项目结构maven基本标签实践(例子) 四、pom插件配置五、热部署六、maven 外部手动加载jar打包方式Maven上传私服或者本地 一、简介 基于Ant 的构建工具,Ant 有的功能Maven 都有,额外添加了其他功能.本地仓库:计算机中一个文件夹,自己定义…

电脑DIY-Intel处理器

Intel处理器 处理器级别命名规则后缀说明&#xff1a;桌面CPU后缀移动CPU后缀 酷睿系列 处理器级别 赛扬 < 奔腾 < 酷睿 < 至强 命名规则 例子&#xff1a; intel酷睿i9-14900K 品牌系列级别第几代SKU后缀intel酷睿i914900K 酷睿CPU好坏如何看&#xff1a; 1、第…

xadmin基于Django的后台管理系统安装与使用

xadmin是基于Django的后台管理系统 官网&#xff1a;http://sshwsfc.github.io/xadmin/ github地址&#xff1a;https://github.com/sshwsfc/xadmin 安装方式 pip安装 pip install xadmin在setting配置中添加&#xff1a; INSTALLED_APPS [xadmin,crispy_forms, ]在urls.py…

判断该数字是否是素数(Java实现)

从控制台输入一个数字&#xff0c;判断该数字是否是素数&#xff0c;要求使用 break 实现。 素数的特征&#xff1a;只能被1和本身整除&#xff0c;如素数3 只能被1 和3整除。 解题思路&#xff1a; 利用for循环&#xff0c;只要2~number-1范围内&#xff0c;任意一个数能够被…

springboot学生信息管理系统

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1研究背景 随着…

【rust/bevy】从game template开始

目录 说在前面步骤进入3D控制方块问题 说在前面 操作系统&#xff1a;win11rust版本&#xff1a;rustc 1.77.0-nightlybevy版本&#xff1a;0.12 步骤 rust安装 这里 windows下建议使用msvc版本bevy安装 这里clone代码git clone https://github.com/NiklasEi/bevy_game_templa…

【工作日语】三、IT用语

情報 じょうほう 信息開発する&#xff08;かいはつ&#xff09; 开发設計 せっけいする 设计仕様 しよう 规格概要 がいよう 概要詳細 しょうさい 详细機能 きのう 机能 功能処理 しょりする 处理画面 がめん 画面帳票 ちょうひょう 报表追加 ついかする 追加変更 …

Spring整理-Spring框架的国际化

Spring框架支持国际化(i18n),允许开发者创建可以适应不同语言和区域设置的应用程序。这主要是通过资源束(ResourceBundle)和区域设置解析器(Locale Resolver)来实现的。 实现步骤 创建资源文件:创建属性文件来存储特定语言的消息。通常,这些文件遵循命名模式:message…

Chapter 8 怎样使用类和对象(下篇)

⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️ 8.2 对象数组 1.对象数组的每一个元素都是同类的对象 2.在建立数组时&#xff0c;同样…

XML的用途之二:XML 简化数据共享

在真实的世界中&#xff0c;计算机系统和数据使用不兼容的格式来存储数据。 XML 数据以纯文本格式进行存储&#xff0c;因此提供了一种独立于软件和硬件的数据存储方法。 这让创建不同应用程序可以共享的数据变得更加容易。

听觉障碍应该找哪些专业人士?如何获得这些职业?

如果您有听觉障碍的困扰可以寻求以下专业人士的帮助。如果你有兴趣从事听力学职业&#xff0c;可以考虑以下 十几个选项&#xff1a; 1. 临床听力学家 临床听力学家检查患者以诊断他们的听力、平衡或耳朵相关问题。他们与所有年龄段的患者一起工作&#xff0c;或专门针对特定群…

关于java继承知识点总结

目录 继承 概念 代码格式 为什么要继承 继承类型 extends implements 子类与父类 性质 final关键字&#xff1a; super关键字&#xff1a;引用子类的父类。 this关键字&#xff1a;指向类自己的引用。 构造器 概念 子类与父类的构造器 看父类 子类中 继承 概…