vue3 动态组件 实例的说明,及相关的代码的优化

1、实现这样的效果

2、实现代码

App.vue

复制代码
<script setup>
import Home from './Home.vue'
import Posts from './Posts.vue'
import Archive from './Archive.vue'
import { ref } from 'vue'
 
const currentTab = ref('Home')

const tabs = {
  Home,
  Posts,
  Archive
}
</script>

<template>
  <div class="demo">
    <button
       v-for="(_, tab) in tabs"
       :key="tab"
       :class="['tab-button', { active: currentTab === tab }]"
       @click="currentTab = tab"
     >
      {{ tab }}
    </button>
	  <component :is="tabs[currentTab]" class="tab"></component>
  </div>
</template>

<style>
.demo {
  font-family: sans-serif;
  border: 1px solid #eee;
  border-radius: 2px;
  padding: 20px 30px;
  margin-top: 1em;
  margin-bottom: 40px;
  user-select: none;
  overflow-x: auto;
}

.tab-button {
  padding: 6px 10px;
  border-top-left-radius: 3px;
  border-top-right-radius: 3px;
  border: 1px solid #ccc;
  cursor: pointer;
  background: #f0f0f0;
  margin-bottom: -1px;
  margin-right: -1px;
}
.tab-button:hover {
  background: #e0e0e0;
}
.tab-button.active {
  background: #e0e0e0;
}
.tab {
  border: 1px solid #ccc;
  padding: 10px;
}
</style>

3、实现代码说明

复制代码
<div class="demo">
    <button
       v-for="(_, tab) in tabs"
       :key="tab"
       :class="['tab-button', { active: currentTab === tab }]"
       @click="currentTab = tab"
     >
      {{ tab }}
    </button>
	  <component :is="tabs[currentTab]" class="tab"></component>
  </div>

4、运行代码

元素隐式具有 "any" 类型,因为类型为 "string" 的表达式不能用于索引类型 "{ Home: DefineComponent<{}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, ToResolvedProps<{}, {}>, ... 8 more ..., any>; Posts: DefineComponent<...>; Archive: DefineComponent<...>; }

这个意思是要限制tabs的取值,只能取值三个里面的一个。

5、修改代码

加个类型限制,这样上面的warning就会消失了。

6、问题说明

为什么tabs[currentTab]是用数组[]的形式引用,不用对象{}引用,因为tabs其实是一个对象,并不是数组的形式,那么为什么呢?这里说明下

这里面为什么要用数组不用对象的形式,因为访问有二种方法:

1)静态: obj.key

  1. 动态:obj['key']

7、官方文档

组件基础 | Vue.js

有兴趣自己尝试下。

相关推荐
qq. 28040339845 小时前
CSS层叠顺序
前端·css
喝拿铁写前端5 小时前
SmartField AI:让每个字段都找到归属!
前端·算法
猫猫不是喵喵.5 小时前
vue 路由
前端·javascript·vue.js
烛阴6 小时前
JavaScript Import/Export:告别混乱,拥抱模块化!
前端·javascript
bin91536 小时前
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例12,TableView16_12 拖拽动画示例
前端·javascript·vue.js·ecmascript·deepseek
GISer_Jing6 小时前
[Html]overflow: auto 失效原因,flex 1却未设置min-height &overflow的几个属性以及应用场景
前端·html
程序员黄同学7 小时前
解释 Webpack 中的模块打包机制,如何配置 Webpack 进行项目构建?
前端·webpack·node.js
拉不动的猪7 小时前
vue自定义“权限控制”指令
前端·javascript·vue.js
再学一点就睡7 小时前
浏览器页面渲染机制深度解析:从构建 DOM 到 transform 高效渲染的底层逻辑
前端·css
拉不动的猪7 小时前
刷刷题48 (setState常规问答)
前端·react.js·面试