You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js中<component :is="comp-name"/>与<div :is="comp-name"/>的区别是什么?

在Vue中使用<component :is>和原生HTML标签:is的区别

嘿,这个问题问得很到位——这两种写法并不是完全相同的,它们在适用场景、底层处理逻辑上都有明显区别,我给你详细拆解下:

1. 适用范围天差地别

  • <component :is>是Vue官方专门为动态组件设计的内置标签,它是渲染自定义Vue组件的唯一正确方式,不管你的组件是全局注册、局部注册,还是异步加载的,它都能完美识别并渲染。比如你要动态切换自己写的<UserCard>和<ProductCard>组件,必须用它。
  • 而像<div :is>这类原生HTML标签搭配:is的写法,只能用来渲染原生HTML元素或者Vue的特定内置组件(比如<keep-alive>、<transition>)。如果用它尝试渲染自定义组件,Vue会把它当成未知的原生HTML标签处理,直接在DOM里输出对应的标签名,完全不会解析成你的组件。

2. 渲染行为完全不同

  • 使用<component :is>时,Vue会严格按照组件的生命周期来处理:组件的created、mounted钩子会正常触发,props传递、事件监听、插槽内容都能正常工作,完全遵循Vue组件的渲染规则。
  • 原生标签加:is的本质还是一个原生HTML元素,只是动态替换了它的标签名。比如你写<div :is="'ul'">,最终DOM里会生成一个<ul>元素,它就是个普通的DOM节点,没有任何Vue组件的特性,不会触发组件生命周期,也没法接收组件props。

3. 内置组件的特殊用法

有些Vue内置组件(比如<keep-alive>、<transition>)不能通过<component :is>来渲染,这时候就需要用原生标签的:is写法,或者直接写对应的内置组件标签。举个例子:

<!-- 正确:用div的is属性渲染keep-alive -->
<div :is="'keep-alive'">
  <component :is="currentComponent"></component>
</div>

<!-- 错误:component标签无法渲染keep-alive -->
<component :is="'keep-alive'"></component>

举个直观的例子

<script setup>
import UserCard from './UserCard.vue'
const currentElement = 'p'
const currentComponent = UserCard
</script>

<template>
  <!-- 正确渲染自定义组件 -->
  <component :is="currentComponent"></component>

  <!-- 正确渲染原生p标签 -->
  <div :is="currentElement">这是一个动态p标签</div>

  <!-- 错误:无法渲染自定义组件,会输出<user-card>原生标签 -->
  <div :is="currentComponent"></div>
</template>

总结一下:如果你要动态切换的是自定义Vue组件,必须用<component :is>;如果只是动态切换原生HTML标签或者特定内置组件,才考虑用原生标签加:is的写法。

内容的提问来源于stack exchange,提问作者tomwang1013

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:38:17