iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
自我挑戰組

用ChatGPT詠唱來完成工作與點亮前後端技能樹系列 第 27

【Day27】ChatGPT請教教我:React進階(五)- Style管理!styled-components!

  • 分享至 

  • xImage
  •  

各位,從Day1至今為止,我們討論前端內容或React內容的時候
幾乎沒有討論到要怎麼處理元件的樣式 (Style)
只在Day6輕描淡寫的提到css檔引入,以及在TypeScript的章節有講到一點點inline Style

但有關CSS語法,我這邊暫時沒打算深入討論
今天來討論在React中有哪些管理Style的方式
https://ithelp.ithome.com.tw/upload/images/20231009/20135750iMl2PhSpTp.png

在 React 中,我們可以使用多種方式來指定和管理元件的樣式。以下將針對不同的方式逐一做示範說明:

  1. Inline Style (行內樣式)

    在 React 中,你可以直接在 JSX 元素中使用行內樣式。這種方式通常適用於只會在單一元件中使用的樣式。

    示範程式碼:

    function InlineStyleComponent() {
      const divStyle = {
        color: 'blue',
        fontSize: '20px',
      };
    
      return <div style={divStyle}>這是一個使用行內樣式的元件</div>;
    }
    
  2. CSS 檔案引入

    你也可以在 React 中使用傳統的 CSS 檔案,並透過 import 引入。這是一種較為傳統且常見的做法。

    示範程式碼:

    // 在你的專案中建立一個 CSS 檔案,例如 MyComponent.css
    // MyComponent.css
    .my-component {
      color: green;
      font-size: 18px;
    }
    
    // 在 React 元件中引入 CSS 檔案
    import React from 'react';
    import './MyComponent.css';
    
    function MyComponent() {
      return <div className="my-component">這是一個使用外部 CSS 的元件</div>;
    }
    
  3. CSS Modules

    CSS Modules 是一種讓你在 React 中可以維護模組化的 CSS 的方式。每個元件會有自己的 CSS 作用範圍,避免了全域樣式的衝突。

    示範程式碼:

    // 在你的專案中建立一個 CSS 模組,例如 MyComponent.module.css
    // MyComponent.module.css
    .myComponent {
      color: purple;
      font-size: 24px;
    }
    
    // 在 React 元件中引入 CSS 模組
    import React from 'react';
    import styles from './MyComponent.module.css';
    
    function MyComponent() {
      return <div className={styles.myComponent}>這是一個使用 CSS Modules 的元件</div>;
    }
    
  4. 使用第三方套件

    你也可以使用第三方套件來管理樣式,例如 styled-components 或 Emotion。這種方式可以將樣式直接寫在 JavaScript/TypeScript 檔案中,使得元件的樣式更加模組化和容易維護。

    示範程式碼 (以 styled-components 為例):

    // 安裝 styled-components 套件
    // npm install styled-components
    
    // 在 React 元件中使用 styled-components
    import React from 'react';
    import styled from 'styled-components';
    
    const StyledComponent = styled.div`
      color: red;
      font-size: 16px;
    `;
    
    function MyComponent() {
      return <StyledComponent>這是一個使用 styled-components 的元件</StyledComponent>;
    }
    

這些是一些常見的在 React 中指定和管理元件樣式的方法,你可以根據專案的需求和個人喜好選擇適合的方式來進行樣式管理。希望這些示範能對你有所幫助!如果有任何問題或需要進一步說明,請隨時提問。

基本上就三大類:inline style、CSS/ CSS Modules / 第三方套件
詢問ChatGPT第三方套件有哪些是大家常用的

https://ithelp.ithome.com.tw/upload/images/20231009/201357505552MNT3AG.png

