」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使無頭組件易於設計

使無頭組件易於設計

發佈於2024-08-26
瀏覽:428

Making headless components easy to style

无头组件只是一个无样式组件,还是还有更多内容?

网络已经通过要求定义样式将样式与内容分开
在 CSS 中而不是 HTML 中。这种架构允许每个网页都采用全局的
设计标准,无需定义任何特定于页面的样式。

随着网络演变成一个应用程序平台,开发人员寻找方法来制作
他们不断增长的代码库更易于维护。如今,事实上的策略是
组织应用程序代码就是定义小型、轻量级的组件,这些组件可以
一起组成。因此,组件成为
中的组成单位 现代网络开发。

为了封装的目的,组件通常同时定义 HTML 和 CSS。
虽然这使它们更容易创作,但它们可能更难
紧密结合到现有的设计系统中。这尤其正确
适用于从外部供应商进口的第三方组件。

无头组件通过重新引入
之间的分离来解决这一挑战 内容和风格。然而现在分离是沿着组件边界的
反对 HTML 和 CSS 之间的关系。它们是创建出色的无头组件的关键
关键在于设计组件的接口,以便开发人员可以
清晰、轻松地应用自己的风格。

转发相关道具

从最基本的意义上来说,无头组件只是一个无样式组件。
开发人员必须能够将自己的 CSS 应用到
组件定义。

对于简单组件,这可能只是转发 className
prop 到根元素,以便开发人员可以在他们的
中使用类选择器 CSS。

如果您的组件与原生 HTML 元素具有相同的语义,您可以使用
React 中的 ComponentProps 类型,以确保所有相关的 props 都是
可转发。请记住省略任何您不希望
的用户使用的道具 您的组件能够覆盖。

import { type ComponentProps } from 'react'

function SubmitButton({ ...props }: Omit, 'type'>) {
  return 
}

提供预定义类

对于包含一个或多个子元素的组件,开发人员可能会
想要单独设置每个元素的样式。

支持这一点的一个策略是依赖
CSS 组合器。
例如,无头画廊组件的样式可能如下:

/* Root container */
.gallery {
}

/* Gallery items container */
.gallery > ul {
}

/* Gallery item */
.gallery > ul > li {
}

/* Next and Previous buttons */
.gallery button {
}

但是这种方法产生了一个巨大的问题,因为现在
的内部 HTML 结构 该组件是其公共 API 的一部分。这可以防止您修改
稍后构造,而不会破坏下游代码。

更好的策略是为每个主要子元素预定义类。这边走
开发人员可以使用类选择器,而不依赖于任何特定的 HTML
结构:

.xyz-gallery {
}

.xyz-gallery-next-button {
}

.xyz-gallery-previous-button {
}

.xyz-gallery-items-container {
}

.xyz-gallery-item {
}

记住给你的类添加前缀,这样它们就不会与
冲突 开发者自己的风格。

支持自定义布局

提供预定义的类可能是使开发人员能够
的最快方法 设置你的组件的样式。然而,这种方法的一个缺点是
HTML结构无法自定义。

这可能并不重要。毕竟,纯 HTML 在其方式上已经相当灵活了
可以渲染。然而,有时开发人员会按顺序获取额外的 HTML
来完成某些设计。如果您查看几乎所有
的源代码 网站,您可能会看到大量无语义的

元素,
其唯一目的是定义 Flex 或网格布局,直观地对 child
进行分组 边框内的元素或创建新的堆叠上下文。

您可以通过将无头组件拆分为
来支持此类用例 多个相关组件。这样开发者就可以自由添加自己的
将元素布局到组件。例如,开发人员可以嵌入 Next 和
自定义 Flexbox 容器中图库示例中的上一个按钮:


    {data.map((item) => (
      {item.content}
    ))}
  
.gallery-items-container {
}

.gallery-buttons-container {
  display: flex;
  gap: 0.5rem;
  justify-content: flex-end;
}

这些类型的组件通常使用
来实现 要传递的上下文
它们之间的数据。他们需要更多的工作来设计、实施和
文档。然而,它们所带来的多功能性通常意味着额外的努力
值得。

允许组件被覆盖

少数用例需要无头组件管理布局
其子组件。一个例子可能是分层树视图,
允许通过拖放对其项目进行重新排序。另一个用例可能是
允许单页应用程序用
替换默认的锚元素 促进客户端路由的自定义链接组件。

