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

Vue3+TSX开发模式下内置组件的替代方案

问题:

开发模式为 Vue3+TSX, 无法通过Vue的内置组件<component />实现动态组件,代码为:

import { defineComponent } from 'vue'
import Comp1 from './components/xxx'

export default defineComponent({
  name: 'App',
  components: {
    xxx
  },
  setup (){
    
    return {}
  },
  render() {
    return (
      <component is={ 'Comp' }></component>
    )
  }
})

可是却未能生效,且有以下提示,大概意思就是组件没有注册,但是不知道在哪里引入vue的内置组件:
在这里插入图片描述

原因:

以下内容摘自文档

<component> is
在底层实现里,模板使用 resolveDynamicComponent 来实现 is attribute。如果我们在 render 函数中需要 is提供的所有灵活性,我们可以使用同样的函数:

const { h, resolveDynamicComponent } = Vue

// ...

// `<component :is="name"></component>`
render() {
  const Component = resolveDynamicComponent(this.name)
  return h(Component)
}

就像 is, resolveDynamicComponent 支持传递一个组件名称、一个 HTML 元素名称或一个组件选项对象。

通常这种程度的灵活性是不需要的。通常resolveDynamicComponent 可以被换做一个更直接的替代方案。

例如,如果我们只需要支持组件名称,那么可以使用resolveComponent来代替。

如果 VNode 始终是一个 HTML 元素,那么我们可以直接把它的名字传递给 h:

// `<component :is="bold ? 'strong' : 'em'"></component>`
render() {
  return h(this.bold ? 'strong' : 'em')
}

同样,如果传递给 is 的值是一个组件选项对象,那么不需要解析什么,可以直接作为 h 的第一个参数传递。

<template> 标签一样,<component> 标签仅在模板中作为语法占位符需要,当迁移到 render 函数时,应被丢弃。

内置组件

诸如 <keep-alive><transition><transition-group> <teleport>等内置组件默认并没有被全局注册。这使得打包工具可以 tree-shake,因此这些组件只会在被用到的时候被引入构建。不过这也意味着我们无法通过 resolveComponent resolveDynamicComponent 访问它们。

在模板中这些组件会被特殊处理,即在它们被用到的时候自动导入。当我们编写自己的 render 函数时,需要自行导入它们:

诸如 <KeepAlive><Transition><TransitionGroup><Teleport> <Suspense> 等内置组件在渲染函数中必须导入才能使用:

import { h, KeepAlive, Teleport, Transition, TransitionGroup } from 'vue'

export default {
  setup () {
    return () => h(Transition, { mode: 'out-in' }, /* ... */)
  }
}

如果不用h函数 用jsx语法怎么写呢?

像tsx 和 jsx 的方式写组件 ,本来就会缺少一些.vue组件的一些东西 ,像这种情况 ,想使用 teleport 那就从vue 中 import , 名字是 大写字母开头<Teleport> ,然后,components:{} 中注册一下

以上内容来自:https://segmentfault.com/q/1010000040821752?utm_source=sf-similar-question

解决:

动态组件的实现方式:

import { defineComponent, h, resolveComponent, defineAsyncComponent,ref } from 'vue';

export default defineComponent({  
	components:{
		coma: defineAsyncComponent(() => import('./components/coma')),
        comb: defineAsyncComponent(() => import('./components/comb'))
	},
	setup(){  
		let Component = ref('coma');
		return ()=>(
			<>
				<h1>动态组件示例</h1>
                <button onClick={ () => Component.value = 'coma'}>coma</button>
    			<button onClick={ () => Component.value = 'comb'}>comb</button>
                { h(resolveComponent(Component.value)) }
			</>
		);
	}
})

关键步骤:
1.用defineAsyncComponent声明需要动态载入的组件
2.用resolveComponent请求组件
3.用渲染函数h加载组件

参考资料:
Vue3官方渲染函数/JSX改写案例
vue使用jsx写法如何实现动态组件功能?
vue3+tsx 内置组件不生效

相关文章:

  • 燃烧化学平衡判据
  • 05--Django视图层-JsonResponse对象、request对象中的其他方法以及FBV与CBV的书写
  • Spring中Bean的生命周期详解
  • Linux文件之/etc/passwd和/etc/shadow
  • OCR - 微软windows 11系统自带的Windows OCR功能初体验
  • 公众号网课查题系统
  • 关于SELECT...FOR UPDATE到底锁表还是锁行
  • 解决问题的思路很重要,运维领域,结果对,过程就对!
  • C++ 顺序表和单链表的二路归并思想(详解+示例代码)
  • T1071 菲波那契数(信息学一本通C++)
  • Android开发基础——广播实践
  • opencv 深度学习
  • Windows取证——基本网络命令
  • CDH 09Cloudera Manager Kerberos安装配置(markdown新版二)
  • 小米面试——案例总结
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • chrome扩展demo1-小时钟
  • Cookie 在前端中的实践
  • Docker 笔记(2):Dockerfile
  • export和import的用法总结
  • HTML中设置input等文本框为不可操作
  • JavaScript类型识别
  • Java编程基础24——递归练习
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux中的硬链接与软链接
  • SQLServer之创建数据库快照
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 前端面试之闭包
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • FaaS 的简单实践
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (HAL库版)freeRTOS移植STMF103
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (十六)串口UART
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)Dubbo快速入门、介绍、使用
  • 、写入Shellcode到注册表上线
  • .net 7 上传文件踩坑
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET/C# 的字符串暂存池
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @JsonSerialize注解的使用
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)