在 React 中,有許多第三方套件可以幫助你更有效地管理樣式。以下是一些常見的第三方套件,以及它們的特色和範例:

  1. styled-components

    • 特色:styled-components 是一個讓你可以在 JavaScript/TypeScript 中直接寫 CSS 的套件。它提供了一種以元件為基礎的樣式管理方式,使得樣式可以與元件直接關聯,讓你的程式碼更容易維護和理解。

    • 範例

      // 安裝 styled-components 套件
      // npm install styled-components
      
      // 在 React 元件中使用 styled-components
      import React from 'react';
      import styled from 'styled-components';
      
      const StyledButton = styled.button`
        background-color: blue;
        color: white;
        font-size: 16px;
      `;
      
      function MyComponent() {
        return <StyledButton>這是一個 styled-components 的按鈕</StyledButton>;
      }
      
  2. Emotion

    • 特色:Emotion 是一個功能豐富的 CSS-in-JS 套件,它提供了多種靈活的樣式定義方式,支援 CSS、Sass 和 Less 的語法。它也能夠在開發過程中自動處理 vendor prefixes。

    • 範例

      // 安裝 emotion 套件
      // npm install @emotion/react @emotion/styled
      
      // 在 React 元件中使用 emotion
      import React from 'react';
      import { css } from '@emotion/react';
      
      const buttonStyles = css`
        background-color: green;
        color: white;
        font-size: 16px;
      `;
      
      function MyComponent() {
        return <button css={buttonStyles}>這是一個 Emotion 的按鈕</button>;
      }
      
  3. Radium

    • 特色:Radium 是一個為 React 元件提供行內樣式的套件,並支援偽類和媒體查詢。它也能夠處理 vendor prefixes。

    • 範例

      // 安裝 radium 套件
      // npm install radium
      
      // 在 React 元件中使用 radium
      import React from 'react';
      import Radium from 'radium';
      
      const styles = {
        base: {
          backgroundColor: 'purple',
          color: 'white',
          fontSize: '16px',
          ':hover': {
            backgroundColor: 'darkpurple',
          },
        },
      };
      
      class MyComponent extends React.Component {
        render() {
          return <button style={styles.base}>這是一個 Radium 的按鈕</button>;
        }
      }
      
      export default Radium(MyComponent);
      

這些是一些常見的用來管理樣式的第三方套件。每個套件都有其獨特的特色和用法,你可以根據專案需求和個人喜好來選擇適合的套件。希望這些範例能對你有所幫助!如果有任何問題或需要進一步說明,請隨時提問。

https://ithelp.ithome.com.tw/upload/images/20231009/20135750G8w2DNtBVD.png

當然!除了上述提到的套件外,還有一些其他常見用來管理樣式的第三方套件:

  1. Tailwind CSS

    • 特色:Tailwind CSS 是一個工具集,它提供了一系列預先定義的 CSS 類別,可以用來快速開發界面。它不需要寫自定義 CSS,而是透過將類別應用到元素上來設定樣式。

    • 範例

      // 安裝 tailwindcss 套件
      // npm install tailwindcss
      
      // 在 React 元件中使用 Tailwind CSS
      import React from 'react';
      
      function MyComponent() {
        return (
          <div className="bg-blue-500 text-white font-bold py-2 px-4 rounded">
            這是一個使用 Tailwind CSS 的元件
          </div>
        );
      }
      
  2. Bulma

    • 特色:Bulma 是一個基於 Flexbox 的 CSS 框架,提供了許多預先定義好的 CSS 類別,可以用來快速建構界面。

    • 範例

      // 在 React 元件中使用 Bulma
      import React from 'react';
      import 'bulma/css/bulma.min.css';
      
      function MyComponent() {
        return (
          <div className="notification is-primary">
            這是一個使用 Bulma 的元件
          </div>
        );
      }
      

這些套件提供了不同的方式來管理樣式,你可以根據專案需求和個人偏好來選擇適合的套件。希望這些補充的套件也能對你有所幫助!如果有任何問題或需要進一步說明,請隨時提問。

了解大致上主流有這些方式之後
首先,我自己其實很喜歡inline style的方式
但會出現很多套件來處理style

表示應該有什麼問題點是inline style做不到的
先來了解一下這麼做的限制和缺點是什麼

inline Style & 缺點

https://ithelp.ithome.com.tw/upload/images/20231009/20135750g1c2XmMWgB.png

