首頁 web前端 css教學 如何用情感製作列表組成部分

如何用情感製作列表組成部分

Apr 04, 2025 am 09:29 AM

How to Make a List Component with Emotion

本週在Sentry 進行代碼重構時,我發現我們缺少一個可在項目和功能之間通用的通用列表組件。因此,我開始著手創建一個,但問題在於:我們在Sentry 中使用Emotion 進行樣式設置,而我對Emotion 只有初步的了解,其文檔中對其描述為……

……一個用於使用JavaScript 編寫CSS 樣式的庫。除了提供強大的、可預測的樣式組合之外,它還提供出色的開發人員體驗,其功能包括源映射、標籤和測試實用程序。同時支持字符串和對像樣式。

如果您從未聽說過Emotion,其基本思想如下:當我們在具有許多組件的大型代碼庫上工作時,我們希望確保可以控制CSS 的層疊樣式表。因此,假設您在一個文件中有一個.active類,並且您希望確保它不會影響另一個文件中也具有.active類的完全獨立組件的樣式。

Emotion 通過向您的類名添加自定義字符串來解決此問題,這樣它們就不會與其他組件衝突。以下是它可能輸出的HTML 示例:

<div></div>
登入後複製

很簡潔,對吧?但是,還有許多其他工具和工作流程可以實現非常類似的功能,例如CSS Modules。

要開始創建組件,我們首先需要將Emotion 安裝到我們的項目中。我不會詳細介紹這些內容,因為這取決於您的環境和設置。但是,一旦完成,我們就可以像這樣創建一個新組件:

 import React from 'react';
import styled from '@emotion/styled';

export const List = styled('ul')`
  list-style: none;
  padding: 0;
`;
登入後複製

這對我來說看起來很奇怪,因為我們不僅正在為<ul></ul>元素編寫樣式,而且還定義了組件也應該呈現一個<ul></ul>元素。在一個地方同時組合標記和样式感覺很奇怪,但我確實喜歡它的簡單性。它只是有點擾亂了我的思維模型以及HTML、CSS 和JavaScript 之間的關注點分離。在另一個組件中,我們可以導入這個<list></list>並像這樣使用它:

 import List from 'components/list';

<list>這是一個列表項。</list>
登入後複製

然後,我們添加到列表組件中的樣式將轉換為類名(例如.oefioaueg ),然後添加到我們在組件中定義的<ul></ul>元素中。但我們還沒有完成!對於列表設計,我需要能夠使用相同的組件呈現<ul></ul><ol&gt;</ol&gt;。我還需要一個允許我在每個列表項中放置圖標的版本。就像這樣:Emotion 的酷(而且有點奇怪)之處在於,我們可以使用as屬性來選擇導入組件時要呈現的HTML 元素。我們可以使用此屬性來創建我們的<ol&gt;</ol&gt;變體,而無需創建自定義類型屬性或其他內容。而這看起來就像這樣:

<list>這將呈現一個ul。</list>
<list as="ol&quot;>這將呈現一個ol。</list>
登入後複製

這不僅對我來說很奇怪,對吧?但是,這非常巧妙,因為這意味著我們不必在組件本身中進行任何奇怪的邏輯來更改標記。

這時,我開始記下這個組件的理想API 可能是什麼樣子,因為然後我們可以從那裡倒退回來。這就是我的設想:

<list>
  <listitem>項目1</listitem>
  <listitem>項目2</listitem>
  <listitem>項目3</listitem>
</list>
<list>
  <listitem color="orange400" icon="{<IconBusiness" size="sm"></listitem> }>項目1
  <listitem color="orange400" icon="{<IconBusiness" size="sm"></listitem> }>項目2
  <listitem color="orange400" icon="{<IconBusiness" size="sm"></listitem> }>項目3
</list>
<list as="ol&quot;>
  <listitem>項目1</listitem>
  <listitem>項目2</listitem>
  <listitem>項目3</listitem>
</list>
登入後複製

因此,在製作此草圖後,我知道我們需要兩個組件,以及能夠在<listitem></listitem>中嵌套圖標子組件的能力。我們可以像這樣開始:

 import React from 'react';
import styled from '@emotion/styled';

export const List = styled('ul')`
  list-style: none;
  padding: 0;
  margin-bottom: 20px;

  ol&amp; {
    counter-reset: numberedList;
  }
`;
登入後複製

這種特殊的ol&語法是我們告訴Emotion 這些樣式僅在元素呈現為<ol&gt;</ol&gt;時才適用的方式。通常最好在此元素中添加background: red;以確保您的組件正確呈現內容。接下來是我們的子組件<listitem></listitem>。需要注意的是,在Sentry 中我們也使用TypeScript,因此在定義我們的<listitem></listitem>組件之前,我們需要先設置我們的props:

 type ListItemProps = {
  icon?: React.ReactNode;
  children?: string | React.ReactNode;
  className?: string;
};
登入後複製

