「React 手冊 」從創建第一個 React 組件開始學起

  • 2019 年 12 月 24 日
  • 筆記

大家好,在本系列的前三篇文章里,我們一起學習了在 React 中經常會用到的 ES6 新特性,以及 REACT 16+ 版本的一些新特性 和 團隊 成員在 Winwow 和 MAC 環境下混合開發時需要注意的一些問題,從本篇文章起,我們將正式開始從最基礎的內容開始學習React,今天我們將從創建第一個 React 組件開始學起。

本篇文章主要介紹以下內容:

  • 如何創建我們的第一個 React 組件
  • 如何組織我們的項目文件結構
  • 如何在組件里添加CSS樣式

一、如何創建我們的第一個 React 組件

組件是React最基本的內容,通過組件我們可以實現交互和重用,依據組件的創建方式又可以分為三類:class components(類組件)、pure components(純組件)、pure components(函數組件),接下來,我們來開始動手實踐第一個組件吧(這裡我們先用類組件的方式進行創建,在後續的文章里將會介紹函數組件)。

1、準備腳手架運行環境

為了方便起見,快速上手 React 項目,我們使用 create-react-app 腳手架創建 React 項目。創建之前,你需要安裝 create-react-app 腳手架,安裝之前,確保你安裝了 Node 運行環境(從 www.nodejs.org 官網下載),支持 Mac, Linux, 和 Windows 系統環境。

在控制台里,我們輸入以下命令進行全局安裝:

npm install -g create-react-app

或者用更簡單命令:

npm i -g create-react-app

2、開始動手創建吧!

接下來,我們來按照以下幾個步驟來創建我們的第一個 React 項目:

1、在控制台輸入以下命令進行項目創建:

create-react-app my-first-react-app

2、將工作台環境切換至當前目錄,並運行項目,你需要在控制台輸入以下命令:

cd my-first-react-app  npm start

3、運行完以上的命令後,將會自動調用瀏覽器窗口,並打開以下網址:

http://localhost:3000

4、接下來,我們在 src 的目錄下創建一個 Home.js 的新文件,示例代碼如下:

import React,{Component} from "react";  class  Home extends  Component{      render() {          return <h1>I'm Home Component</h1>      }  }  export  default  Home;    // File: src/Home.js

5、你可能注意到了在代碼的最後一行我們使用 export 語法,這句話的意思就是方便我們的組件被其他文件進行模塊化調用。這句話除了寫在文末,我們還可以在在類聲前,示例代碼如下:

import React,{Component} from "react";  export  default class  Home extends  Component{      render() {          return <h1>I'm Home Component</h1>      }  }    //File: src/Home.js

小貼士:我個人偏好喜歡將export語句寫在文件的末尾,但是有些人喜歡寫在類聲明前,具體使用哪種寫法,取決於個人的喜好。

6、現在我們創建完了第一個組件,我們需要讓它在頁面中進行呈現。因此,我們需要打開 App.js 文件,通過 import 語法導入 Home 組件,然後將其添加至 return() 里。項目初始化時,你可能會看到如下的代碼:

import React from 'react';  import logo from './logo.svg';  import './App.css';    function App() {    return (      <div className="App">        <header className="App-header">          <img src={logo} className="App-logo" alt="logo" />          <p>            Edit <code>src/App.js</code> and save to reload.          </p>          <a            className="App-link"            href="https://reactjs.org"            target="_blank"            rel="noopener noreferrer"          >            Learn React          </a>        </header>      </div>    );  }    export default App;    //File: src/App.js

小貼士:上述代碼是通過函數的方式聲明組件,接下來的文章里會有介紹,這裡就不過多介紹,我們知道是函數組件即可。

7、接下來我們針對上述代碼做一些小的改動,我們通過 import 語法將Home 組件文件引入,然後通過 JSX 語法進行添加。這裡我們將<p>部分的元素內容進行替換成我們的組件,示例代碼如下:

import React from 'react';  import logo from './logo.svg';  import './App.css';    // 這裡我們引入了 Home 組件  import Home from "./Home";    function App() {    return (      <div className="App">        <header className="App-header">          <img src={logo} className="App-logo" alt="logo" />         {/* 在這裡我們添加 Home 組件在頁面里進行渲染*/}          <Home/>          <a            className="App-link"            href="https://reactjs.org"            target="_blank"            rel="noopener noreferrer"          >            Learn React          </a>        </header>      </div>    );  }    export default App;    //File: src/App.js

3、本部分內容小節

到這裡我們就完成了第一個類組件的創建,我們這裡通過從 react 類庫包引入 React、Component 模塊,創建了類組件。並通過 import 語法導入到了需要此組件的文件,使用 JSX 語法進行添加(其實 React 使用 JSX 來替代常規的 JavaScript,JSX 是一個看起來很像 XML 的 JavaScript 語法擴展)。JSX 語法和 HTML語法類似,你可能注意到了這裡我們使用了 className 名稱替換了 CSS 的 class 類名(因為 class 是 javascript 的關鍵詞 ES6的類聲明部分),如果屬性名包含兩個單詞,建議用駝峰法進行命名(Camel-Case:除第一個單詞之外,其它單詞首字母大寫)。比如 onClick、srcSet、和 tabIndex。如果帶有橫線的屬性,則可以使用原先的命名規則,比如 aria-*、 data-* 等屬性(data-something 和 aria-label)。

小貼士:React 組件的名稱比如類命名和文件命名首字母都應該大寫,剛開始學習時,你有可能覺得不舒服,但這確實 React 最佳實踐推薦的方法。

下圖為本小節完成後,項目成功運行後的效果圖:

二、如何組織我們的項目文件結構

接下來我們來討論下如何組織我們React項目的文件結構,在這裡我只是給大家提供一個思路方向,具體怎麼在此基礎上進行優化,還是需要結合自己的項目特點進行優化。

1、首先我們需要通過 create-react-app 創建一個 React 項目(上一小節我們已經完成)。

2、創建完後,項目初始化的結構如下圖所示:

3、接下來我們在 src 目錄下創建 components目錄(src/components) 和 shared目錄(src/shared)。

4、然後,我們在 src/components 目錄下創建 Home 目錄(src/components/Home),並將 Home.js 文件移動至本目錄下。

5、App.js 文件移動至 src/components 目錄下。

6、App.css、App.test.js 文件也移動至 src/components 目錄下。

7、將 logo.svg 文件移動至 src/shared/images 目錄下。

8、我們的 index.js 文件位置保持不變 在src/ 目錄下。

9、如果你完成了以上步驟的話,你的項目結構如下圖所示:

小貼士:如果你創建的組件重用性比較高的話,比如頁面的頭部和尾部組件,我強烈建議你將共享組件放置在 src/shared/components 目錄下。

10、為了保持上小節項目能正常運行,在 App.js 文件中,我們需要修改 logo 和 Home 文件的引用位置,修改部分的代碼如下:

import logo from '../shared/images/logo.svg';  import Home from "./Home/Home";    // File: src/components/App.js

11、接下來,我們需要在 index.js 文件里修正 App 組件文件的位置引用,修改部分代碼如下:

import App from './components/App';    //File: src/index.js

12、最後驗證下項目是否能正常運行,如果按照上述步驟操作後,我們在控制台下運行 npm start 命令來驗證項目是否正常運行。

本部分小節

這種項目新結構讓我們的項目更具有靈活性和可維護性,當我們項目變得複雜時,這種項目結構就顯得尤其重要。

三、如何在組件里添加CSS樣式

上兩個小節,我們一起完成了如何創建組件和組織項目文件,接下來我們來添加一些CSS內容在文件里。

在 React里,最佳實踐就是把CSS文件和組件文件放在同一目錄里,不同於我們以前傳統的方式,我們將CSS文件放置在一個單獨的CSS樣式文件夾里。 React 項目默認採用 Webpack 模塊化打包工具,使用 Webpack 我們可以配置樣式的處理方式,關於 Webpack 如何配合 React 項目使用,在後續的文章里會介紹到。

好啦,廢話不多說,一起來動手實踐吧!

1、創建一個 React 項目或基於上一小節的項目。

2、然後我們為Home組件創建1個新的CSS文件,在同一個 Home 目錄下進行創建,讓我們稍微修改下 Home 組件,示例代碼如下:

import React,{Component} from "react";  // 在這裡引入我們創建的 Home.css 文件  import './Home.css';  export default class  Home extends  Component{      render() {          return(              <div className="Home">                  <h1>Welcome to Codejobs</h1>                  <p>                      In this recipe you will learn how to add styles to                      components. If you want to learn more you can visit                      our Youtube Channel at                      <a href="https://www.qianduandaren.com">Codejobs</a>.                  </p>              </div>          );      }  }    // File:  src/components/Home/Home.js

3、接下來我們在 Home.css 里添加一些樣式,樣式就不過解釋,示例代碼如下,這裡請注意樣式的命名方式:

 .Home {      margin: 0 auto;      width: 960px;  }    .Home h1 {      font-size: 32px;      color: white;  }    .Home p {      color: white;      text-align: center;  }    .Home a {      color: #56D5FA;      text-decoration: none;  }    .Home a:hover {      color: #333;  }    /*  File: src/components/Home/Home.css   */

4、你有可能需要使用內聯樣式,修改局部的一些樣式,你只需要在對應的標籤上添加style屬性,使用駝峰命名的方式添加CSS屬性值,並將其包含在{{ }} 符號里,示意代碼如下:

import React,{Component} from "react";  // 在這裡引入我們創建的 Home.css 文件  import './Home.css';  export  default class  Home extends  Component{      render() {          return(              <div className="Home">                  <h1>Welcome to Codejobs</h1>                  <p>                      In this recipe you will learn how to add styles to                      components. If you want to learn more you can visit                      our Youtube Channel at                      <a href="https://www.qianduandaren.com">前端達人</a>.                  </p>                  <p>                      <button                          style={{                              backgroundColor:'gray',                              border:'1px solid black'                          }}                      >                      Click me!                      </button>                  </p>              </div>          );      }  }    // File:  src/components/Home/Home.js

5、除了以上方法,你還可以通過聲明樣式對象的形式進行樣式聲明,然後通過內聯樣式的方式進行引用,請注意樣式對象聲明的位置,示例代碼如下:

import React,{Component} from "react";  // 在這裡引入我們創建的 Home.css 文件  import './Home.css';  export  default class  Home extends  Component{      render() {          const buttonStyle={              backgroundColor:'gray',              border:'1px solid black'          };          return(              <div className="Home">                  <h1>Welcome to Codejobs</h1>                  <p>                      In this recipe you will learn how to add styles to                      components. If you want to learn more you can visit                      our Youtube Channel at                      <a href="https://www.qianduandaren.com">Codejobs</a>.                  </p>                  <p>                      <button style={buttonStyle}>                          Click me!                      </button>                  </p>              </div>          );      }  }    // File:  src/components/Home/Home.js

6、如果按照以上步驟正確操作後,你可以使用 npm start 命令來查看我們的項目,如下圖所示:

題外話

你可能對 React 是如何編譯的將我的CSS代碼引入到我們的項目文件里的,你可以使用谷歌瀏覽器開發者查看工具進行查看,你將會看到以下內容:

基本上一個CSS文件,分配一個<style>標籤區域,我們的React項目對應的有3個CSS文件,就有對應的3個<style>標籤區域,這是由於Webpack 默認使用的是style-loader模式。

在使用 create-react-app 創建項目時,我們無法直接修改 Webpack配置,主要是因為項目使用的 react-scripts 程序包進行了集成,除非你手動集成了Webpack配置到你的項目里。

小節

本篇文章的介紹就介紹到這裡,感謝你的閱讀,本篇文章我們一起學習了如何創建 React 類組件,如何組織我們的項目結構和引入CSS文件,在下一篇文章里,如何定義組件的屬性(props)和 數據狀態(state),敬請期待。