使用行內樣式 (Inline Style) 在某些情況下可能會遇到一些限制、困難或缺點:

  1. 可讀性差
    • 行內樣式直接寫在 JSX 元素中,使得程式碼較難閱讀和理解,特別是當樣式較複雜時。
  2. 難以維護
    • 如果同一個樣式在多個地方使用,需要進行多次複製和粘貼,這樣會使得程式碼重複,也較難維護。
  3. 不易進行樣式重用
    • 行內樣式無法直接被其他元件或模組使用,無法實現樣式的模組化和重用。
  4. 不支援擴充性
    • 在行內樣式中難以使用一些較複雜的樣式功能,例如媒體查詢或偽類等。
  5. 不利於團隊協作
    • 在大型專案中,可能會有多名開發者協同工作,行內樣式可能會造成樣式定義的不一致性,增加了協作的困難度。
  6. 難以進行動畫和過渡效果
    • 行內樣式對於複雜的動畫和過渡效果的管理較為困難,通常需要依賴 JavaScript 來實現。
  7. 不利於測試
    • 行內樣式難以進行單元測試,因為樣式直接寫在元素中,無法方便地進行單元測試。

總的來說,雖然行內樣式在一些情況下可能很方便,但在較大型、複雜的專案中,使用外部的樣式管理方式(如 CSS 檔案、CSS Modules 或第三方套件)通常會更為優雅、模組化和易於維護。然而,在小型專案或快速原型開發中,行內樣式也可能是一個有效的解決方案。

CSS & 優缺點

inline style有上述這些缺點,ChatGPT也說可以用「外部的樣式管理方法」、像是CSS檔案等等
來問問ChatGPT如果是用外部的CSS檔案會怎麼解決以上的困擾
https://ithelp.ithome.com.tw/upload/images/20231009/20135750qzPuWEg85U.png

當我們使用外部的 CSS 檔案 (.css) 來管理樣式時,可以較容易地處理一些行內樣式難以做到的事情。以下是一些在 .css 檔案中可以處理但在行內樣式難以做到的事情:

  1. 模組化和重用

    在 CSS 檔案中,你可以定義一次樣式,然後在多個元件中重複使用它。這樣可以提高程式碼的重用性,並使得樣式更容易維護。

    例如,你可以在一個 CSS 檔案中定義一個 .button 類別:

    .button {
      background-color: blue;
      color: white;
      font-size: 16px;
    }
    

    然後在多個元件中使用這個 .button 類別:

    import React from 'react';
    import './styles.css'; // 引入外部的 CSS 檔案
    
    function MyComponent1() {
      return <button className="button">按鈕1</button>;
    }
    
    function MyComponent2() {
      return <button className="button">按鈕2</button>;
    }
    
  2. 媒體查詢

    CSS 檔案可以使用媒體查詢(Media Queries)來根據不同裝置或螢幕大小應用不同的樣式。這使得可以輕鬆地實現響應式設計。

    例如,在 CSS 檔案中:

    @media (max-width: 600px) {
      .button {
        font-size: 14px;
      }
    }
    
  3. 偽類和偽元素

    CSS 檔案允許你使用偽類(如 :hover)和偽元素(如 ::before)來為元素應用特定的樣式。

    例如:

    .button:hover {
      background-color: darkblue;
    }
    

    .button::before {
      content: "🎉";
    }
    
  4. 動畫和過渡效果

    在 CSS 檔案中,你可以使用 CSS 動畫和過渡來為元素添加動態效果。

    例如:

    .button {
      transition: background-color 0.3s ease;
    }
    
    .button:hover {
      background-color: darkblue;
    }
    

這些是使用外部 CSS 檔案相對於行內樣式的一些優勢之一。使用外部 CSS 檔案可以使得樣式更模組化、易於重用,並且支援一些進階的 CSS 功能。當然,在特定情況下,行內樣式可能也是一個合理的選擇,特別是對於一些單一性的樣式需求。

聽起來很棒,那CSS檔案有沒有缺點呢
https://ithelp.ithome.com.tw/upload/images/20231009/20135750csUdBnypiv.png

使用外部 CSS 檔案也會帶來一些問題或缺點,以下是一些可能遇到的情況:

  1. 全域性影響

    在一個較大的專案中,一個 CSS 檔案中的樣式可能會影響到整個網站。這可能會導致樣式的衝突和覆蓋,特別是在多人協作的情況下。

  2. 依賴管理

    如果樣式過於複雜,可能會需要透過一些工具或框架來管理依賴關係,例如 Webpack、Parcel 等。這需要額外的學習和配置。

  3. 性能問題

    外部 CSS 檔案需要進行瀏覽器的額外請求,這可能會導致較長的加載時間,特別是在網路環境較差的情況下。

  4. 不利於模組化

    有時候在專案中的某個元件中需要一些特定的樣式,但這些樣式並不適合放在全域的 CSS 檔案中。這種情況下,需要考慮其他方式來處理,可能會造成一些困擾。

  5. 版本控制和依賴管理

    在團隊協作的情況下,需要考慮如何進行版本控制和依賴管理,以確保團隊成員之間的樣式一致性。

  6. 命名衝突

    有時候在專案中會使用一些外部的套件或框架,這些套件可能也包含了一些 CSS 樣式。這可能會導致命名衝突和覆蓋。

