
昨天再經過python後端API的CRUD開發之後
高速的服務提供者Fast API
今天會介紹React的基本使用方式
不過我會講道說為什麼會使用這些框架,跟傳統三劍客(HTML、JS、CSS)有什麼差別
以及React(前端)工程師在開發時的會思考的東西
今天會學到
1.前端工程師該思考的事情
2.React的建置跟基本語法
3.前後端的交互
| # | 注意事項 | 說明 |
|---|---|---|
| 1 | UI/UX 設計 | 確保應用程式具有流暢、直觀的使用體驗(UX)和美觀、一致的介面設計(UI),以提升用戶滿意度。 |
| 2 | 狀態儲存與管理 | 使用狀態管理工具(如Redux、Vuex、MobX)管理應用的全局狀態,確保資料流動一致,方便擴展和調試。 |
| 3 | HTTP 請求與 API 交互 | 通過工具(如fetch或Axios)發送HTTP請求,處理數據的異步操作,並考慮API請求的安全性與錯誤處理。 |
| 4 | 組件化開發 | 將應用拆分為小型可重用組件,管理組件之間的資料流動,提高代碼結構的可維護性和可讀性。 |
| 5 | 響應式設計與跨裝置兼容性 | 透過CSS媒體查詢確保應用適應不同螢幕尺寸,並確保應用在主流瀏覽器上的表現一致。 |
| 6 | 性能優化 | 優化資源加載、代碼分割、圖片Lazy Loading等技術,確保應用加載迅速並提升用戶體驗。 |
| 7 | 無障礙設計(A11y) | 確保網站對於有視覺、聽覺或其他障礙的用戶可訪問,遵循WCAG標準,提供鍵盤導航等無障礙功能。 |
| 8 | 安全性 | 防範XSS、CSRF等攻擊,進行輸入驗證,確保應用數據的安全性,並使用身份驗證來保護API請求。 |
| 9 | 國際化(i18n)和本地化(l10n) | 支持多語言和多地區的需求,提供日期、貨幣等本地格式的動態切換功能,以適應不同市場。 |
| 10 | 動效與過渡效果 | 使用CSS或JavaScript的動效提升用戶體驗,但要平衡性能,確保應用運行流暢且不卡頓。 |
這幾個都是前端工程師的必學技能
不過就新手而言我建議先朝HTTP 請求與 API 交互、 組件化開發 、響應式設計與跨裝置兼容性
三個方向去學習
為什麼呢~!?
這個也是我個人的主觀見解
今天在開發一個網站應用程式(Web Application)
最重要的是:
HTTP請求與API交互(儲存使用者的資料=>前端傳到後端資料庫存放)
組件化開發 透過現代前端框架有效的拆分組件(類似python modular programming的概念)
響應式設計 各種裝置平台瀏覽都有最適應的畫面

這個圖在前面也有呈現過類似的
但今天以前端工程師角度來說會思考更多點
大家可以參考下面的重點,還有我個人的心得補充
async/await或Promise來處理HTTP請求,確保不會阻塞前端其他操作。可以想像成今天你在早餐店點了奶茶跟烤巧克力土司

有沒有發現重點!?
今天所有動作都不會一樣一樣完成(點餐->收錢->烤土司->做奶茶->打包)
而是會拆解處理的動作,我最喜歡用早餐店老闆娘解釋這個情境XDD
這個就很常看到了,今天如果是網路問題通常會直接跳伺服器引擎的錯誤看不到畫面(nginx error)
但如果是API請求失敗,比如說你案送出按鈕,後端回傳失敗,這時候前端工程師接到錯誤就要呈現錯誤畫面。
AbortController來取消不再需要的請求。我們可以創建一個範例
功能是一個counter畫面以及按鈕可以控制加減的網頁
直接讓大家看到下面的程式來比較
html開發counter功能(畫面、控制按鈕) 左邊
vs
React 組件化開發功能(Counter父組件、Counter Display、 Counter Control) 右邊

優點
缺點
使用場景
優點
useState、useEffect)管理狀態和副作用,使狀態變化更為簡單和直觀。缺點
使用場景
這邊不會講到艱澀的RWD開發模式
不過可以讓大家了解這個模式的應用會有什麼差別
IT邦的畫面
桌面版本
手機版本

