1. 程式人生 > 其它 >React簡單教程-3-樣式

React簡單教程-3-樣式

前言

在上一章 React 簡單教程-2-ts 和元件引數 中我們新建的子元件 Displayer 沒有樣式,顯得平平無奇,這一篇我們將給他美化一下。

CSS 檔案

一般的做法,是在你的元件級目錄下新建一個和元件同名的 CSS 檔案。如,我們的元件是 displayer.tsx,我們就在同級目錄下新建一個 displayer.css,然後在元件 Displayer 中直接引入這個檔案:

//  引入
import "./displayer.css";

export function Displayer(props: { name: string, content: string }) {
  //  ...
  return (
    <div>
      {/* ... */}
    </div>
  );
}

我們先寫下一個樣式,該樣式將背景變成灰色:

.gray {
  background-color: gray;
}

然後在元件中使用樣式:

//  引入
import "./displayer.css";

export function Displayer(props: { name: string, content: string }) {
  const name = props.name;
  const content = props.content;
  return (
    //  className,不是 class
    <div className="gray">
      <div>{name}</div>
      <div>{content}</div>
      <Displayer name="My name is App1" content="My content is Aoh!!!1" />
    </div>
  );
}

注意在 react 中使用的是 className,而不是和 html 一樣使用 class,這兩者寫法不同而已,功能完全一樣。注意小駝峰寫法。

啟動後介面的效果如下:

你看起效了,我們能夠用我們熟悉的方式來編寫 CSS 樣式。

我們簡單美化一下,將子元件的樣式做得好看一點:

CSS 程式碼:

.container {
  background-color: rgb(40 40 40);
  color: white;
  padding: 0.5rem;
  margin: 0.5rem;
  border-radius: 10px;
}

.nav {
  display: flex;
  margin-bottom: 0.3rem;
}

.btn-red {
  height: 12px;
  width: 12px;
  background-color: rgb(255, 29, 29);
  border-radius: 15px;
}

.btn-yellow {
  height: 12px;
  width: 12px;
  background-color: rgb(255, 251, 29);
  border-radius: 15px;
  margin: auto 0.5rem;
}

.btn-gray {
  height: 12px;
  width: 12px;
  background-color: rgb(220, 220, 220);
  border-radius: 15px;
}

.body {
  padding: 0.5rem 0;
}

元件程式碼

import "./displayer.css";

export function Displayer(props: { name: string, content: string }) {
  const name = props.name;
  const content = props.content;
  return (
    <div className="container">
      <div className="nav">
        <span className="btn-red"></span>
        <span className="btn-yellow"></span>
        <span className="btn-gray"></span>
      </div>
      <div className="body">
        <div>{name}</div>
        <div>{content}</div>
      </div>
    </div>
  );
}

介面效果如下:

稍微好看一點了。以後我們便可以在任何想要的地方使用這個子元件了,而不用跟以前寫原生 HTML 一樣,每個地方都重新寫一遍。

CSS 元件樣式缺陷

如果我們在開發者工具(F12)中檢視頁面的 html 程式碼,我們可以發現我們的樣式是直接在 head 的 style 標籤中。

就連其他元件的樣式也是在 head 的 style 標籤中。這就意味著在不同的元件樣式檔案中,如果出現了相同的 CSS 類名,那麼樣式就會被覆蓋掉。你可以在 App 元件樣式中定義一個 CSS 類,再到 Displayer 的元件樣式中定義一個相同名字不同屬性值的 CSS 類,你會發現 App 元件的樣式就失效了。

在元件裡使用樣式,最好的情況當然是這個元件的樣式不會被其他因素所影響。對於這種情況,一種辦法是給元件樣式起一個獨一無二的名字,比如樣式上加上元件名:

/* 加上元件名 displayer */
.displayer-container {
  /* ... */
}

這種方式寫起來既難受又繁瑣,我推薦的另外一種方式是使用功能類優先的寫法。在我一篇文章 為什麼我在 css 裡使用功能類優先 有描述到這種寫法,使用到的庫是 tailwindcss

總結

本文我們學了怎麼在 react 元件編寫 CSS 樣式並引用,也探討了直接使用 CSS 檔案的弊端。

在下一章中我將描述怎麼使用 tailwindcss。