總的來說,雖然使用外部 CSS 檔案有許多優點,但也有一些可能的缺點和問題。在開發過程中,需要根據專案的需求和情況來選擇適合的樣式管理方式,或者結合不同的方法來解決特定的問題。

看來用CSS檔也會有一些對應的困擾

我個人最不喜歡就是會有全域影響&命名衝突的問題吧
全域影響的問題可以靠CSS Modules 的方式處理
但我不喜歡命名 XD 也沒有很喜歡在使用元件的時候,看不到他對應的樣式
還得對照.css檔查找才知道他的樣子長什麼樣子

styled-components

所以我個人比較喜歡CSS-in-JS的方式
來看看styled-components 的介紹以及他可以解決什麼樣的問題
https://ithelp.ithome.com.tw/upload/images/20231009/20135750klFFOOUjMs.png

使用 styled-components 套件來處理樣式可以解決許多行內樣式(Inline Style)和外部 CSS 檔案的問題,並提供了以下優勢:

  1. 模組化和重用

    styled-components 允許你將樣式與元件綁定,這使得樣式更模組化,每個元件都可以有自己的樣式定義。這解決了在行內樣式中難以實現的模組化和重用性。

  2. 避免全域樣式衝突

    styled-components 使用了隔離的 CSS 樣式,這意味著每個元件的樣式都在其自己的範圍內,避免了全域樣式的衝突問題,這是外部 CSS 檔案難以做到的。

  3. 動態樣式

    你可以使用 JavaScript 變數和條件來設置 styled-components 中的樣式,這使得動態樣式更容易處理。這是行內樣式難以達到的功能。

  4. 優雅的語法

    styled-components 使用一個優雅的語法,將樣式嵌入到 JavaScript/TypeScript 中,這使得程式碼更易讀和維護。

  5. 程式碼分離

    你可以將元件和其相關的樣式定義放在同一個檔案中,這提高了程式碼的結構性和可讀性。

  6. 支援擴充性

    styled-components 提供了一些高級功能,如擴展現有的樣式,支援 CSS-in-JS 的所有功能,並且能夠方便地處理樣式的邏輯。

總之,styled-components 是一個強大的套件,它能夠解決行內樣式和外部 CSS 檔案可能遇到的許多問題,並提供了一種更現代、模組化和易於維護的樣式管理方式。這使得它成為 React 開發中的一個受歡迎的選擇。

https://ithelp.ithome.com.tw/upload/images/20231009/20135750VcUIImb34P.png

當然!以下是一份使用 styled-components 的完整教學,包括安裝、基本使用以及一些進階功能。

步驟 1:安裝 styled-components

首先,在你的專案中安裝 styled-components 套件:

npm install styled-components

步驟 2:基本使用

假設你有一個 React 元件 Button,我們將使用 styled-components 為它添加樣式。

import React from 'react';
import styled from 'styled-components';

// 使用 styled-components 創建一個按鈕元件
const StyledButton = styled.button`
  background-color: blue;
  color: white;
  font-size: 16px;
  padding: 8px 16px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
`;

function Button() {
  return <StyledButton>Click Me</StyledButton>;
}

export default Button;

這樣就創建了一個名為 StyledButton 的 styled-components,並將其應用於一個按鈕元件。

步驟 3:傳遞 props

你可以在 styled-components 中使用 props 來動態設定樣式。以下是一個範例:

const StyledButton = styled.button`
  background-color: ${props => (props.primary ? 'blue' : 'white')};
  color: ${props => (props.primary ? 'white' : 'blue')};
  font-size: 16px;
  padding: 8px 16px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
`;

function Button({ primary }) {
  return <StyledButton primary={primary}>Click Me</StyledButton>;
}