| 類別 | 優點 | 缺點 | 應用場景 |
|---|---|---|---|
| RWD | - 提高使用者體驗,適應各種裝置 | - 開發時間可能較長,需考慮多種設備的適配 | - 中大型網站,需支援各種裝置的網站 |
| - 透過單一代碼庫簡化維護 | - 需要更複雜的CSS和JavaScript | - 需要在行動裝置和桌面裝置上保持一致性的網站 | |
| - 有助於SEO,Google更喜歡響應式設計 | - 可能出現性能問題,特別是在低效的設備上 | - 電子商務平台,提升用戶購物體驗 | |
| - 提升加載速度,避免重複內容 | - 測試和調試工作量增加 | - 需要高互動性的網站,例如社交媒體平台 |
前端框架要運行的環境一定要安裝nodejs
https://nodejs.org/zh-tw
使用vite建立 react
可以使用這種交互命令的方式自己選擇(react(有一堆框架可以點,用上下選react按enter) -> javascript)
npm create vite@latest
或是直接用template-react來操作(reactapp 是我命名的名字)
$ npm create vite@latest reactapp --template react

進去裡面可以按照步驟
npm install
npm run dev
接者輸入http://localhost:5173/
應該就可以看到我們成功運行react app搂~
恭喜學會前端了(X)
等等~這只是開始呢~地獄門才剛進去![]()
** Vite + React 基本檔案目錄結構與說明**
.
├── public/
│ └── index.html # 入口 HTML 文件
├── src/
│ ├── assets/ # 靜態資源 (圖片、樣式等)
│ ├── components/ # React 組件
│ ├── App.jsx # 主 React 組件,應用入口
│ ├── main.jsx # 應用啟動文件,掛載 React 進入點
│ └── index.css # 全局樣式
├── .gitignore # 忽略的文件規則(Git)
├── package.json # 項目配置文件,定義依賴和腳本
├── vite.config.js # Vite 配置文件
├── README.md # 項目簡介與說明
└── node_modules/ # 依賴庫目錄(自動生成)
src/components/: 用於存放 React 的各個組件,這是項目組件化的基礎。src/App.jsx: 主 React 組件,通常用於定義應用的整體結構與路由等。丟給夥伴使用可以快速安裝相同的套件庫)剛開始的npm install安裝完的套件庫會放這邊,通常nodejs開發的環境都會裝到當前資料前而非全域喔!!)這邊在安裝完後主要會使用到的只有app.jsx跟component/底下的組件
通常新手我會建議把assets,css刪掉避免過多檔案混淆學習