允许开发人员定义自定义布局的高级策略是
允许通过 props 覆盖正在渲染的实际子组件:

}} />

这使开发人员可以完全控制每个子项中渲染的内容
组件,同时允许无头组件管理其整体
结构。

您甚至可以允许开发人员自定义组件的根元素
通过道具。例如,此按钮组件允许开发人员渲染它
作为其他东西:

import { type ElementType } from 'react'

function HeadlessButton({ as, ...props }: { as?: ElementType }) {
  const Component = as ?? 'button'
  return 
}

例如,为了让辅助技术将按钮视为链接,
开发人员可以指定应该使用锚元素来呈现
按钮:

Actually a link

概括

无头组件比不包含任何组件的组件要多得多
风格。优秀的无头组件是完全可扩展的,并允许开发人员
自定义整个内部 HTML 结构。

版本聲明 本文轉載於:https://dev.to/jcmosc/making-headless-components-easy-to-style-89m?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何加速 Matplotlib 繪圖以提高效能?
    如何加速 Matplotlib 繪圖以提高效能?
    為什麼 Matplotlib 這麼慢? 在評估 Python 繪圖庫時,考慮效能很重要。 Matplotlib 是一個廣泛使用的函式庫,它看起來可能很緩慢,引發了關於加快速度或探索替代選項的問題。讓我們深入研究這個問題並探索可能的解決方案。 提供的範例展示了具有多個子圖和資料更新的圖。使用 Matp...
    程式設計 發佈於2024-11-06
  • 使用畫布調整影像大小時如何克服鋸齒狀邊緣和模糊結果?
    使用畫布調整影像大小時如何克服鋸齒狀邊緣和模糊結果?
    解決在JavaScript 中使用Canvas 調整影像大小時的平滑問題在JavaScript 中使用Canvas 調整影像大小有時會導致明顯的鋸齒狀邊緣或模糊。為了實現平滑的調整大小,可以採用一種稱為向下步進的技術。 在大多數瀏覽器中,預設使用線性內插法來調整大小。雙三次插值可產生更平滑的結果,涉...
    程式設計 發佈於2024-11-06
  • 如何解決 MySQL C# 中的文字編碼問題?
    如何解決 MySQL C# 中的文字編碼問題?
    修復MySQL C# 中的文字編碼問題使用實體框架在C# 中處理MySQL 資料庫時,使用者可能會遇到文字編碼問題,特別是帶有特殊字符,例如“ë”,渲染不正確。本文探討了解決此常見問題的最合適的解決方案。 要修正編碼問題,必須執行以下操作:驗證排序規則設定: 確保所涉及的資料庫或表的排序規則與UTF...
    程式設計 發佈於2024-11-06
  • 如何將美麗搜尋與 Node.js 集成
    如何將美麗搜尋與 Node.js 集成
    作為 Node.js 開發人員,建立能夠提供快速且準確的搜尋結果的應用程式非常重要。使用者期望立即得到相關的回應,但實現起來可能具有挑戰性,特別是在處理大型資料集時。 這就是美麗搜尋的用武之地——一個為輕鬆滿足這些需求而構建的搜尋引擎。 什麼是美麗搜尋? Meilisearch ...
    程式設計 發佈於2024-11-06
  • 平行 JavaScript 機
    平行 JavaScript 機
    作者:Vladas Saulis,PE Prodata,克萊佩達,立陶宛 2024 年 5 月 18 日 抽象的 本文提出了一種新的程式設計模型,可以以簡單且自動平衡的方式利用多核心 CPU 系統。該模型還提出了一種更簡單的程式設計範例,用於在大多數大規模平行計算領域(例如天氣預報、核子物理、搜尋引...
    程式設計 發佈於2024-11-06
  • 推薦項目:人事管理系統資料庫設置
    推薦項目:人事管理系統資料庫設置
    LabEx 的這個綜合計畫提供了深入研究資料庫管理世界的寶貴機會,重點是人事管理系統的創建和實施。無論您是新手資料庫管理員還是經驗豐富的開發人員,這種實務經驗都將為您提供必要的技能,以便在關聯式資料庫環境中有效管理和操作資料。 深入了解資料庫基礎知識 這個專案首先引導您完成使用 s...
    程式設計 發佈於2024-11-06
  • Python 中實例方法和類別方法有什麼不同?
    Python 中實例方法和類別方法有什麼不同?
    類別與實例方法Python 的PEP 8 風格指南建議使用“self”作為實例方法的第一個參數,使用“ cls」作為類別方法的第一個參數。理解這兩類方法之間的區別對於有效的物件導向程式設計至關重要。 實例方法實例方法與類別的特定實例相關聯。它們對實例的資料進行操作,並且通常接收“self”作為它們的...
    程式設計 發佈於2024-11-06
  • 將 AdoptiumJDK 原始碼載入到 Eclipse IDE 中
    將 AdoptiumJDK 原始碼載入到 Eclipse IDE 中
    AdoptiumJDK 的安裝程式中沒有內建原始程式碼文件,如果您需要透過 Eclipse IDE 檢查如何使用任何本機 JDK 方法,這是不可能的。 依照以下步驟在Eclipse IDE中載入原始碼: 造訪 AdoptiumJDK 官方網站並按所需的 JDK 版本進行過濾,在我的例子中是 11....
    程式設計 發佈於2024-11-06
  • 絕對定位與相對定位:為什麼它們的行為如此不同?
    絕對定位與相對定位:為什麼它們的行為如此不同?
    了解絕對位置與相對位置:寬度、高度等處理網頁上的元素定位時,了解這些概念絕對位置與相對位置的區別至關重要。讓我們深入探討經常引起疑問的四個關鍵點:1。相對寬度與絕對寬度為何相對定位的div會自動佔據100%寬度,而絕對定位的div只佔據內容寬度? 原因是設定位置:absolute 從文件結構的正常流...
    程式設計 發佈於2024-11-06
  • Python、Node js 和 PHP 中用於驗證碼識別的頂層模組
    Python、Node js 和 PHP 中用於驗證碼識別的頂層模組
    在我们的自动化时代,大多数解决方案都可以免费找到,我现在不是在谈论解决数学问题,而是稍微复杂的任务,例如数据解析,和我们的例子一样,还有 recapcha 识别。但如何找到一个好的模块呢?毕竟,随着技术的发展,每个人都得到了它,无论是认真的开发人员还是彻头彻尾的骗子。 我分析了验证码识别模块的市场,...
    程式設計 發佈於2024-11-06
  • 以下是一些標題選項,重點關注問題格式和核心內容:

**選項 1(直接且簡潔):**

* **如何在 PHP 中有效率地循環多維數組?

**選項2
    以下是一些標題選項,重點關注問題格式和核心內容: **選項 1(直接且簡潔):** * **如何在 PHP 中有效率地循環多維數組? **選項2
    在 PHP 中循環多維數組多維數組可能是解析的一個挑戰,特別是在處理不同深度級別和非順序索引時。考慮一個保存事件資訊的數組,其中可以包含多個藝術家及其相應的鏈接,如下所示:array(2) { [1]=> array(3) { ["eventID"]...
    程式設計 發佈於2024-11-06
  • 透過 Linting 提高程式碼品質
    透過 Linting 提高程式碼品質
    Whenever I start a new project, one of the first things I do is put in place a code linter. For the uninitiated, linters analyze your project and call...
    程式設計 發佈於2024-11-06
  • 如何有效執行JavaScript中的回呼函數?
    如何有效執行JavaScript中的回呼函數?
    理解JavaScript 中回呼函數的本質在JavaScript 中,回呼函數提供了一種方便的機制,可以在另一個函數完成後執行一個函數它的執行。雖然概念很簡單,但回調的最佳實作有時可能不清楚。讓我們探討一個簡化的範例:var myCallBackExample = { myFirstFunc...
    程式設計 發佈於2024-11-06
  • Vue 框架簡介
    Vue 框架簡介
    What is Vue? from the Vue website Vue is a "progressive" JavaScript framework for building user interfaces. It works by build...
    程式設計 發佈於2024-11-06
  • 逃離戲劇:為什麼 HydePHP 是您的 WordPress 替代品
    逃離戲劇:為什麼 HydePHP 是您的 WordPress 替代品
    WordPress 戲劇 隨著 WordPress 生態系統面臨前所未有的混亂,許多開發人員和網站所有者正在重新考慮他們的平台選擇。最近 WordPress 共同創辦人 Matt Mullenweg 和 WP Engine 之間的衝突凸顯了 WordPress 社群內的控制、貢獻和...
    程式設計 發佈於2024-11-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3