這裡的 primary 是一個由父元件傳遞的 prop,根據它的值來動態設定按鈕的樣式。

步驟 4:全域樣式

你也可以在全域範圍內定義樣式,並在需要的地方使用。例如:

import { createGlobalStyle } from 'styled-components';

const GlobalStyle = createGlobalStyle`
  body {
    font-family: Arial, sans-serif;
  }
`;

function App() {
  return (
    <>
      <GlobalStyle />
      <Button primary>Click Me</Button>
    </>
  );
}

這樣就在全局範圍內設置了 body 的字體。

步驟 5:擴展現有樣式

你可以使用 styled-components 的擴展功能,來繼承和修改現有的樣式。

const BaseButton = styled.button`
  font-size: 16px;
  padding: 8px 16px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
`;

const PrimaryButton = styled(BaseButton)`
  background-color: blue;
  color: white;
`;

const SecondaryButton = styled(BaseButton)`
  background-color: white;
  color: blue;
  border: 1px solid blue;
`;

function Button() {
  return (
    <>
      <PrimaryButton>Primary Button</PrimaryButton>
      <SecondaryButton>Secondary Button</SecondaryButton>
    </>
  );
}

這裡我們創建了 BaseButton 作為基礎樣式,然後通過擴展它創建了 PrimaryButtonSecondaryButton

這就是一個基本的 styled-components 教學。當然,這還只是入門,這個套件還有許多強大的功能可以探索,如動畫、主題(Theme)等。希望這份教學對你有所幫助!

哇,他都說有近一步的內容了,那就順便問一問

https://ithelp.ithome.com.tw/upload/images/20231009/20135750bjx4aw5IZ9.png

當然!讓我們進一步探討 styled-components 的一些進階功能:

步驟 6:使用 ThemeProvider

ThemeProvider 允許你在應用中定義全局的主題(Theme),並在所有的 styled-components 中共享這些主題變數。

首先,我們需要安裝 styled-components 的相關套件:

npm install styled-components

然後在你的程式碼中使用 ThemeProvider

import React from 'react';
import { ThemeProvider } from 'styled-components';

// 定義主題變數
const theme = {
  primaryColor: 'blue',
  secondaryColor: 'green',
  fontSize: '16px',
};

// 將主題變數傳遞給 ThemeProvider
const App = () => (
  <ThemeProvider theme={theme}>
    <Button>Click Me</Button>
  </ThemeProvider>
);

現在,你可以在 styled-components 中使用這些主題變數:

import styled from 'styled-components';

const StyledButton = styled.button`
  background-color: ${props => props.theme.primaryColor};
  color: white;
  font-size: ${props => props.theme.fontSize};
  padding: 8px 16px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
`;

// ...

function Button() {
  return <StyledButton>Click Me</StyledButton>;
}

步驟 7:動畫和過渡效果

styled-components 還支援在元件中定義動畫和過渡效果。

import styled, { keyframes } from 'styled-components';

const fadeIn = keyframes`
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
`;

const FadeInDiv = styled.div`
  animation: ${fadeIn} 1s ease-in-out;
`;

// ...

function App() {
  return <FadeInDiv>Fading In</FadeInDiv>;
}

步驟 8:動態樣式

可以使用 props 傳遞動態樣式。

const Box = styled.div`
  background-color: ${props => (props.active ? 'blue' : 'gray')};
  width: 100px;
  height: 100px;
`;

// ...

function App() {
  const isActive = true;

  return <Box active={isActive}>Dynamic Style</Box>;
}

步驟 9:擴展現有樣式

你可以擴展已經定義的 styled-components

const Button = styled.button`
  font-size: 16px;
  padding: 8px 16px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
`;

const PrimaryButton = styled(Button)`
  background-color: blue;
  color: white;
`;

const SecondaryButton = styled(Button)`
  background-color: white;
  color: blue;
  border: 1px solid blue;
`;

// ...

function App() {
  return (
    <>
      <PrimaryButton>Primary Button</PrimaryButton>
      <SecondaryButton>Secondary Button</SecondaryButton>
    </>
  );
}

步驟 10:繼承樣式

你可以使用 css 屬性來繼承其他已經定義的樣式。

const BaseButton = styled.button`
  font-size: 16px;
  padding: 8px 16px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
`;