tips React的HTML
大家看到這張圖有沒有覺得似曾相似
沒錯我們曾經在爬蟲實的時候有學習過
當初為什麼抓不到html tag ![]()
其實就是因為這個原因
在前端框架中通常html進入點都只有<div id = root><div>的 root html tag進入
剩下的畫面都是透過Javascript動態產生
那組件我們可以很簡單理解就是畫面的功能
我們可以透過jsx的語法來實現
jsx的基本介紹
JSX 是 JavaScript 的一種語法擴展,允許你在 JavaScript 代碼中寫類似 HTML 的語法,並用來描述 React 元素的樹狀結構。JSX 讓編寫 React 組件變得更加直觀和便捷。
順序就是JSX(翻譯過後) -> Javascript ->HTML
大括號可以塞javascript變數)<img /> 或 <input /> 等無子元素的標籤需要自閉合。我是JSX
// 一個簡單的 React 組件使用 JSX
import React from 'react';
function Greeting(props) {
return (
<div>
<h1>Hello, {props.name}!</h1>
<p>Welcome to the world of JSX and React.</p>
</div>
);
}
export default Greeting;
我是Javascript
React.createElement(
'div',
null,
React.createElement('h1', null, 'Hello, ', props.name, '!'),
React.createElement('p', null, 'Welcome to the world of JSX and React.')
);
我是html
<div>
<h1>Hello, John!</h1>
<p>Welcome to the world of JSX and React.</p>
</div>
經過前面的簡易介紹我們今天就把程式碼串接起來吧
雖然我不會詳細的講解javascript跟jsx
但是我會把必要的邏輯講解後再大家看
不過相信對學到這邊python的你
javascript不會太難的XDD
我們把昨天的Fast API運行起來吧~!!
接者我們要安裝axios
npm install axios
Axios 是一個基於 Promise 的 HTTP 客戶端,用於瀏覽器和 Node.js 中發送 HTTP 請求。它可以用來處理與伺服器之間的數據交換,例如 GET、POST、PUT、DELETE 等請求。它比傳統的 XMLHttpRequest 更加簡潔,並且可以自動處理 JSON 數據。
簡單說就是讓我們跟後端api界街的工具庫
** Axios 的特點 **
今天很簡單我們就是目標要把Postman 測試的到的Get API 資料傳回來
首先我們先打開前端的資料夾App.jsx
把這串react程式碼貼過去
在npm run dev運行程式碼
如果網站有噴錯誤(應該說肯定)
我們要先把css跟svg在main.jsx使用到的css砍掉
// src/App.jsx
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function App() {
const [customers, setCustomers] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
// 使用 axios 發送 GET 請求
axios.get('http://127.0.0.1:8000/customers/')
.then(response => {
setCustomers(response.data); // 將 API 返回的數據設置到 state 中
setLoading(false); // 請求完成後設置 loading 為 false
})
.catch(err => {
setError(err); // 設置錯誤狀態
setLoading(false);
});
}, []);
if (loading) {
return <div>Loading...</div>;
}
if (error) {
return <div>Error: {error.message}</div>;
}
return (
<div>
<h1>Customers</h1>
<ul>
{customers.map(customer => (
<li key={customer.id}>{customer.name}</li>
))}
</ul>
</div>
);
}
export default App;
我們透過這串React前端期望可以先把昨天後端Get回來呈現到畫面上
但實際上會看到這個
CORS(Cross-Origin Resource Sharing)
是一種安全機制,允許網頁從不同的域名請求資源。這是為了克服瀏覽器的同源政策(Same-Origin Policy),該政策限制了網頁只能訪問與其來源相同的資源。CORS 通過 HTTP 標頭來告訴瀏覽器哪些外部來源可以訪問特定的資源。
CORS 的主要功能
http://example.com:80 和 http://example.com:3000 被認為是不同的來源。這也是為什麼都是在本機執行但不能通,因為前端(port 5173) 跟後端port 8000不一樣,瀏覽器判定不同源後端修改 在昨天的server.py新增cors套件
#import新的東西進來
from fastapi.middleware.cors import CORSMiddleware
#這行不變
app = FastAPI()
#這段落新增
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 或者指定你的前端網址,例如 ["http://localhost:3000"]
allow_credentials=True,
allow_methods=["*"], # 允許所有 HTTP 方法,例如 GET、POST、PUT、DELETE 等
allow_headers=["*"], # 允許所有請求標頭
)
厲害吧只要有安裝fast api就會有幫忙處理的middleware喔
重新運行server.py後
我們再重新看前端畫面就會有瞜~!!

import React, { useState, useEffect } from 'react';
import axios from 'axios';
react 組件都是用function來定義
function App() {
}
const [customers, setCustomers] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
Rreact 可以透過狀態改變,自動重新渲染組件 => 就是有值改變會自動重新刷新不用重整,強吧!!
useEffect(() => {
axios.get('http://127.0.0.1:8000/customers/')
.then(response => {
setCustomers(response.data); // 將 API 返回的數據設置到 state 中
setLoading(false); // 請求完成後設置 loading 為 false
})
.catch(err => {
setError(err); // 設置錯誤狀態
setLoading(false);
});
}, []);
useEffect: 在組件首次渲染時執行這段代碼,發送 GET 請求到後端 API (http://127.0.0.1:8000/customers/)。
axios.get: 發送請求,然後根據結果執行以下操作:
.then: 請求成功後,將返回的數據(response.data)設置到 customers 狀態中,並將 loading 設置為 false。
.catch: 如果請求失敗,將錯誤信息設置到 error 狀態中,並將 loading 設置為 false。
return (
<div>
<h1>Customers</h1>
<ul>
{customers.map(customer => (
<li key={customer.id}>{customer.name}</li>
))}
</ul>
</div>
);
}
如果加載完成且沒有錯誤,則顯示客戶的列表。
使用 map 函數遍歷 customers 陣列,為每個客戶創建一個元素,顯示客戶的姓名。
使用 customer.id 作為 key 屬性,以確保每個元素都有唯一的標識。
今天學到了一些前端的梅梅角角
因為時間的關係來不及補充玩
不過希望透過這篇可以學習到前端基本知識
後續的(Post,Put,Delete可以讓大家練習看看XDD) => 其實這三個才是最難的XDD
以及交互應用的場景喔~!!