Vue3 动态组件 component:is= 失效

错误代码

用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].nameconsole.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].nameconsole.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].nameconsole.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.rhkb.cn/news/141415.html

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

相关文章

如何设计一个 JVM 语言下的 LLM 应用开发框架?以 Chocolate Factory 为例

本文将介绍 Chocolate Factory 框架背后的一系列想法和思路。在我们探索和设计框架的过程中&#xff0c;受到了&#xff1a;LangChain4j、LangChain、LlamaIndex、Spring AI、Semantic Kernel、PromptFlow 的大量启发。 欢迎一起来探索&#xff1a;https://github.com/unit-mes…

历史高频行情数据存储最佳实践:DolphinDB Array Vector 使用指南

越来越多的机构使用 L1/L2 的快照行情数据进行量化金融的研究。作为一个高性能时序数据库&#xff0c;DolphinDB 非常适合存储和处理海量的历史高频行情数据。针对快照数据包含多档位信息的特点&#xff0c;DolphinDB 研发了一种方便、灵活且高效的数据结构——Array Vector&am…

[AI Agent学习] MetaGPT源码浅析

前言 工作上&#xff0c;需要使用AI Agent&#xff0c;所以需要深入学习一下AI Agent&#xff0c;光阅读各种文章&#xff0c;总觉无法深入细节&#xff0c;所以开看各类AI Agent相关的开源项目&#xff0c;此为第一篇&#xff0c;学习一下MetaGPT的源码。 基本目标 MetaGPT是一…

博客系统的自动化测试

本次自动化实战内容&#xff1a;本次测试根据博客管理系统这个项目&#xff0c;首先设计UI自动化测试用例&#xff0c;然后使用Selenium4自动化测试工具和JUnit5单元测试框架&#xff0c;实现web端的自动化测试。 本次项目总体实现思路&#xff1a;目录下有一个common包&#…

机器学习(19)---神经网络详解

神经网络 一、神经网络概述1.1 神经元模型1.2 激活函数 二、感知机2.1 概述2.2 实现逻辑运算2.3 多层感知机 三、神经网络3.1 工作原理3.2 前向传播3.3 Tensorflow实战演示3.3.1 导入数据集查看3.3.2 数据预处理3.3.3 建立模型3.3.4 评估模型 四、反向传播五、例题5.1 题15.2 题…

Day1-DeepWalk

论文《DeepWalk: Online Learning of Social Representations》 2014年发表在数据挖掘顶会ACM SIGKDD&#xff08;KDD&#xff09;上的论文 目的&#xff1a;学习节点表示 推动&#xff1a;将自然语言处理里面的无监督学习方法迁移至此 思路&#xff1a;将图结构序列化&#x…

ajax method to retrieve images as a blob

go 服务端&#xff1a; 就是先把这个图片读出来 然后返回二进制的数据 byteFile, err : ioutil.ReadFile("." "/processed/" uuidStr"processed.png")if err ! nil {fmt.Println(err)}c.Header("Content-Disposition", "att…

MYSQL不常用但好用写法

ORDER BY FIELD() 自定义排序逻辑 MySql 中的排序 ORDER BY 除了可以用 ASC 和 DESC&#xff0c;还可以通过 「ORDER BY FIELD(str,str1,…)」 自定义字符串/数字来实现排序。这里用 order_diy 表举例&#xff0c;结构以及表数据展示&#xff1a; ORDER BY FIELD(str,str1,…) …

Android 滑动事件消费监控,Debug 环境下通用思路

Android Debug 环境下滑动事件消费监控通用思路 背景 Android 开发中&#xff0c;经常会遇到滑动事件冲突。在一些简单的场景下&#xff0c;我们如果能够知道是那个 View 拦截了事件&#xff0c;那我们能够很容易得解决。解决方法通常就是内部拦截法或者外部拦截法。ViewPage…

SWC 流程

一个arxml 存储SWC &#xff08;可以存多个&#xff0c;也可以一个arxml存一个SWC&#xff09;一个arxml 存储 composition &#xff08;只能存一个&#xff09;一个arxml 存储 system description (通过import dbc自动生成system) 存储SWC和composition的arxml文件分开&#…

注入之SQLMAP(工具注入)

i sqlmap是一个自动化的SQL注入工具&#xff0c;其主要功能是扫描&#xff0c;发现并利用给定的URL和SQL注入漏洞&#xff0c;其广泛的功能和选项包括数据库指纹&#xff0c;枚举&#xff0c;数据库提权&#xff0c;访问目标文件系统&#xff0c;并在获取操作权限时执行任…

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

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

北工大汇编——综合题(1)

题目要求 统计字符数。从键盘输入一行字符&#xff0c;统计字母、空格、数字、其他宇符的个数&#xff0c;并显示。要求&#xff1a;提示输入一行宇符串&#xff1b;键盘输入宇符串&#xff0c;Enter 键结束输入&#xff0c;并换行显示结果。 题目代码 DATAS SEGMENT;此处输…

JSP ssm 零配件管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm 零配件管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

一文了解什么SEO

搜索引擎优化 (SEO) 是一门让页面在 Google 等搜索引擎中排名更高的艺术和科学。 一、搜索引擎优化的好处 搜索引擎优化是在线营销的关键部分&#xff0c;因为搜索是用户浏览网络的主要方式之一。 搜索结果以有序列表的形式呈现&#xff0c;网站在该列表中的排名越高&#x…

Android开发MVP架构记录

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

Selenium自动化测试框架常见异常分析及解决方法

01 pycharm中导入selenium报错 现象: pycharm中输入from selenium import webdriver, selenium标红 原因1: pycharm使用的虚拟环境中没有安装selenium, 解决方法: 在pycharm中通过设置或terminal面板重新安装selenium 原因2: 当前项目下有selenium.py,和系统包名冲突导致, …

Linux学习第19天:Linux并发与竞争实例: 没有规矩不成方圆

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 先说点题外话&#xff0c;上周参加行业年会&#xff0c;停更了一周。接下来的周五就要开启国庆中秋双节模式&#xff0c;所以有的时候&#xff0c;尤其是工作以后…

JAVA学习-全网最详细

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

表格内日期比较计算

需求&#xff1a;在表格中新增数据&#xff0c;计算开始日期中最早的和结束日期中最晚的&#xff0c;回显到下方。 <el-formref"formRef":model"ruleForm":rules"rules"style"margin-top: 20px;"label-position"top">…