Vue3 动态组件 component:is= 失效

news2024/10/5 16:19:32

错误代码

用Vue3,组件无需注册,所以就会提示“注册了不不使用”的报错,
于是用了异步注册,甚至直接为了不报错就在下面使用3个组件,有异步加载,但还是实现不了预期效果

<script setup>
import { ref, defineAsyncComponent, computed } from 'vue'
const Son1 = defineAsyncComponent(() => import('./components/BaseSon1.vue'));  
const Son2 = defineAsyncComponent(() => import('./components/BaseSon2.vue'));  
const Son3 = defineAsyncComponent(() => import('./components/BaseSon3.vue'));  
const list = ref([  
    { id: 1, name:'Son1', active: true },
    { id: 2, name:'Son2', active: false },
    { id: 3, name:'Son3', active: false },
])  
let componentName = ref('Son1') 
const getComponentName = computed(() => {
  return componentName.value;
}); 
const handleClick = (item,index) => {
    console.log('item,index',item,index);
    list.value.forEach((i) => {
        i.active = false
    })
    list.value[index].active = true 
    componentName.value = list.value[index].name
    console.log('componentName.value',componentName.value);
}
</script>
<template>
  <div class="app">  
    <component :is="getComponentName"></component>  
    <ul>  
            <li v-for="(item, index) in list" :key="item.id"
                @click="handleClick(item, index)"
                :class="{active: item.active}">
        {{ item.name }}  
      </li>  
    </ul>  
  </div>  
  <Son3></Son3>  
  <Son1></Son1>  
  <Son2></Son2>  

</template>


  
<style scoped> 
.active{
  color: red;  
}  
</style>

组件已经有了,但是component宽高为0
在这里插入图片描述就上面这个代码,除了没用2个script剩下的没啥大差别了,就不知道为啥上面的不行,可能是预编译啥的吧,求大佬指点

参看项目代码

所以,就用两个script
需要注册,component还有了宽高

<script>
import Son1 from './components/BaseSon1.vue'
import Son2 from './components/BaseSon2.vue'
import Son3 from './components/BaseSon3.vue'
export default {
    components: { Son1, Son2, Son3 }
}
</script>
<script setup>
import { ref, computed } from 'vue'
 
const list = ref([  
    { id: 1, name:'Son1', active: true },
    { id: 2, name:'Son2', active: false },
    { id: 3, name:'Son3', active: false },
])  
let componentName = ref('Son1') 
const getComponentName = computed(() => {
  return componentName.value;
}); 
const handleClick = (item,index) => {
    console.log('item,index',item,index);
    list.value.forEach((i) => {
        i.active = false
    })
    list.value[index].active = true 
    componentName.value = list.value[index].name
    console.log('componentName.value',componentName.value);
}
</script>
<template>
  <div class="app">  
    <component :is="getComponentName"></component>  
    <ul>  
            <li v-for="(item, index) in list" :key="item.id"
                @click="handleClick(item, index)"
                :class="{active: item.active}">
        {{ item.name }}  
      </li>  
    </ul>  
  </div>  


</template>


  
<style scoped> 
.active{
  color: red;  
}  
</style>

computed属性

就是说,还必须用computed属性,单用ref数据给:is还不行,下面是失败案例

<script>
import Son1 from './components/BaseSon1.vue'
import Son2 from './components/BaseSon2.vue'
import Son3 from './components/BaseSon3.vue'
export default {
    components: { Son1, Son2, Son3 }
}
</script>
<script setup>
import { ref } from 'vue'
 
const list = ref([  
    { id: 1, name:'Son1', active: true },
    { id: 2, name:'Son2', active: false },
    { id: 3, name:'Son3', active: false },
])  
let componentName = ref('Son1') 
// const getComponentName = computed(() => {
//   return componentName.value;
// }); 
const handleClick = (item,index) => {
    console.log('item,index',item,index);
    list.value.forEach((i) => {
        i.active = false
    })
    list.value[index].active = true 
    componentName.value = list.value[index].name
    console.log('componentName.value',componentName.value);
}
</script>
<template>
  <div class="app">  
    <component :is="ComponentName"></component>  
    <ul>  
            <li v-for="(item, index) in list" :key="item.id"
                @click="handleClick(item, index)"
                :class="{active: item.active}">
        {{ item.name }}  
      </li>  
    </ul>  
  </div>  


