ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ant Design Vue Typography 组件完全指南:标题、正文、链接与复制/编辑/省略交互实战

Ant Design Vue Typography 组件完全指南:标题、正文、链接与复制/编辑/省略交互实战 前端UI组件设计系统【免费下载链接】ant-design-vue An enterprise-class UI components based on Ant Design and Vue. 项目地址https://gitcode.com/gh_mirrors/an/ant-design-vue点击查看免费下载本指南围绕 Ant Design Vue 的 Typography 文本排版组件展开系统讲解Typography容器与Text、Title、Paragraph、Link四个内容子组件的 API 用法并结合仓库源码剖析copyable、editable、ellipsis三大交互能力的底层实现机制。读完本文你将掌握基础文本排版、交互式文本编辑、一键复制与多行省略展开等完整实战方案。组件定位与适用场景Typography 是 Ant Design Vue项目名ant-design-vue位于 components/typography提供的基础文本书写组件族覆盖标题、正文文本、列表段落等常见排版需求。官方文档index.en-US.md给出两个核心适用场景展示场景需要在文章 / 博客 / 笔记中展示标题或段落内容交互场景需要支持可复制copyable、可编辑editable、省略ellipsis的文本。它同时具备两套能力一套是纯展示的排版能力heading、body、list一套是文本即控件的交互能力复制、编辑、展开后者也是本文后半部分结合源码重点展开的内容。组件结构容器 四个内容子组件从源码看Typography 并非单一组件而是由一个容器组件和四个内容组件组合而成。在 components/typography/index.tsx 中可以看到它们被挂载为Typography的静态属性Typography.Text Text; Typography.Title Title; Typography.Paragraph Paragraph; Typography.Link Link; Typography.Base Base;Typography容器默认渲染为article标签见 Typography.tsx负责注入typography前缀样式与 RTL 方向处理所有内容子组件都应放在它内部Typography.Text渲染为span见 Text.tsx用于行内文本Typography.Title渲染为h1~h5见 Title.tsx通过level属性映射Typography.Paragraph渲染为div见 Paragraph.tsx用于段落Typography.Link渲染为a见 Link.tsx支持href、target等原生链接属性。一个值得注意的细节Typography.Link在target_blank且未显式设置rel时会自动补上relnoopener noreferrer见 Link.tsx避免新开标签页的潜在安全风险这符合业界推荐实践。Title对level的取值做了严格校验仅接受1 | 2 | 3 | 4 | 5非法值会触发 warning 并回退到h1见 Title.tsx而Text的ellipsis明确不支持rows、expandable、onExpand传入对象形式会先告警再自动剔除这些字段见 Text.tsxLink的ellipsis则只接受布尔值见 Link.tsx。快速上手基础排版示例以下示例来自仓库演示文件 demo/basic.vue展示了标题、段落、行内强调、代码、键盘键、链接、引用等典型组合template a-typography a-typography-titleIntroduction/a-typography-title a-typography-paragraph In the process of internal desktop applications development, many different design specs and implementations would be involved... /a-typography-paragraph a-typography-title :level2Guidelines and Resources/a-typography-title a-typography-paragraph We supply a series of design principles... ( a-typography-text codeSketch/a-typography-text and a-typography-text codeAxure/a-typography-text) /a-typography-paragraph a-typography-paragraph Press a-typography-text keyboardEsc/a-typography-text to exit... /a-typography-paragraph /a-typography /template行内文本的多种语义样式secondary / success / warning / danger / disabled / mark / code / keyboard / underline / delete / strong可参见 demo/text.vue。这些装饰类属性在底层由 Base.tsx 中的wrapperDecorations统一处理按strong → underline → delete → code → mark → keyboard的顺序将内容逐层包裹进strong、u、del、code、mark、kbd标签从而复用浏览器原生语义与样式这正是装饰属性可自由叠加的实现原理。内容来源content 与 children 的正确选择Typography 支持两种提供文本内容的方式默认插槽children和content属性。源码中的getChildrenText揭示了二者的分工见 Base.tsx未启用ellipsis/editable时优先读取 children 渲染启用ellipsis或editable时必须使用content组件会通过v-model:content实现双向绑定。源码里对此有显式告警见 Base.tsx当props.content undefined却同时启用了editable或ellipsis时控制台会提示 Wheneditableis enabled, please usecontentinstead of children。原因很直接省略号计算与编辑框需要拿到纯字符串才能测量、回填而插槽内容可能是任意 VNode无法可靠提取。因此推荐用法是a-typography-paragraph v-model:contentmyText editable / a-typography-paragraph v-model:contentmyText :ellipsis{ rows: 2 } /使用content时编辑提交的新值会通过update:content事件回写从而支持v-model:content双向绑定。copyable一键复制的完整配置copyable接受布尔值或对象。对象形式的能力定义CopyConfig来自源码接口见 Base.tsx属性说明类型默认值text要复制的文本string-tooltip是否展示提示气泡booleantrueonCopy复制成功后的回调function-交互细节可从 Base.tsx 的onCopyClick中确认若未提供text则自动提取当前渲染文本getChildrenText()作为复制内容调用剪贴板工具copy()复制同时将图标切换为CheckOutlined、文案切换为 Copied3 秒后自动恢复原始图标与文案内部setTimeout(..., 3000)控制copied状态onCopy回调在复制成功后触发。实际使用示例来自 demo/interactive.vuea-typography-paragraph copyableThis is a copyable text./a-typography-paragraph a-typography-paragraph :copyable{ text: Hello, Ant Design! } Replace copy text. /a-typography-paragraph a-typography-paragraph :copyable{ tooltip: false }Hide Copy tooltips./a-typography-paragrapheditable行内编辑的完整配置editable同样接受布尔值或对象。对象形式的配置EditConfig见 Base.tsx属性说明类型默认值editing是否处于编辑状态booleanfalsetooltip是否展示编辑图标的气泡提示booleantrueonStart进入编辑状态时触发function-onChange输入过程中触发function(string)-onCancel按 ESC 退出编辑时触发function-onEnd按 ENTER 退出编辑时触发function-maxlength编辑框的最大输入长度number-autoSizetextarea 的 autoSize 属性boolean | { minRows, maxRows }-triggerType触发编辑的方式icon / text / 两者Arrayicon|text[icon]编辑交互的键盘处理在 Editable.tsx 中实现几个关键行为值得注意Enter 确认按下 Enter 触发save内容会先trim()去除首尾空白并触发onEndEsc 取消按下 Esc 将内容还原为进入编辑前的原始内容originContent并触发onCancel失焦确认blur时同样执行保存confirmChange符合常规表单直觉IME 输入法保护通过onCompositionstart/onCompositionend跟踪组合输入状态组合期间不记录按键避免中文输入法选词时误触 Enter/Esc 逻辑见 Editable.tsx换行剔除onChange中会将\r\n替换为空见 Editable.tsx保证单行文本语义编辑框挂载后自动聚焦并将光标置于文本末尾见 Editable.tsx。triggerType是编辑触发的关键开关默认[icon]只在右侧显示编辑图标设为[text]时隐藏图标、点击文本本身即进入编辑[icon, text]则两者皆可。源码中onClick绑定逻辑见 Base.tsx。组合示例来自 demo/interactive.vue!-- 基础编辑v-model:content 双向绑定 -- a-typography-paragraph v-model:contenteditableStr editable / !-- 限制长度与自适应高度 -- a-typography-paragraph v-model:contentlengthLimitedStr :editable{ maxlength: 50, autoSize: { maxRows: 5, minRows: 3 } } / !-- 隐藏编辑气泡提示 -- a-typography-paragraph v-model:contenthideTooltipStr :editable{ tooltip: false } / !-- 点击文本即进入编辑 -- a-typography-paragraph v-model:contentclickTriggerStr :editable{ triggerType: [text] } /ellipsis单行 / 多行省略与展开ellipsis接受布尔值或对象。对象形式EllipsisConfig见 Base.tsx属性说明类型默认值rows内容最大显示行数number-expandable是否可展开boolean-suffix省略内容的尾部后缀string-symbol自定义展开按钮文案stringExpandtooltip省略时展示提示气泡boolean | string-onExpand展开内容时触发function(event)-onEllipsis进入 / 离开省略状态时触发function(ellipsis)-省略的实现是本文最值得深挖的部分——它是一套CSS 优先、JS 兜底的双轨机制核心逻辑在 Base.tsxCSS 路径性能优先canUseCSSEllipsis判断能否直接走 CSS单行rows 1依赖text-overflow: ellipsis多行依赖-webkit-line-clamp但一旦同时启用suffix、tooltip、editable、copyable、expandable、onEllipsis中的任一能力就退回 JS 测量——因为这些场景需要在省略处插入额外 DOM按钮、气泡、后缀纯 CSS 无法表达。JS 路径测量兜底util.tsx 中实现了一套完整的文本测量算法计算真实行高getRealLineHeight乘rows得到最大高度阈值创建隐藏的测量容器克隆原元素样式position: fixed; top: -999999px见 util.tsx将完整文本 操作按钮渲染进去若高度未超限则无需省略否则用二分查找measureText见 util.tsx逐步截断文本找到放进容器后刚好不超高的最大前缀再拼接...省略号测量过程中通过ResizeObserver见 Base.tsx监听尺寸变化容器尺寸改变时自动重新测量测量结果变化时会触发onEllipsis回调通知外部当前是否处于省略状态。使用示例来自 demo/ellipsis.vue!-- 单行省略 气泡提示Text 不支持 rows需配合宽度约束 -- a-typography-text :styleellipsis ? { width: 100px } : {} :ellipsisellipsis ? { tooltip: I am ellipsis now! } : false contentAnt Design, a design language for background applications... / !-- 多行省略 展开按钮 自定义展开文案 -- a-typography-paragraph :ellipsisellipsis ? { rows: 2, expandable: true, symbol: more } : false contentAnt Design, a design language for background applications... /插槽slots全面自定义交互元素copyable、editable、ellipsis三者的视觉元素均可通过插槽深度定制。slots的完整定义见官方文档 index.en-US.md汇总如下插槽名说明作用域参数默认内容copyableIcon自定义复制图标{ copied: boolean }copied ? CheckOutlined / : CopyOutlined /copyableTooltip自定义复制气泡文案{ copied: boolean }copied ? Copied : CopyeditableEnterIcon自定义编辑框内的确认图标{ className: string }EnterOutlined /editableIcon自定义编辑触发图标-EditOutlined /editableTooltip自定义编辑气泡文案-EditellipsisSymbol自定义省略号说明文案--ellipsisTooltip省略状态下的气泡内容--其中copyableIcon/copyableTooltip会收到{ copied }作用域参数见 Base.tsxeditableEnterIcon会收到{ className }用于把自定义图标对齐到编辑框的确认按钮位置见 Editable.tsxellipsisSymbol用于替换展开按钮文案见 Base.tsx。插槽里若渲染null即可隐藏对应元素例如隐藏编辑确认图标。组合示例来自 demo/interactive.vue!-- 自定义复制图标与文案随 copied 状态切换 -- a-typography-paragraph copyable contentCustom Copy icon and replace tooltips text. template #copyableIcon{ copied } SmileOutlined v-if!copied / SmileFilled v-else / /template template #copyableTooltip{ copied } span v-if!copiedclick here/span span v-elseyou clicked!!/span /template /a-typography-paragraph !-- 自定义编辑触发图标与确认图标 -- a-typography-paragraph v-model:contentcustomIconStr editable template #editableIconHighlightOutlined //template template #editableTooltipclick to edit text/template template #editableEnterIcon{ className } CheckOutlined :classclassName / /template /a-typography-paragraphAPI 总表Typography.Text渲染为spanellipsis仅支持布尔或{ tooltip }形式。属性说明类型默认值code代码样式booleanfalsecontent(v-model)使用 ellipsis 或 editable 时用 content 替代 childrenstring-copyable是否可复制可传对象自定义boolean | copyablefalsedelete删除线样式booleanfalsedisabled禁用内容booleanfalseeditable是否可编辑可传对象控制编辑状态boolean | editablefalseellipsis文本溢出时显示省略号booleanfalsekeyboard键盘样式booleanfalsemark标记样式booleanfalsestrong加粗样式booleanfalsetype内容类型secondary|success|warning|danger-underline下划线样式booleanfalseTypography.Title渲染为h1~h5。属性说明类型默认值code代码样式booleanfalsecontent(v-model)使用 ellipsis 或 editable 时用 content 替代 childrenstring-copyable是否可复制可传对象自定义boolean | copyablefalsedelete删除线样式booleanfalsedisabled禁用内容booleanfalseeditable是否可编辑可传对象控制编辑状态boolean | editablefalseellipsis溢出省略可传对象配置 rows 与 expandableboolean | ellipsisfalselevel内容层级对应 h1~h5number: 1, 2, 3, 4, 51mark标记样式booleanfalsetype内容类型secondary|success|warning|danger-underline下划线样式booleanfalseTypography.Paragraph渲染为div。属性说明类型默认值code代码样式booleanfalsecontent(v-model)使用 ellipsis 或 editable 时用 content 替代 childrenstring-copyable是否可复制可传对象自定义boolean | copyablefalsedelete删除线样式booleanfalsedisabled禁用内容booleanfalseeditable是否可编辑可传对象控制编辑状态boolean | editablefalseellipsis溢出省略可传对象配置 rows 与 expandableboolean | ellipsisfalsemark标记样式booleanfalsestrong加粗样式booleanfalsetype内容类型secondary|success|warning|danger-underline下划线样式booleanfalsecopyable 对象配置{ text: string, onCopy: function(event), tooltip: false }属性说明类型默认值text要复制的文本string-tooltip是否显示提示气泡booleantrueonCopy复制完成后的回调function-editable 对象配置{ tooltip: boolean, editing: boolean, maxlength: number, autoSize: boolean | { minRows, maxRows }, onStart: function, onChange: function(string), onCancel: function, onEnd: function, triggerType: (icon | text)[] }属性说明类型默认值autoSizetextarea 的 autoSize 属性boolean | { minRows, maxRows }-editing是否处于编辑状态booleanfalsemaxlengthtextarea 的最大长度number-tooltip是否显示提示气泡booleantruetriggerType编辑触发方式icon、text 或两者不包含 icon 时隐藏图标Arrayicon|text[icon]onCancel按 ESC 退出编辑时触发function-onChange输入过程中触发function(event)-onEnd按 ENTER 退出编辑时触发function-onStart进入编辑状态时触发function-ellipsis 对象配置{ rows: number, expandable: boolean, suffix: string, symbol: string, tooltip: boolean | string, onExpand: function(event), onEllipsis: function(ellipsis) }属性说明类型默认值expandable是否可展开boolean-rows内容最大行数number-suffix省略内容的后缀string-symbol自定义省略/展开说明文案stringExpandtooltip省略时展示提示气泡boolean | string-onEllipsis进入或离开省略状态时触发function(ellipsis)-onExpand展开内容时触发function(event)-小结Ant Design Vue 的 Typography 是展示与交互兼备的文本组件族Text/Title/Paragraph/Link四个子组件通过Base共享同一套装饰、复制、编辑与省略能力。其底层实现有几个值得借鉴的设计——用原生语义标签strong/u/del/code/mark/kbd承载装饰样式用contentv-model解决交互场景下的纯文本取值问题省略号采用 CSS 优先、隐藏容器二分查找测量兜底的双轨策略编辑框则对 Enter/Esc/失焦/输入法组合输入做了完整的状态机处理。在文章、博客、笔记类页面以及需要可复制、可编辑、可展开的富文本场景中它都能直接落地。相关源码与示例可进一步查阅 components/typography 目录下的 Base.tsx、Editable.tsx、util.tsx 及 demo 下的全部演示文件。赞分享前端UI组件设计系统【免费下载链接】ant-design-vue An enterprise-class UI components based on Ant Design and Vue. 项目地址https://gitcode.com/gh_mirrors/an/ant-design-vue点击查看免费下载相关推荐Negative Captcha的局限性为什么现代浏览器让它失效Negative Captcha的局限性为什么现代浏览器让它失效 Negative Captcha是一种针对Rails应用设计的反垃圾评论插件旨在通过隐藏前端UI组件设计系统Ant Design Upload 组件实战指南文件上传、拖拽交互与上传列表完全控制Ant Design Upload 组件实战指南文件上传、拖拽交互与上传列表完全控制 本指南以 ant design 仓库中的 Upload 组件文档 httUI组件前端设计系统Ant Design Typography 的 copyable 复制交互从 Demo 到源码的完整实现解析Ant Design Typography 的 copyable 复制交互从 Demo 到源码的完整实现解析 Ant Designantd的 Typogr前端UI组件设计系统上一篇如何实现完美的无障碍设计Penpot完整指南下一篇GitHub_Trending/aw/awesome-remote-job零信任架构全面安全防护体系创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表