完全指南:tag 关键字、局部组件、全局 Web Component 与命名元素)
编程语言编译器语言运行时【免费下载链接】imba The friendly full-stack language项目地址https://gitcode.com/gh_mirrors/im/imba点击查看免费下载导读本文聚焦 Imba 语言中组件Components的完整用法如何用tag关键字定义带有样式、状态、事件与子元素的可复用组件如何通过命名大小写区分局部组件与全局 Web Component以及如何用node$reference语法捕获组件内部的命名元素。阅读完本文后你将掌握 Imba 组件从声明、导出、注册到挂载的完整流程并能直接照搬示例构建自己的可复用 UI 组件。组件是 Imba 全栈开发的核心抽象它是带有功能functionality和子元素children的可复用元素。与许多框架的组件不同Imba 的组件与普通类regular class几乎完全一致——声明属性、方法、getter、setter 全部复用相同的类语法没有任何割裂的模板语言。用tag关键字声明组件创建组件的唯一入口是关键字tag后跟组件名tag Box css pos:relative d:flex ja:center rd:md bg:hue3 c:gray9/70 w:24 h:10 m:1 px:4 fs:sm cursor:grab x 0 y 0 self[x:{x}px y:{y}px] touch.moved.sync(self) slot box这个例子展示了组件内部同时容纳的几类成员它们全部写在tag Box的缩进体内成员类型写法作用CSS 样式css pos:relative d:flex ja:center及其嵌套子规则以 Imba 内联样式语法声明组件外观支持伪类、嵌套与主题色如bg:hue3实例字段x 0、y 0组件自身的状态变量可直接用于渲染表达式根元素self[...]self表示组件根元素方括号内可绑定动态属性x:{x}px y:{y}px与事件touch.moved.sync(self)插槽slot渲染外部传入的子内容默认文案为box注意这里使用了touch.moved.sync(self)事件修饰符链——moved是 Imba 内置的拖拽类自定义事件.sync修饰符会在每次移动时同步更新组件状态即示例中的x、y坐标这正是带有功能的元素的直观体现。关于事件修饰符的完整列表可参考 事件修饰符文档 与 事件文档。定义好组件后在任何地方用尖括号字面量实例化即可属性的传入方式与普通元素一致tag app self[inset:0 d:hcc] Box[hue:blue] One Box[hue:sky] Two Box[hue:indigo] Three Box[hue:purple] Four imba.mount appapp被imba.mount挂载到页面其内部渲染四个Box组件各自接收不同的hue属性。缩进是 Imba 的语法核心标签永不显式闭合子元素通过缩进嵌套这一规则对组件同样适用。关于元素构造与缩进渲染的更多细节可阅读 标签与元素文档。从编译器的角度看tag是 Imba 语法的保留关键字见 编译器常量定义组件标签在编译期会被解析为类声明并最终映射为真实的 DOM 元素构造函数。局部组件Local Components首字母大写如果组件名以大写字母开头它就被定义为局部组件local component。export tag Box self ...局部组件的行为与 Web Component 完全一致但有两个关键约束不会注册到全局——它不会出现在customElements注册表中必须显式导出与导入——export tag Box之后其他文件需要import才能使用。这种模式适合组织大型项目每个文件定义自己的内部组件如列表项、表单控件只把真正需要跨文件复用的组件导出。它避免了全局命名空间的污染也让依赖关系在 import 语句中清晰可见。全局组件Global Components首字母小写如果组件名以小写字母开头它会被直接编译为原生 Web ComponentNative Web Component。这类组件注册在全局customElements注册表中只要该文件被 import 过一次项目任意位置都可以直接使用tag app-box self ...这里有两个必须遵守的规则全局组件名必须包含连字符dash——这是自定义元素的强制要求也是其原生性的体现惯用前缀app-——项目内的全局组件几乎都以app-开头避免与其他组件或原生标签冲突。这一行为有明确的源码支撑。在运行时核心 dom/core.web.imba 中defineTag会执行window.customElements.define(componentName, klass) # 无 extends 时直接注册 window.customElements.define(componentName, klass, {extends: ...}) # 有 extends 时注册为定制内置元素其中componentName由组件名决定如果名字中不含-会自动追加-tag后缀name.indexOf(-) -1分支这正是编译器保证全局组件必含连字符的实现机制。与此同时编译器节点在生成 DOM 节点名时也会对类名做dasherize短横线化处理见 nodes.mjs 的 toNodeName 实现。实战中app-前缀的全局组件在仓库示例里随处可见例如 时钟示例 中定义了tag app-clock随后在同一文件内以app-clock titleNew York utc-5的方式挂载了四个不同时区的时钟实例属性、字段、生命周期方法mount/unmount与渲染方法render全部封装在组件体内。命名元素Named Elementsnode$reference在组件内部经常需要保留对某些子元素的引用以便后续读取或操作。Imba 提供了node$reference语法在标签名与$之后写一个引用名该子元素就会以该名字暴露出来。import util/styles # --- tag app-panel self.group button click($name.value Hi) Write input$name typetext # --- imba.mount app-panel上述代码的关键点input$name创建了一个名为$name的命名元素在app-panel组件内部$name处处可用——例如按钮的click处理器直接读写$name.value实现点击按钮往输入框追加文本的效果无需任何querySelector或模板 ref在组件外部$name同样可用且作为组件的属性暴露——即appPanel.$name可以直接从外部访问方便父组件驱动子组件的内部元素。命名元素把查找子节点从命令式 DOM 操作变成声明式绑定与 Imba 整体的数据绑定哲学一致。$在 Imba 中同时承担实例变量等职责而命名元素让$具备组件内可见引用的语义二者共同构成了 Imba 简洁的引用体系。组合与复用插槽、事件与数据绑定组件之所以可复用在于它能通过slot接收外部内容通过属性接收外部数据并通过事件与外部通信。将三者结合即可写出与原生元素体验无异的组件 APItag app-counter css d:flex ai:center gap:2 count 0 self button click(count--) - span count button click(count) tag app self[inset:0 d:hcc] app-countercount 0是组件状态直接在渲染树中插值span countclick事件处理器与普通元素完全相同因为组件与元素共享同一套语法若要让子内容可定制在渲染树中放入slot即可外部传入的内容会被插槽接收见前文Box示例中的slot box。需要说明的是slot的底层实现位于 DOM 运行时 core.imba含__slots槽位登记与文本插槽渲染逻辑组件元素的 class 管理等行为也由该运行时统一处理。小结Imba 的组件体系可以概括为一张决策表声明方式命名规则注册范围使用方式tag Box局部首字母大写不注册全局需export 显式importtag app-box全局首字母小写且必含-全局 Web Component文件被 import 一次后随处可用input$name任意合法标识符组件作用域内可见组件内外均以$name引用核心要点组件 类 渲染树 样式 事件 插槽命名大小写决定注册策略$引用打通组件内部与外部的元素访问。更多延伸主题元素构造、类与样式绑定、控制流渲染、Fragment可在 标签与元素文档、样式文档 与 事件文档 中继续深入。赞分享编程语言编译器语言运行时【免费下载链接】imba The friendly full-stack language项目地址https://gitcode.com/gh_mirrors/im/imba点击查看免费下载相关推荐FTXUI 组件component模块完全指南从交互组件、装饰器到容器布局FTXUI 组件component模块完全指南从交互组件、装饰器到容器布局 ftxui::component 模块是 FTXUIC FunctionUI组件Imba 标签与组件系统完全指南从自定义元素到生命周期与调度渲染Imba 标签与组件系统完全指南从自定义元素到生命周期与调度渲染 本文是 Imba 全栈语言组件体系的实战指南核心讲解 tag 声明式组件基于 Web C编程语言编译器语言运行时vue-i18n 组件级本地化Component-based Localization完全指南局部 messages、sharedMessages 与回退机制vue i18n 组件级本地化Component based Localization完全指南局部 messages、sharedMessages 与回退前端国际化上一篇QuickBMS的C Structs语法与WinHex模板兼容二进制格式逆向解析快速通道下一篇TextBlob 版本发布流程全解析从版本号提升到 PyPI 自动发布创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考