const PrimaryButton = styled(BaseButton)`
  background-color: blue;
  color: white;
`;

const SecondaryButton = styled(BaseButton)`
  background-color: white;
  color: blue;
  border: 1px solid blue;
`;

// ...

function App() {
  return (
    <>
      <PrimaryButton>Primary Button</PrimaryButton>
      <SecondaryButton>Secondary Button</SecondaryButton>
    </>
  );
}

這是一個進階的 styled-components 教學,涵蓋了主題設定、動畫、過渡效果、動態樣式、擴展現有樣式、繼承樣式等功能。希望這份教學對你有所幫助!如果你有任何進一步的問題,請隨時提問。

OK!styled-components的語法和用法大致上ChatGPT都講過了

說實在,我覺得inline style有個問題讓我覺得挺困擾的
也就是不能使用 :hover 這樣的語法
往往會變成使用 useState + mouseEnter 、mouseOut 事件去配合

比如說這樣

import React, { useState } from 'react';
function MyComponent(){
	const [isHover, setIsHover] = useState<boolean>(false);
	const buttonStyle: React.CSSProperties = {
		backgroundColor: isHover ? 'red' : 'gray'
	}
	return (
		<button 
			style={buttonStyle}
			onMouseEnter={()=> setIsHover(true)}
      onMouseLeave={()=> setIsHover(false)}
		>
			Hover變色按鈕
		</button>
	)
}

看一下styled-components 能不能解決這樣的問題
https://ithelp.ithome.com.tw/upload/images/20231009/20135750tPZVLATTK0.png

你可以使用 styled-components 來輕鬆實現這樣的效果。以下是一個範例:

首先,安裝 styled-components 套件:

npm install styled-components

然後在你的程式碼中使用:

import React from 'react';
import styled from 'styled-components';

const Button = styled.button`
  font-size: 16px;
  padding: 8px 16px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  background-color: gray; /* 初始顏色 */
  color: white; /* 初始文字顏色 */

  &:hover {
    background-color: red; /* 滑鼠懸停時的背景顏色 */
  }
`;

function App() {
  return <Button>Hover Me</Button>;
}

export default App;

在這個例子中,我們創建了一個名為 Button 的 styled-component。它有一些基本的樣式,包括背景顏色和文字顏色。然後,我們使用 &:hover 選擇器定義了滑鼠懸停時的樣式變化,這裡將背景顏色設為紅色。

這樣當你的按鈕被懸停時,背景顏色會變成紅色,否則保持灰色。

不過我們不能那麼偏袒styled-components
必須來了解這個套件的缺點是什麼
https://ithelp.ithome.com.tw/upload/images/20231009/20135750xqBheyHAcI.png

雖然 styled-components 是一個受歡迎的 CSS-in-JS 套件,但它也有一些可能被視為缺點的特性和考慮事項:

  1. 學習曲線:對於初學者來說,學習 styled-components 可能需要一些時間,特別是如果你之前不熟悉 CSS-in-JS 的概念。它與傳統的 CSS 或 CSS 預處理器有一些不同的用法。
  2. 過度使用:有時開發者可能會過度使用 styled-components,導致大量的小型樣式組件,這可能會使代碼更加複雜和難以維護。
  3. 樣式的集中管理:將樣式與組件綁定的特性,有時會導致樣式分散在整個代碼庫中,可能會使全局樣式的集中管理變得困難,特別是在大型專案中。
  4. 性能考慮styled-components 的某些特性可能會對性能產生一定的影響,特別是在大規模應用中。動態樣式的生成和注入可能會增加一些運行時負擔。
  5. 客戶端的工作負擔:在客戶端(瀏覽器)上,styled-components 通常需要進行樣式的運行時計算,這可能會增加一些初始載入時間。
  6. 工具和生態系統:儘管 styled-components 在 React 生態系統中受歡迎,但它的工具和生態系統可能不像傳統 CSS 工具那麼豐富。例如,樣式檢查工具可能需要額外的配置。

總之,styled-components 是一個強大的工具,但它不是適用於所有情況的解決方案。選擇使用它或其他 CSS 管理方法應該根據專案需求和團隊偏好來決定。對於小型專案或需要強調組件封裝的情況,styled-components 可能是一個優秀的選擇。然而,在大型專案中,可能需要仔細考慮其性能和維護方面的特點。