</template>


  
<style scoped> 
.active{
  color: red;  
}  
</style>

原因

在Vue中,使用特定的字符串来动态引入组件是一种常见的方法。这是因为在编译阶段,Vue会解析模板,找到对应字符串的组件并进行渲染。例如,中的字符串"Son2"会被解析为对应的组件并进行渲染。

然而,当你尝试使用一个变量(如componentName)作为动态组件的名称时,并不能直接使用该变量,因为Vue编译器无法在编译阶段确定要渲染的组件。

为了解决这个问题,你可以使用Vue的异步组件和动态组件的结合。在这种情况下,你可以将动态组件的名称作为异步组件的引用,然后通过动态绑定的方式将其传递给动态组件。

你可以修改模板部分的代码如下:

<component :is="getComponentName"></component>

然后,在脚本部分添加一个计算属性getComponentName来返回组件名称,代码如下:

const getComponentName = computed(() => {
  return componentName.value;
});

这样修改后,当componentName的值发生变化时,动态组件将根据新的组件名称进行更新和渲染。

请注意,为了让动态组件正常工作,确保组件名称正确且与相应组件的导入路径匹配。

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

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

相关文章

#define定义标识符详解

0.预定义符号 在讲解#define之前先给大家介绍几个预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C&#xff08;标准C&#xff09;&#xff…

服务器感染了Locked勒索病毒后的正确处理步骤,勒索病毒解密

在服务器中感染了Locked勒索病毒后&#xff0c;应该采取以下一系列步骤来应对和清除病毒&#xff1a; 立即断开网络连接&#xff1a;防止病毒进一步传播感染。备份重要数据&#xff1a;在执行任何操作之前&#xff0c;一定要先备份服务器上的重要数据。这样可以防止在处理病毒过…

经典网络解析(四) ResNet | 残差模块,网络结构代码实现全解析

文章目录 1 设计初衷2.网络结构2.1 残差块2.2 中间的卷积网络特征提取块1 两层33卷积层2 先11卷积层&#xff0c;再33卷积层&#xff0c;再33卷积层 2.3 结构总览表格 3 为什么残差模块有效&#xff1f;3.1 前向传播3.2 反向传播3.3 恒等映射3.4 集成模型 4.代码实现 1 设计初衷…

如何学习嵌入式Linux?

今日话题&#xff0c;如何学习嵌入式Linux&#xff1f;嵌入式底层开发是一种重要的技术&#xff0c;它被广泛应用于各种嵌入式系统中。随着科技的不断发展&#xff0c;嵌入式系统已经成为了我们日常生活中不可或缺的一部分。这就使得嵌入式开发的重要性也凸显出来。刚好我这有一…

opencv for unity package在unity中打开相机不需要dll

下载OpenCV for Unity 导入后&#xff0c;里面有很多案例 直接打开就可以运行 打开相机

Linux: errno: EADDRNOTAVAIL; ipv6-bind;Cannot assign requested address

文章目录 解释一种情况tentative 的解释 解释一种情况 #define EADDRNOTAVAIL 99 /* Cannot assign requested address */ 有一种情况是&#xff1a;当IP6的地址处于tentative的时候&#xff0c;就会返回这个错误。下面的是bind的调用的时候会check地址的flag。如果是tentati…

Java学习星球,十月集训,五大赛道(文末送书)

目录 什么是知识星球&#xff1f;我的知识星球能为你提供什么&#xff1f;专属专栏《Java基础教程系列》内容概览&#xff1a;《Java高并发编程实战》、《MySQL 基础教程系列》内容概览&#xff1a;《微服务》、《Redis中间件》、《Dubbo高手之路》、《华为OD机试》内容概览&am…

一款Python认证和授权的利器

迷途小书童 读完需要 7分钟 速读仅需 3 分钟 1 简介 authlib 是一个开源的 Python 库&#xff0c;旨在提供简单而强大的认证和授权解决方案。它支持多种认证和授权协议&#xff0c;如 OAuth、OpenID Connect 和 JWT。authlib 具有灵活的架构和丰富的功能&#xff0c;使开发人员…

lS1028 + 六网口TSN 硬交换+QNX/Linux实时系统解决方案在轨道交通系统的应用

