el-button源码解读1——为什么组件最外层套的是Vue内置组件Component

为什么组件最外层套的是Vue内置组件Component

在 Vue 里, 是一个内置组件,配合 :is 属性,可以动态决定真正渲染成什么标签/组件。

js 复制代码
<component :is="tag" ...>

等价于:"我现在先不知道要用什么标签,等运行时根据 tag 的值来决定"。

看 use-button.ts 里 _props 的逻辑: 这说明 Button 组件有一个 tag 的 prop(定义在 button.ts 里),常见用法:

  • 默认 tag = 'button' → 渲染成原生 ,带上 disabled、type 等属性。
  • 你也可以改成 tag="a" 或别的标签,比如用来做伪按钮的链接,这时候就不会再给你加 disabled 那些原生 button 属性。

如果不用 ,而是死写成 ,那就没法通过 prop 改变最外层标签类型了,组件的可扩展性会变差。

button.ts 里 tag 这个 prop 是怎么定义的?

tag 是 Button 组件的一个 prop,用来指定"最外层要渲染成哪个标签/组件", 默认值button

结合刚才看到的模板:

js 复制代码
<component
    :is="tag"
    ref="_ref"
    v-bind="_props"
    :class="buttonKls"
    :style="buttonStyle"
    @click="handleClick"
  >
</component>    
  • 当你写 → tag 是字符串 'a' → 渲染成 ...
  • 如果有高级用法,传入一个组件对象,也可以用 Button 的样式包一层别的组件

总结一下"从 prop 到渲染"的链路

  1. button.ts 定义 tag prop,默认 'button'
  2. const props = defineProps(buttonProps) → 得到 props.tag。
  3. useButton(props, emit) 里,用 props.tag 决定 _props(如果是 'button' 就加上 disabled、type 等)。
  4. 模板里 根据 tag 真实渲染成对应标签。
相关推荐
vx_bscxy3221 小时前
告别毕设焦虑!Python 爬虫 + Java 系统 + 数据大屏,含详细开发文档 基于web的图书管理系统74010 (上万套实战教程,赠送源码)
java·前端·课程设计
北极糊的狐1 小时前
Vue3 子组件修改父组件传递的对象并同步的方法汇总
前端·javascript·vue.js
spionbo1 小时前
Vue3 前端分页功能实现的技术方案及应用实例解析
前端
AI绘画小331 小时前
Web 安全核心真相:别太相信任何人!40 个漏洞挖掘实战清单,直接套用!
前端·数据库·测试工具·安全·web安全·网络安全·黑客
7***n752 小时前
前端设计模式详解
前端·设计模式·状态模式
用户47949283569152 小时前
Vite 中 SVG 404 的幕后黑手:你真的懂静态资源处理吗?
前端·vite
未来之窗软件服务2 小时前
幽冥大陆(三十五)S18酒店门锁SDK go语言——东方仙盟筑基期
java·前端·golang·智能门锁·仙盟创梦ide·东方仙盟·东方仙盟sdk
卸任2 小时前
解密Flex布局:为什么flex:1仍会导致内容溢出
前端·css·flexbox
前端一课2 小时前
第 28 题:async / await 的原理是什么?为什么说它是 Promise 的语法糖?(详细版)
前端·面试