額外:Radium

這個套件,老實說我在寫這篇文章之前沒有聽說過
但發現他也可以直接用 ':hover' 去處理css上的hover的效果

const styles = {
  base: {
    backgroundColor: 'purple',
    color: 'white',
    fontSize: '16px',
    ':hover': {
      backgroundColor: 'darkpurple',
    },
  },
};

所以來問問有關這個套件的教學與資訊
https://ithelp.ithome.com.tw/upload/images/20231009/20135750yN4y9UrVzU.png

當然!Radium 是一個 React 樣式管理工具,它允許你在 React 元件中添加行內樣式並處理動態樣式。以下是一個完整的教學,並使用 functional component 的寫法。

步驟 1:安裝 Radium

首先,在你的專案中安裝 Radium:

npm install radium

步驟 2:基本使用

假設你有一個 functional component Button,我們將使用 Radium 為它添加樣式。

import React from 'react';
import Radium from 'radium';

const styles = {
  base: {
    fontSize: '16px',
    padding: '8px 16px',
    border: 'none',
    borderRadius: '4px',
    cursor: 'pointer',
    backgroundColor: 'gray', // 初始顏色
    color: 'white', // 初始文字顏色

    ':hover': {
      backgroundColor: 'red', // 滑鼠懸停時的背景顏色
    },
  },
};

function Button() {
  return <button style={styles.base}>Hover Me</button>;
}

export default Radium(Button);

在這個例子中,我們使用 Radium 的 Radium() 高階組件包裹了 Button 元件。我們定義了樣式物件 styles,其中包含了基本樣式和 :hover 狀態下的樣式變化。

步驟 3:啟用 Radium

在頂層的應用程式組件中,你需要啟用 Radium。通常,這是在應用程式的入口處(例如 App.js)完成的。

import React from 'react';
import Radium from 'radium';
import Button from './Button'; // 引入上面定義的按鈕元件

function App() {
  return (
    <div>
      <Button />
    </div>
  );
}

export default Radium(App);

步驟 4:使用 Radium 的動態樣式

你可以使用 Radium 的 :hover@media 擴展功能來處理動態樣式和媒體查詢。例如:

const styles = {
  base: {
    fontSize: '16px',
    padding: '8px 16px',
    border: 'none',
    borderRadius: '4px',
    cursor: 'pointer',
    backgroundColor: 'gray',
    color: 'white',

    ':hover': {
      backgroundColor: 'red',
    },

    '@media (max-width: 768px)': {
      fontSize: '14px',
    },
  },
};

這樣就可以在不同的屏幕寬度下更改按鈕的字體大小。

這是一個基本的 Radium 教學,讓你了解如何使用 Radium 在 functional component 中處理行內樣式和動態樣式。希望這對你有所幫助!如果你有任何進一步的問題,請隨時提問。

嗯。身為一個第一次學習這個套件的新手
注意到他用了export default Radium(App);export default Radium(Button);
稍微問他一下我困惑的點
https://ithelp.ithome.com.tw/upload/images/20231009/20135750EkByt2E5No.png

Radium 是一個可以用於 React 元件的高階組件(Higher Order Component,HOC),它用於處理行內樣式和動態樣式的功能。然而,並非每個 React 元件都需要使用 Radium

以下是一些使用 Radium 的時機和考慮事項:

  1. 需要處理行內樣式或動態樣式

    如果你的元件需要具有動態樣式,例如應對滑鼠懸停或媒體查詢的變化,那麼你可以考慮使用 Radium

  2. 僅適用於具體元件

    你不需要在每個元件中都使用 Radium。只有在你需要處理樣式時,才需要將元件包裹在 Radium 中。

    import Radium from 'radium';
    
    const MyComponent = () => {
      // ...
    }
    
    export default Radium(MyComponent);
    
  3. 全域的樣式設置

    如果你希望在整個應用程式中啟用 Radium,你可以在頂層元件中使用 Radium

    import Radium from 'radium';
    
    const App = () => {
      // ...
    }
    
    export default Radium(App);
    
  4. 考慮效能

    請注意,在大型應用程式中過度使用 Radium 可能會導致一些效能問題。因為它會在客戶端進行運行時計算,所以在大型專案中可能需要謹慎使用。