lS1028 六网口TSN 硬交换QNX/Linux实时系统解决方案在轨道交通系统的应用 以下是在轨道交通应用的实物&#xff1a; CPUNXP LS1028A架构双核Cortex-A72主频1.5GHzRAM2GB DDR4ROM8GB eMMCOSUbuntu20.04供电DC 12V工作温度-40℃~ 80℃ 功能数量参数Display Port≤1路支持DP1.3…

UniAccess Agent卸载

异常场景&#xff1a; UniAccess Agent导致系统中的好多设置打不开 例如:ipv4的协议,注册表,host等等 需要进行删除,亲测有效,及多家答案平凑的 借鉴了这位大神及他里面引用的大神的内容 https://blog.csdn.net/weixin_44476410/article/details/121605455 问题描述 这个进…

Android开发MVP架构记录

Android开发MVP架构记录 安卓的MVP&#xff08;Model-View-Presenter&#xff09;架构是一种常见的软件设计模式&#xff0c;用于帮助开发者组织和分离应用程序的不同组成部分。MVP架构的目标是将应用程序的业务逻辑&#xff08;Presenter&#xff09;、用户界面&#xff08;V…

由于找不到msvcr110.dll的5种解决方法

在使用电脑的过程中&#xff0c;我们可能会遇到一些问题&#xff0c;比如打开软件时提示找不到 msvcr110.dll 文件丢失。这通常意味着该文件已被删除或损坏&#xff0c;导致程序无法正常运行。本文将介绍几种解决方案&#xff0c;帮助您解决这个问题。 首先&#xff0c;我们需…

Linxu下c语言实现socket+openssl数据传输加密

文章目录 1. Socket连接建立流程2、SocketSSL的初始化流程3、初始化SSL环境&#xff0c;证书和密钥4、SocketSSL 的c语言实现4.1 编写SSL连接函数4.2 编写加密服务端server.c4.3 编写加密客户端client.c 5、使用tcpdump检验源码获取 在进行网络编程的时候&#xff0c;我们通常使…

分布式算法相关,使用Redis落地解决1-2亿条数据缓存

面试题&#xff1a;1~2亿数据需要缓存&#xff0c;请问如何设计个存储案例 回答&#xff1a;单机单台100%不可能&#xff0c;肯定是分布式存储&#xff0c;用redis如何落地&#xff1f; 一般业界有三种解决方案&#xff1a; 哈希取余分区 2亿条记录就是2亿个k&#xff0c;v&…

Linux学习-HIS部署(3)

Jenkins插件资源下载 Jenkins部署 Jenkins部署 #Jenkins主机安装OpenJDK环境 [rootJenkins ~]# yum clean all; yum repolist -v ... Total packages: 8,265 [rootJenkins ~]# yum -y install java-11-openjdk-devel.x86_64 #安装OpenJDK11 [rootJenkins ~]# ln -s /usr/l…

Css 美化滚动条

/*设置滚动条宽度为 6px*/ ::-webkit-scrollbar {width: 6px; } /*设置背景颜色&#xff0c;并设置边框倒角&#xff0c;设置滚动动画&#xff0c;0.2 */ ::-webkit-scrollbar-thumb {background-color: #0003;border-radius: 10px;transition: all .2s ease-in-out; } /*设置滚…

探索创意的新辅助,AI与作家的完美合作

在现代社会&#xff0c;文学创作一直是人类精神活动中的重要一环。从古典文学到现代小说&#xff0c;从诗歌到戏剧&#xff0c;作家们以他们的独特视角和文学天赋为我们展示了丰富多彩的人生世界。而近年来&#xff0c;人工智能技术的快速发展已经渗透到各行各业&#xff0c;文…

Leetcode191. 位1的个数

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 思路&…

人工智能AI 全栈体系(六)

第一章 神经网络是如何实现的 这些年神经网络的发展越来越复杂&#xff0c;应用领域越来越广&#xff0c;性能也越来越好&#xff0c;但是训练方法还是依靠 BP 算法。也有一些对 BP 算法的改进算法&#xff0c;但是大体思路基本是一样的&#xff0c;只是对 BP 算法个别地方的一…

mapper文件添加@Mapper注解爆红

如图所示 报错原因&#xff1a;缺少相关的依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version> </dependency> 添加之后并刷新依赖…