OpenTiny NEXT 从入门到精通·第 2 篇

news2026/4/8 6:59:10
OpenTiny NEXT 从入门到精通·第 2 篇组件篇——TinyVue 核心组件库深度实战组件库是前端应用的“乐高积木”。TinyVue 作为 OpenTiny 生态的核心 UI 组件库拥有 130 企业级组件覆盖中后台开发的绝大部分场景。但会用组件只是第一步理解其Renderless 无渲染架构、掌握主题定制、学会封装自定义组件才是从普通使用者到进阶开发者的关键一跃。本篇将带你深度实战 TinyVue解锁它的真正威力。在日常开发中你是否遇到过这些问题同一个项目里既要支持 Vue 2又要支持 Vue 3组件库需要维护两套代码API 还不一致想封装一个业务组件但为了适配不同框架Vue / React要写好几套实现组件样式需要根据品牌色动态切换但传统 CSS 方案改起来非常痛苦TinyVue 的Renderless 架构正是为了解决这些问题而生的。它将组件的逻辑、模板和样式三者分离让核心逻辑与框架解耦一套代码可以同时运行在 Vue 2 / Vue 3 / React 等多个框架中。本篇文章将从以下几个方面展开TinyVue 组件库全景概览与特色组件介绍Renderless 无渲染架构深度解析主题定制与样式系统从零封装一个自定义组件含 Vue 2/3 适配一、TinyVue 组件库概览1.1 130 组件的全景介绍TinyVue 的组件按照功能可以分为以下几大类分类组件示例使用场景基础组件Button、Icon、Link、Typography页面基础元素布局组件Grid、Layout、Divider、Space页面结构搭建表单组件Input、Select、Checkbox、Radio、DatePicker、Upload、Form数据录入与校验数据展示Table、Tree、Pagination、Tag、Badge、Card、Carousel数据列表与详情展示反馈组件Modal、Message、Notification、Popconfirm、Progress用户交互反馈导航组件Menu、Tabs、Breadcrumb、Steps、Dropdown页面导航与路由高阶组件Split、IpAddress、CalendarView、Crop、RichText特殊业务场景每个组件都遵循 OpenTiny Design 设计规范保证视觉一致性和交互体验。1.2 高频组件特性速览Table 表格组件支持固定表头、固定列、多级表头内置虚拟滚动轻松处理 10 万 行数据行内编辑、行拖拽排序、列拖拽调整宽度树形表格、可展开行Tree 树形控件支持懒加载、拖拽节点、复选框自定义节点内容、节点过滤异步加载大数据量时自动启用虚拟滚动Select 选择器支持远程搜索、分组、创建新条目虚拟滚动支持上千条选项不卡顿多选、可清空、可禁用选项Form 表单支持表单校验内置多种校验规则可自定义动态表单项、表单联动支持布局模式inline、block1.3 OpenTiny 特色组件详解除了常规组件TinyVue 还提供了一些业界少见的特色组件这些组件来源于华为内部业务的实际需求经过大量生产验证。Split 面板分隔器可拖拽调整左右或上下两个面板大小的组件常用于后台管理系统的左右布局。template tiny-split v-modelsplitSize modehorizontal template #left左侧面板可拖拽调整/template template #right右侧面板/template /tiny-split /template script setup import { ref } from vue import { TinySplit } from opentiny/vue const splitSize ref(0.3) // 左侧占比 30% /scriptIpAddress IP 地址输入框专门用于 IPv4 地址输入的组件自动分隔四段支持键盘快速跳转。tiny-ip-address v-modelip /CalendarView 日历视图比常规的 DatePicker 更强大的日历组件支持月/周/日视图切换可自定义渲染内容如日程安排。tiny-calendar-view v-modelcurrentDate :eventscalendarEvents /Crop 图片裁切提供可视化裁剪框支持固定比例、自由裁剪输出 base64 或 Blob便于上传。tiny-crop :srcimageUrl :aspectRatio16/9 crophandleCrop /二、Renderless 无渲染架构深度解析2.1 组件与框架分离的设计理念传统组件库的代码组织方式通常是“框架 组件逻辑”强耦合的。以 Vue 组件为例模板template、逻辑script、样式style都写在同一个.vue文件中这种结构直接绑定了 Vue 框架。TinyVue 采用的Renderless 架构则将组件拆分为三个独立层┌─────────────────────────────────────┐ │ 框架适配层 │ │ (Vue2 适配器 / Vue3 适配器 / React适配器) │ ├─────────────────────────────────────┤ │ 无渲染逻辑层 (Renderless) │ │ (状态管理、事件处理、生命周期、API) │ ├─────────────────────────────────────┤ │ 样式层 (Theme) │ │ (CSS Variables / 主题变量) │ └─────────────────────────────────────┘逻辑层Renderless纯 TypeScript 实现包含组件的状态、计算属性、方法、生命周期等完全不依赖任何 UI 框架。这部分代码可以跨框架复用。模板层Template框架特定的模板代码负责将逻辑层的数据和事件绑定到 DOM 上。不同框架有不同的模板语法但调用的都是同一套逻辑层 API。样式层StyleCSS 样式使用 CSS Variables 实现主题变量与框架无关。2.2 一套代码同时支持 Vue 2 和 Vue 3——版本适配器如何抹平差异Vue 2 和 Vue 3 在响应式原理、生命周期、API 等方面存在差异。TinyVue 通过版本适配器Version Adapter来抹平这些差异。适配器核心思路将 Vue 2 的 Options API 和 Vue 3 的 Composition API 封装成统一调用接口。逻辑层代码只调用适配器提供的统一方法如useReactive、useMounted不直接依赖 Vue。适配器根据当前 Vue 版本动态选择底层实现。简化示例Button 组件// renderless/button.ts —— 纯逻辑层无框架依赖exportfunctionuseButton(props,{emit}){consthandleClick(event){if(!props.disabled){emit(click,event);}};return{handleClick};}!-- vue3/Button.vue —— Vue 3 模板层 -- template button :classclasses clickhandleClick slot / /button /template script setup import { useButton } from ../renderless/button const props defineProps([disabled]) const emit defineEmits([click]) const { handleClick } useButton(props, { emit }) /script!-- vue2/Button.vue —— Vue 2 模板层 -- template button :classclasses clickhandleClick slot / /button /template script import { useButton } from ../renderless/button export default { props: [disabled], setup(props, { emit }) { return useButton(props, { emit }) } } /script通过这种方式Button 的核心逻辑useButton只写一次Vue 2 和 Vue 3 的模板各自引用同一份逻辑保证了 API 和行为的完全一致。2.3 一套代码同时支持 PC 和移动端——多端同源的技术实现传统组件库往往分 PC 版和移动版如 Ant Design 和 Ant Design Mobile需要维护两套代码。TinyVue 通过响应式断点 适配器实现了多端同源。实现原理组件内部通过useBreakpoint检测当前屏幕宽度返回pc或mobile。模板层根据端类型渲染不同的 DOM 结构和交互模式如 PC 端是弹窗选择器移动端是底部抽屉。样式层通过媒体查询自动适配不同屏幕。示例DatePicker 组件的多端适配PC 端弹出浮层日历面板鼠标交互。移动端底部弹出滚动选择器触摸优化。开发者只需引入同一个组件无需关心端差异TinyVue 会自动适配。三、主题定制与样式系统3.1 基于 CSS Variables 的动态主题系统TinyVue 的主题系统基于CSS Variables自定义属性构建而不是传统的 SCSS 变量。CSS Variables 的一大优势是运行时动态切换无需重新编译。主题变量定义示例/* 亮色主题 */:root{--ti-button-primary-bg:#1890ff;--ti-button-primary-hover-bg:#40a9ff;--ti-button-primary-active-bg:#096dd9;--ti-button-border-radius:4px;}/* 暗色主题 */[data-themedark]{--ti-button-primary-bg:#1f3a5f;--ti-button-primary-hover-bg:#2a4b7a;--ti-button-primary-active-bg:#0f2a4a;}组件样式使用变量.tiny-button--primary{background-color:var(--ti-button-primary-bg);border-radius:var(--ti-button-border-radius);}.tiny-button--primary:hover{background-color:var(--ti-button-primary-hover-bg);}动态切换主题// 切换到暗色主题document.documentElement.setAttribute(data-theme,dark);// 切回亮色主题document.documentElement.removeAttribute(data-theme);3.2 主题生成器与自定义主题包导出TinyVue 提供了在线主题生成器开发者可以可视化调整颜色、圆角、间距等设计 token实时预览效果最后导出自定义主题 CSS 文件在项目中引入即可。自定义主题包导入importopentiny/vue/theme/index.css// 默认主题import./my-custom-theme.css// 自定义主题覆盖3.3 Shadow DOM 样式隔离机制——微前端场景下的天然优势TinyVue 组件可以选择性地启用Shadow DOM封装。启用后组件的样式会被隔离在 shadow root 内部不会影响外部页面也不会被外部样式污染。这对于微前端场景尤为重要主应用和子应用可能使用不同的 UI 库或主题传统 CSS 容易发生样式冲突。而 TinyVue 的 Shadow DOM 方案从根本上解决了这个问题。启用 Shadow DOMtemplate tiny-button shadow-dom隔离样式/tiny-button /template资深提示Shadow DOM 虽然解决了样式冲突但也会带来一些限制如全局弹窗需要挂载到 body。TinyVue 内部已做了处理Modal、Message 等浮层组件会自动挂载到外部保证功能正常。四、组件开发实战——从零封装一个自定义组件下面我们以一个评分组件Rate为例演示如何基于 TinyVue 的 Renderless 架构开发一个支持 Vue 2 和 Vue 3 的跨框架组件。4.1 理解组件 API 规范与设计模式首先定义组件的 Props 和 Events// types.tsexportinterfaceRateProps{value:number;// 当前评分值max?:number;// 最大分数默认5disabled?:boolean;// 是否禁用allowHalf?:boolean;// 是否允许半星}exportinterfaceRateEmits{(e:change,value:number):void;(e:update:value,value:number):void;}4.2 编写组件逻辑层Renderless 核心// renderless/rate.tsimport{ref,computed}from../adapter// 统一适配器exportfunctionuseRate(props:RateProps,{emit}){constcurrentValueref(props.value);constmaxcomputed(()props.max??5);conststarscomputed((){returnArray.from({length:max.value},(_,i)i1);});constgetStarClass(index:number){conststarValueindex1;constisFullcurrentValue.valuestarValue;constisHalfprops.allowHalfcurrentValue.valuestarValue-1currentValue.valuestarValue;return{full:isFull,half:isHalf,active:isFull||isHalf};};consthandleClick(index:number){if(props.disabled)return;constnewValueindex1;currentValue.valuenewValue;emit(update:value,newValue);emit(change,newValue);};consthandleMouseMove(event:MouseEvent,index:number){if(!props.allowHalf||props.disabled)return;constrect(event.targetasHTMLElement).getBoundingClientRect();consthalfevent.clientX-rect.leftrect.width/2;conststarValueindex(half?0.5:1);currentValue.valuestarValue;};return{stars,currentValue,getStarClass,handleClick,handleMouseMove};}4.3 适配 Vue 2 和 Vue 3 的版本适配层Vue 3 模板vue3/Rate.vuetemplate div classtiny-rate :class{ is-disabled: disabled } span v-for(star, index) in stars :keyindex classtiny-rate__star :classgetStarClass(index) clickhandleClick(index) mousemove(e) handleMouseMove(e, index) i classtiny-icon-star/i /span /div /template script setup langts import { useRate } from ../renderless/rate const props defineProps([value, max, disabled, allowHalf]) const emit defineEmits([change, update:value]) const { stars, getStarClass, handleClick, handleMouseMove } useRate(props, { emit }) /script style scoped /* 样式略使用 CSS Variables */ /styleVue 2 模板vue2/Rate.vuetemplate div classtiny-rate :class{ is-disabled: disabled } span v-for(star, index) in stars :keyindex classtiny-rate__star :classgetStarClass(index) clickhandleClick(index) mousemove(e) handleMouseMove(e, index) i classtiny-icon-star/i /span /div /template script import { useRate } from ../renderless/rate export default { props: [value, max, disabled, allowHalf], setup(props, { emit }) { return useRate(props, { emit }) } } /script4.4 组件文档与示例编写组件开发完成后需要编写使用文档和示例方便团队成员使用。TinyVue 的文档基于 Markdown Vue 组件演示示例代码可直接运行。文档示例# Rate 评分组件 用于快速评级操作。 ## 基础用法 vue tiny-rate v-modelscore /半星支持tiny-rate v-modelscore allow-half /禁用状态tiny-rate v-modelscore disabled /APIProps参数说明类型默认值value当前评分number0max最大分数number5disabled是否禁用booleanfalseallowHalf是否允许半星booleanfalse至此一个完整的跨框架自定义组件就开发完成了。整个过程中核心逻辑只编写了一次Vue 2 和 Vue 3 的适配成本极低。 ## 总结 本篇我们深入剖析了 TinyVue 组件库的核心能力 1. **组件全景**130 组件覆盖中后台全场景特色组件Split、IpAddress、CalendarView 等解决特定业务痛点。 2. **Renderless 架构**逻辑、模板、样式三层分离一套代码同时支持 Vue 2 / Vue 3甚至可扩展至 React。 3. **主题系统**基于 CSS Variables 的运行时主题切换支持 Shadow DOM 样式隔离微前端场景天然友好。 4. **组件开发实战**从 API 设计到逻辑层实现再到 Vue 2/3 适配完整演示了跨框架组件的开发流程。 掌握这些内容你不仅能够熟练使用 TinyVue 开发企业级应用还能根据业务需求扩展自定义组件甚至为 OpenTiny 社区贡献代码。 **下篇预告** 《数据篇——表格、表单与图表的高级应用》将聚焦企业级中后台最核心的数据处理场景带你深度掌握 TinyGrid、TinyForm、TinyChart 组件的高阶用法与性能优化技巧敬请期待 **如果觉得本文对你有帮助欢迎点赞、收藏、评论你的支持是我持续创作的动力**

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2495187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…