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、问题说明

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

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

1)静态: obj.key

  1. 动态:obj'key'

7、官方文档

组件基础 | Vue.js

有兴趣自己尝试下。

相关推荐
大家的林语冰4 分钟前
Rust 再次打败 Go,Astro 7 首发,什么叫“万物皆可锈化“!
前端·javascript·性能优化
lichenyang4535 分钟前
H5 如何调用 ArkTS:JavaScriptProxy、requestId 和 Promise 回调
前端
lichenyang4536 分钟前
我在 HarmonyOS 上写了一个轻量级小程序运行时:从 Web 容器到 JSBridge
前端
雪隐7 分钟前
用Flutter做背单词APP-02我画了设计稿,然后让AI帮我设计了数据库(顺便聊了会天)
前端·人工智能·后端
lichenyang4537 分钟前
不要把 JSBridge 写成 if else:Dispatcher、Registry 和 Biz/Imp 分层
前端
前端甜糖7 分钟前
前端如何实现在线预览office常见文件功能?
前端·vue.js
北鸟南游7 分钟前
学习-claude code 工程化实战的笔记
前端·ai编程·claude
Kyrie6787 分钟前
TypeScript 7.0 正式发布
前端
lichenyang4539 分钟前
JSBridge 不是发消息就完了:runJavaScript、Timeout 和 Callback Lost
前端
xiaofeichaichai13 分钟前
Vite配置实战
前端