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

有兴趣自己尝试下。

相关推荐
JIngJaneIL7 分钟前
智慧物业|物业管理|基于SprinBoot+vue的智慧物业管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·论文·智慧物业管理系统
爬坑的小白10 分钟前
vue 2.0 路由跳转时新开tab
前端·javascript·vue.js
爬坑的小白10 分钟前
vue x 状态管理
前端·javascript·vue.js
凌览25 分钟前
一键去水印|5 款免费小红书解析工具推荐
前端·javascript·后端
有意义25 分钟前
栈数据结构全解析:从实现原理到 LeetCode 实战
javascript·算法·编程语言
lichong95129 分钟前
鸿蒙 web组件开发
前端·typescript
1024小神30 分钟前
在html中使用js动态交换两个元素的位置
前端
鹿鹿鹿鹿isNotDefined31 分钟前
逐步手写,实现符合 Promise A+ 规范的 Promise
前端·javascript·算法
一千柯橘31 分钟前
Electron - IPC 解决主进程和渲染进程之间的通信
前端
申阳31 分钟前
Day 16:02. 基于 Tauri 2.0 开发后台管理系统-项目初始化配置
前端·后端·程序员