總的來說,Radium 主要用於需要處理行內樣式和動態樣式的情況。你可以選擇在特定元件中使用它,或者在整個應用程式的頂層元件中啟用它,具體取決於你的專案需求。

OKOK,所以可以放根元件或要使用的元件都行

Radium vs styled-components

兩者的效果有點像,比較一下優劣吧

https://ithelp.ithome.com.tw/upload/images/20231009/201357508Wd1aOy2BY.png

下面是 Radium 和 styled-components 兩個套件之間的優劣比較,包括學習難度、靈活性、功能強大等方面:

特點 Radium styled-components
學習難度 相對較低,簡單易上手 需要一些時間來熟悉 CSS-in-JS 的概念,但提供了更強大的功能
靈活性 相對較低,主要用於處理行內樣式和動態樣式 非常靈活,可以處理行內樣式、全域樣式、動畫等
功能強大 專注於處理行內樣式和動態樣式,較為簡潔 提供了更豐富的功能,包括主題設定、動畫等
樣式管理 需要手動管理樣式物件,相對較為傳統 將樣式和元件綁定,更具模組化和組件封裝性
全域樣式 較難處理全域樣式,需要額外的處理 提供了更方便的方式來管理全域樣式,如 createGlobalStyle
模組化 較難實現模組化,樣式和元件的關聯較疏散 具有更好的模組化和組件封裝性,更容易進行樣式的重用
效能 相對較輕,並不會在客戶端進行運行時計算 在客戶端需要進行一些運行時計算,較輕量的執行時效能

綜合來說,Radium 主要用於處理行內樣式和動態樣式,學習曲線較為平緩,但功能較簡單。styled-components 提供了更豐富的功能,包括主題設定、動畫等,並且具有較強的模組化和組件封裝性,但學習曲線稍高。因此,具體選擇使用哪個套件取決於你的專案需求和個人偏好。

統整重點

https://ithelp.ithome.com.tw/upload/images/20231009/20135750bvzxQ5rvbB.png

在這個對話中,我們討論了前端開發相關的主題,特別關注了React中處理樣式的不同方法。以下是這個對話的重點:

  1. React中處理樣式的方法:我們討論了在React中處理樣式的幾種方法,包括行內樣式、外部CSS文件、以及CSS-in-JS套件。
  2. styled-components的介紹:我們深入探討了styled-components,這是一個受歡迎的CSS-in-JS套件,它允許將樣式與React元件緊密集成,提供模組化、組件封裝性和強大的功能。
  3. Radium的介紹:我們也介紹了Radium,另一個處理React元件樣式的工具,它主要專注於行內樣式和動態樣式處理。
  4. 比較styled-components和Radium:我們進行了styled-components和Radium之間的比較,包括學習難度、靈活性、功能強大等方面的優劣比較。

總的來說,React開發中的樣式管理是一個重要的議題,不同的方法和工具可供選擇,根據專案需求和個人偏好選擇適合的工具是關鍵。styled-components提供了強大的功能和模組化的樣式管理,但學習曲線稍高;Radium則較簡單,主要用於處理行內樣式和動態樣式。選擇合適的方法將有助於提高React應用程式的效能和可維護性。

結語:React前端開發是一個不斷演變的領域,樣式管理是其中的一個重要方面。了解不同的樣式處理方法和工具,並根據具體情況做出明智的選擇,將有助於提高應用程式的品質和開發效率。希望這次的討論有助於你更好地理解和應用樣式管理技術。如果有更多問題,請隨時提問!

結語

目前Style樣式管理的第三方套件
最熱門的其中兩個應該是styled-component和Tailwind CSS

但Tailwind CSS我自己學習並用了一段時間之後,覺得實在沒有很喜歡
這個是個人偏好和習慣問題,兩種套件都有相當多的擁護者

本次的對話連結在這邊:
https://chat.openai.com/share/d9f28109-4737-4c06-ab70-aedd2a04490b

我是對CSS-in-JS一見鐘情一見如故的前端工程師一宵三筵,我們明天見~


上一篇
【Day26】ChatGPT請教教我:React進階(四)- useReducer、useContext vs. Redux ?
下一篇
【Day28】ChatGPT請教教我:React進階(六)- NextJS!路由系統!
系列文
用ChatGPT詠唱來完成工作與點亮前後端技能樹56
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言