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

ts,js文件中使用 h函数渲染组件

目录

一、问题

二、解决方法

三、总结


 

一、问题

1. 新需求发现要复用之前的代码,所以重构抽离代码。但是发现原来的代码中涉及到组件渲染。

2.如何在ts,js文件中渲染组件呢?

二、解决方法

1.思路

   使用h()+render函数来实现编程式渲染

2.遇到的问题

 1) 渲染的组件使用到第三方库组件时,会报错 Failed to Resolve AModal,ARadio

     原因:render渲染的组件和 App.vue渲染的组件不在同一个上下文,第三方库需要单独引入

     解决方法:组件内部单独从 ant-design中引入 

        import { message, Modal, Radio, RadioGroup } from 'ant-design-vue'

2) 中英文显示:ant-design默认显示英文,如何显示中文呢

      解决方法:引入ConfigProvider并且设置 locale:zhCN

3.示例代码

  /*** h渲染组件* @param row 数据* @param visible 是否渲染组件*/const container = document.createElement('div')function renderComponent(row: Partial<GoodsData>, visible: boolean) {if (visible) {const dom = h(ConfigProvider,{// ant-design-vue 语言显示为中文locale: zhCN},h(DialogPintuanPriceAdjustment, {wholesaleId: row.wholesaleId,onSuccess: () => {openGroupEditPage('normal', row)},onClose: () => {renderComponent(row, false)}}))render(dom, container)} else {// 卸载组件render(null, container)}}
<template><!-- 组件DialogPintuanPriceAdjustment --><Modal centered title="" visible :width="500" :confirm-loading="loading" @cancel="emit('close')" @ok="submit"><div class="mb-2">该拼团活动是同步一口价自动上架的拼团,请问是否需要调整价格?</div><RadioGroup v-model:value="selected"><Radio :value="0">我要调整价格(系统将解除与一口价的关联关系)</Radio><Radio :value="1">不调价,仅修改其他内容(保持与一口价的供乐药价一致,系统定时同步刷新)</Radio></RadioGroup></Modal>
</template><script lang="ts" setup>
import { unBindAct } from '@/api/commodity-management/goodsOnShelves'
import { isNullOrUnDef } from '@/utils/is'
/*** 必须单独引入:否则会报错 Failed to resolve: Modal,Radio,RadioGroup* 因为h(),render渲染的组件和vue渲染的组件不在同一个上下文*/
import { message, Modal, Radio, RadioGroup } from 'ant-design-vue'
interface Props {wholesaleId: number
}const props = defineProps<Props>()const emit = defineEmits(['close', 'success'])const selected = ref<number | undefined>(undefined)const loading = ref(false)
async function submit() {if (isNullOrUnDef(unref(selected))) {message.warning('请先选择处理方式')return}if (unref(selected) === 0) {loading.value = truetry {await unBindAct({wholesaleId: props.wholesaleId})message.success('处理成功')emit('success')emit('close')} finally {loading.value = false}return}if (unref(selected) === 1) {emit('success')emit('close')return}
}
</script>

 

三、总结

1. h()+render可以在ts中渲染组件

2.h()+render渲染的组件和App.vue不在同一个上下文,对于第三方库组件需要单独引入,中英文也需要单独配置

3.注意使用 render(null,container)卸载组件,避免内存泄漏

/*

希望对你有帮助!

如有错误,欢迎指正,谢谢!

*/

 

http://www.xdnf.cn/news/1435969.html

相关文章:

  • 美国服务器连接速度变慢时应该着重做哪些检查?
  • 双Token实战:从无感刷新到安全防护,完整流程+代码解析
  • PostgreSQL(1) FETCH用法
  • 【MySQL体系结构详解:一条SQL查询的旅程】
  • 《一篇拿下!C++:类和对象(中)构造函数与析构函数》
  • Java 21 虚拟线程 + 分布式调度深度实战:从原理到落地,大促日志同步效率提升 367%
  • 基于SpringBoot的校园资料分享平台
  • Mysql数据库基础(上)
  • 第1章:VisualVM 简介与安装
  • 东土科技战略升级:成立半导体子公司,赋能国产半导体智能化升级
  • 基于 HTML、CSS 和 JavaScript 的智能图像锐化系统
  • HTML第五课:求职登记表
  • 【实时Linux实战系列】基于实时Linux的农业自动化系统开发
  • C++ numeric库简介与使用指南
  • 项目解析:技术实现与面试高频问题
  • Linux - 进程切换
  • Git在idea中的实战使用经验(一)
  • 【TRAE调教指南之MCP篇】Exa MCP:治疗AI幻觉的有效方案
  • 构建企业级区块链网络:基于AWS EC2的弹性、高可用解决方案
  • CICD 持续集成与持续交付
  • GDB 调试
  • 第4章:内存分析与堆转储
  • 命令行文本处理小工具:cut、sort、uniq、tr 详解与应用
  • EMQX 4.4 加mysql认证
  • BandiZip下载与详细图文安装教程!!
  • docker 安装 redis 并设置 volumes 并修改 修改密码(二)
  • 构建可扩展的 AI 应用:LangChain 与 MCP 服务的集成模式
  • C++算法学习:位运算
  • ECMWF数据批量下载(Windows版本)
  • Ngene:实验设计的尖端利器