vue3中动态组件的踩坑记录分享

 更新时间:2024年12月11日 10:39:06   作者:本末倒置183  
这篇文章主要为大家详细分享一下vue3中动态组件遇到的问题,分别是动态组件绑定问题和动态组件的方法导出问题,有需要的小伙伴可以参考一下

1.动态组件绑定问题

上周用vue3的动态组件替换了v-fo循环的页面,在实际中遇到了一个头疼的问题。组件单独写是可以出来,但使用动态组件却提示组件未注册

组件未注册

<template>
 
  <div>
    <div class="top text-center">
      <el-radio-group v-model="currentMode" size="medium">
        <el-radio-button v-for="(item, i) in menuList" :key="item.value" :label="item.value">
          {{ item.label }}
        </el-radio-button>
      </el-radio-group>
    </div>
    <component :is="currentMode"></component>
  </div>
</template>
​
<script setup>
import Plan1 from './plan1.vue';
import Plan2 from './plan2.vue';
import Plan3 from './plan3.vue';
​
​
import { ref } from 'vue';
const menuList = [
  { label: 'Plan1', value: 'Plan1' },
  { label: 'Plan2', value: 'Plan2' },
  { label: 'Plan3', value: 'Plan3' },
];
const currentMode = ref(menuList[0].value);
</script>
​
<style lang="scss" scoped></style>

报错信息

vue 3 Unknown custom element: - did you register the component correctly? For recursive components, make sure to provide the "name" option.

我以为是setup 写法 name丢失的问题

在百度上看到最多的还是将“name”属性默认导出,尝试了也无济于事。

就去仔细,查了下vue文档

官方建议使用三元表达式来实现动态组件:is="someCondition ? Foo : Bar"

解决方案

更具这个思路,那就很好处理了,只要将currentMode的值设置为elevator、airCond不就好了,搞个键值对映射就可以搞定了

function getComponent() {
  const component = {
    Plan1: Plan1,
    Plan2: Plan2,
    Plan3: Plan3,
  };
  return component[loadCountFlag.value];
}

最后将 getComponent()赋值给动态组件,刷新页面查看控制台,页面无报错

如果你的动态组件过多,可以使用defineAsyncComponent来实现组件懒加载,类似vue2中箭头函数的写法Plan1: () =>import('./Plan1.vue'),

<template>
  <component :is="getComponent()" />
</template>
​
<script setup>
import { ref, defineAsyncComponent } from 'vue';
​
// Assuming loadCountFlag is a reactive reference
const loadCountFlag = ref(1);
​
// Lazy-load components
const Plan1 = defineAsyncComponent(() => import('./components/Plan1.vue'));
const Plan2 = defineAsyncComponent(() => import('./components/Plan2.vue'));
const Plan3 = defineAsyncComponent(() => import('./components/Plan3.vue'));
​
function getComponent() {
  const componentMap = {
    1: Plan1,
    2: Plan2,
    3: Plan3,
  };
  return componentMap[loadCountFlag.value];
}
</script>

2.动态组件的方法导出问题

动态组件解决了,之前每个组件还有一个数据保存的方法,需要在父页面自动调用,并暴漏出去

于是这就很简单吗,直接使用vue2中this.$refs.xxx.xxx不就好了

正当我高高兴兴提交完代码准备下班时,测试的同事把我叫住了说自动保存没触发,数据丢失了

问了了GPT:

打开vue工具,组件切换检查了下,发现确实在变

于是我尝试着打印currentComponent.value?.saveData方法,控制台出现了。但是上层打印的确实undefind

组件切换的时候,autoSave应该动态切换,autoSave应该时响应式的,那么问题就解决了

解决办法:

使用computed包裹一层

问题解决,下班!

到此这篇关于vue3中动态组件的踩坑记录分享的文章就介绍到这了,更多相关vue3动态组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue-vuex中使用commit提交mutation来修改state的方法详解

    vue-vuex中使用commit提交mutation来修改state的方法详解

    今天小编就为大家分享一篇vue-vuex中使用commit提交mutation来修改state的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue页面params传值的坑及解决

    vue页面params传值的坑及解决

    这篇文章主要介绍了vue页面params传值的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • electron-vue利用webpack打包实现多页面的入口文件问题

    electron-vue利用webpack打包实现多页面的入口文件问题

    项目需要在electron的项目中新打开一个窗口,利用webpack作为静态资源打包器,发现在webpack中可以设置多页面的入口,今天来讲一下我在electron中利用webpack建立多页面入口的踩坑经验,需要的朋友可以参考下
    2019-05-05
  • vue中this.$parent的使用方式

    vue中this.$parent的使用方式

    这篇文章主要介绍了vue中this.$parent的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • vue.config.js中配置configureWebpack和chainWebpack以及一些常用的配置

    vue.config.js中配置configureWebpack和chainWebpack以及一些常用的配置

    configureWebpack和chainWebpack都是Vue CLI中用于修改Webpack配置的工具,configureWebpack可以通过对象或函数修改配置,简单直接;chainWebpack则使用WebpackChainAPI,适合复杂配置,两者可以结合使用,以达到更精细的配置需求,帮助开发者优化项目构建
    2024-10-10
  • Vue项目导入导出文件功能以及导出文件后乱码问题及解决

    Vue项目导入导出文件功能以及导出文件后乱码问题及解决

    这篇文章主要介绍了Vue项目导入导出文件功能以及导出文件后乱码问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Vue源码学习之数据初始化

    Vue源码学习之数据初始化

    这篇文章主要为大家介绍了Vue源码学习之数据初始化实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 在 Vue 中使用 JSX 及使用它的原因浅析

    在 Vue 中使用 JSX 及使用它的原因浅析

    这篇文章主要介绍了在 Vue 中使用 JSX 及使用它的原因浅析,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Vue文件配置全局变量的实例

    Vue文件配置全局变量的实例

    今天小编就为大家分享一篇Vue文件配置全局变量的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue+Element ui实现树形控件右键菜单

    Vue+Element ui实现树形控件右键菜单

    这篇文章主要为大家详细介绍了Vue+Element ui实现树形控件右键菜单,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07

最新评论