現在我們可以添加我們的<iconwrapper></iconwrapper>組件,它將在<listitem></listitem>中調整<icon></icon>組件的大小。如果您還記得上面的示例,我希望它看起來像這樣:

<list>
  <listitem color="orange400" icon="{<IconBusiness" size="sm"></listitem> }>項目1
  <listitem color="orange400" icon="{<IconBusiness" size="sm"></listitem> }>項目2
  <listitem color="orange400" icon="{<IconBusiness" size="sm"></listitem> }>項目3
</list>
登入後複製

IconBusiness組件是一個預先存在的組件,我們希望將其包裝在<span></span>中,以便我們可以對其進行樣式設置。值得慶幸的是,我們只需要一點CSS 就可以將圖標與文本正確對齊,而<iconwrapper></iconwrapper>可以為我們處理所有這些:

 type ListItemProps = {
  icon?: React.ReactNode;
  children?: string | React.ReactNode;
  className?: string;
};

const IconWrapper = styled('span')`
  display: flex;
  margin-right: 15px;
  height: 16px;
  align-items: center;
`;
登入後複製

完成此操作後,我們終於可以在這兩個組件下方添加我們的<listitem></listitem>組件,儘管它要復雜得多。我們需要添加props,然後當存在icon prop 時,我們可以渲染上面的<iconwrapper></iconwrapper>,並渲染傳入其中的icon組件。我還添加了下面的所有樣式,以便您可以看到我如何為這些變體中的每一個設置樣式:

 export const ListItem = styled(({ icon, className, children }: ListItemProps) => (
  
登入後複製
  • {icon && ( {icon} )} {children}
  • ))` display: flex; align-items: center; position: relative; padding-left: 34px; margin-bottom: 20px; /* Tiny circle and icon positioning */ &:before, > ${IconWrapper} { position: absolute; left: 0; } ul & { color: #aaa; /* This pseudo is the tiny circle for ul items */ &:before { content: ''; width: 6px; height: 6px; border-radius: 50%; margin-right: 15px; border: 1px solid #aaa; background-color: transparent; left: 5px; top: 10px; } /* Icon styles */ ${p => p.icon && ` span { top: 4px; } /* Removes tiny circle pseudo if icon is present */ &:before { content: none; } `} } /* When the list is rendered as an
      */ ol & { &:before { counter-increment: numberedList; content: counter(numberedList); top: 3px; display: flex; align-items: center; justify-content: center; text-align: center; width: 18px; height: 18px; font-size: 10px; font-weight: 600; border: 1px solid #aaa; border-radius: 50%; background-color: transparent; margin-right: 20px; } } `;

      就是這樣!一個使用Emotion 構建的相對簡單的<list></list>組件。但是,在完成此練習後,我仍然不確定是否喜歡這種語法。我認為它讓簡單的事情變得非常簡單,但中等大小的組件比應該的要複雜得多。此外,對於新手來說,它可能會非常令人困惑,這讓我有點擔心。

      但我想一切都是學習經驗。無論如何,我很高興有機會處理這個小型組件,因為它教會了我一些關於TypeScript、React 以及如何使我們的樣式在某種程度上可讀的知識。

    以上是如何用情感製作列表組成部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    熱門話題

    Java教學
    1655
    14
    CakePHP 教程
    1413
    52
    Laravel 教程
    1306
    25
    PHP教程
    1252
    29
    C# 教程
    1226
    24
    Google字體可變字體 Google字體可變字體 Apr 09, 2025 am 10:42 AM

    我看到Google字體推出了新設計(Tweet)。與上一次大型重新設計相比,這感覺更加迭代。我幾乎無法分辨出區別

    如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 Apr 11, 2025 am 11:29 AM

    您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

    HTML數據屬性指南 HTML數據屬性指南 Apr 11, 2025 am 11:50 AM

    您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

    如何通過CSS選擇第一個類名為item的子元素? 如何通過CSS選擇第一個類名為item的子元素? Apr 05, 2025 pm 11:24 PM

    在元素個數不固定的情況下如何通過CSS選擇第一個指定類名的子元素在處理HTML結構時,常常會遇到元素個數不�...

    為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? 為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? Apr 05, 2025 pm 05:51 PM

    關於Flex佈局中紫色斜線區域的疑問在使用Flex佈局時,你可能會遇到一些令人困惑的現象,比如在開發者工具(d...

    使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

    在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

    在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? 在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? Apr 05, 2025 pm 10:21 PM

    在前端開發中如何實現類似Windows...

    我們如何創建一個在SVG中生成格子呢模式的靜態站點 我們如何創建一個在SVG中生成格子呢模式的靜態站點 Apr 09, 2025 am 11:29 AM

    格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tar​​tanify.com上,我們收集了5,000多個格子呢

    See all articles