- ReactJS 教程
- ReactJS - 首頁
- ReactJS - 簡介
- ReactJS - 路線圖
- ReactJS - 安裝
- ReactJS - 特性
- ReactJS - 優點與缺點
- ReactJS - 架構
- ReactJS - 建立 React 應用
- ReactJS - JSX
- ReactJS - 元件
- ReactJS - 巢狀元件
- ReactJS - 使用新建立的元件
- ReactJS - 元件集合
- ReactJS - 樣式
- ReactJS - 屬性 (props)
- ReactJS - 使用屬性建立元件
- ReactJS - props 驗證
- ReactJS - 建構函式
- ReactJS - 元件生命週期
- ReactJS - 事件管理
- ReactJS - 建立一個事件感知元件
- ReactJS - 在 Expense Manager 應用中引入事件
- ReactJS - 狀態管理
- ReactJS - 狀態管理 API
- ReactJS - 無狀態元件
- ReactJS - 使用 React Hooks 進行狀態管理
- ReactJS - 使用 React Hooks 進行元件生命週期管理
- ReactJS - 佈局元件
- ReactJS - 分頁
- ReactJS - Material UI
- ReactJS - Http 客戶端程式設計
- ReactJS - 表單程式設計
- ReactJS - 受控元件
- ReactJS - 非受控元件
- ReactJS - Formik
- ReactJS - 條件渲染
- ReactJS - 列表
- ReactJS - 鍵
- ReactJS - 路由
- ReactJS - Redux
- ReactJS - 動畫
- ReactJS - Bootstrap
- ReactJS - 地圖
- ReactJS - 表格
- ReactJS - 使用 Flux 管理狀態
- ReactJS - 測試
- ReactJS - CLI 命令
- ReactJS - 構建和部署
- ReactJS - 示例
- Hooks
- ReactJS - Hooks 簡介
- ReactJS - 使用 useState
- ReactJS - 使用 useEffect
- ReactJS - 使用 useContext
- ReactJS - 使用 useRef
- ReactJS - 使用 useReducer
- ReactJS - 使用 useCallback
- ReactJS - 使用 useMemo
- ReactJS - 自定義 Hooks
- ReactJS 高階
- ReactJS - 可訪問性
- ReactJS - 程式碼分割
- ReactJS - 上下文
- ReactJS - 錯誤邊界
- ReactJS - 轉發 Refs
- ReactJS - 片段
- ReactJS - 高階元件
- ReactJS - 整合其他庫
- ReactJS - 最佳化效能
- ReactJS - Profiler API
- ReactJS - 埠
- ReactJS - 無 ES6 ECMAScript 的 React
- ReactJS - 無 JSX 的 React
- ReactJS - 調和
- ReactJS - Refs 和 DOM
- ReactJS - 渲染 Props
- ReactJS - 靜態型別檢查
- ReactJS - 嚴格模式
- ReactJS - Web Components
- 其他概念
- ReactJS - 日期選擇器
- ReactJS - Helmet
- ReactJS - 內聯樣式
- ReactJS - PropTypes
- ReactJS - BrowserRouter
- ReactJS - DOM
- ReactJS - 走馬燈
- ReactJS - 圖示
- ReactJS - 表單元件
- ReactJS - 參考 API
- ReactJS 有用資源
- ReactJS - 快速指南
- ReactJS - 有用資源
- ReactJS - 討論
ReactJS - 元件集合
在現代應用程式中,開發人員會遇到很多需要以表格格式或畫廊格式渲染專案列表(例如待辦事項、訂單、發票等)的情況。React 提供了清晰、直觀且易於使用的技術來建立基於列表的使用者介面。React 使用兩個現有功能來實現此功能。
- JavaScript 內建的 map 方法。
- jsx 中的 React 表示式。
Map 方法
map 函式接受一個集合和一個對映函式。map 函式將應用於集合中的每個專案,並將結果用於生成一個新的列表。
例如,宣告一個包含 5 個隨機數的 JavaScript 陣列,如下所示 -
let list = [10, 30, 45, 12, 24]
現在,應用一個匿名函式,該函式將其輸入加倍,如下所示 -
result = list.map((input) => input * 2);
然後,生成的列表為 -
[20, 60, 90, 24, 48]
為了重新整理 React 表示式,讓我們建立一個新變數併為其賦值一個 React 元素。
var hello = <h1>Hello!</h1>
var final = <div>{helloElement}</div>
現在,React 表示式 hello 將與 final 合併並生成,
<div><h1>Hello!</h1></div>
示例
讓我們應用此概念來建立一個元件,以表格格式顯示費用條目專案的集合。
步驟 1 - 在您喜歡的編輯器中開啟我們的 expense-manager 應用程式。
在 src/components 資料夾中建立一個 ExpenseEntryItemList.css 檔案以包含元件的樣式。
在 src/components 資料夾中建立另一個檔案 ExpenseEntryItemList.js 以建立 ExpenseEntryItemList 元件
步驟 2 - 匯入 React 庫和樣式表。
import React from 'react'; import './ExpenseEntryItemList.css';
步驟 3 - 建立 ExpenseEntryItemList 類並呼叫建構函式。
class ExpenseEntryItemList extends React.Component {
constructor(props) {
super(props);
}
}
建立 render() 函式。
render() {
}
步驟 4 - 使用 map 方法生成 HTML 表格行的集合,每個表格行代表列表中的單個費用條目專案。
render() {
const lists = this.props.items.map( (item) =>
<tr key={item.id}>
<td>{item.name}</td>
<td>{item.amount}</td>
<td>{new Date(item.spendDate).toDateString()}</td>
<td>{item.category}</td>
</tr>
);
}
這裡,key 標識每一行,並且在列表中必須是唯一的。
步驟 5 - 接下來,在 render() 方法中,建立一個 HTML 表格並在 rows 部分包含 lists 表示式。
return (
<table>
<thead>
<tr>
<th>Item</th>
<th>Amount</th>
<th>Date</th>
<th>Category</th>
</tr>
</thead>
<tbody>
{lists}
</tbody>
</table>
);
最後,匯出元件。
export default ExpenseEntryItemList;
現在,我們已經成功建立了將費用專案渲染到 HTML 表格中的元件。完整的程式碼如下 -
import React from 'react';
import './ExpenseEntryItemList.css'
class ExpenseEntryItemList extends React.Component {
constructor(props) {
super(props);
}
render() {
const lists = this.props.items.map( (item) =>
<tr key={item.id}>
<td>{item.name}</td>
<td>{item.amount}</td>
<td>{new Date(item.spendDate).toDateString()}</td>
<td>{item.category}</td>
</tr>
);
return (
<table>
<thead>
<tr>
<th>Item</th>
<th>Amount</th>
<th>Date</th>
<th>Category</th>
</tr>
</thead>
<tbody>
{lists}
</tbody>
</table>
);
}
}
export default ExpenseEntryItemList;
index.js
開啟 index.js 並匯入我們新建立的 ExpenseEntryItemList 元件。
import ExpenseEntryItemList from './components/ExpenseEntryItemList'
接下來,在 index.js 檔案中宣告一個列表(費用條目專案)並使用一些隨機值填充它。
const items = [
{ id: 1, name: "Pizza", amount: 80, spendDate: "2020-10-10", category: "Food" },
{ id: 1, name: "Grape Juice", amount: 30, spendDate: "2020-10-12", category: "Food" },
{ id: 1, name: "Cinema", amount: 210, spendDate: "2020-10-16", category: "Entertainment" },
{ id: 1, name: "Java Programming book", amount: 242, spendDate: "2020-10-15", category: "Academic" },
{ id: 1, name: "Mango Juice", amount: 35, spendDate: "2020-10-16", category: "Food" },
{ id: 1, name: "Dress", amount: 2000, spendDate: "2020-10-25", category: "Cloth" },
{ id: 1, name: "Tour", amount: 2555, spendDate: "2020-10-29", category: "Entertainment" },
{ id: 1, name: "Meals", amount: 300, spendDate: "2020-10-30", category: "Food" },
{ id: 1, name: "Mobile", amount: 3500, spendDate: "2020-11-02", category: "Gadgets" },
{ id: 1, name: "Exam Fees", amount: 1245, spendDate: "2020-11-04", category: "Academic" }
]
透過 items 屬性傳遞專案來使用 ExpenseEntryItemList 元件。
ReactDOM.render(
<React.StrictMode>
<ExpenseEntryItemList items={items} />
</React.StrictMode>,
document.getElementById('root')
);
index.js 的完整程式碼如下 -
import React from 'react';
import ReactDOM from 'react-dom';
import ExpenseEntryItemList from './components/ExpenseEntryItemList'
const items = [
{ id: 1, name: "Pizza", amount: 80, spendDate: "2020-10-10", category: "Food" },
{ id: 1, name: "Grape Juice", amount: 30, spendDate: "2020-10-12", category: "Food" },
{ id: 1, name: "Cinema", amount: 210, spendDate: "2020-10-16", category: "Entertainment" },
{ id: 1, name: "Java Programming book", amount: 242, spendDate: "2020-10-15", category: "Academic" },
{ id: 1, name: "Mango Juice", amount: 35, spendDate: "2020-10-16", category: "Food" },
{ id: 1, name: "Dress", amount: 2000, spendDate: "2020-10-25", category: "Cloth" },
{ id: 1, name: "Tour", amount: 2555, spendDate: "2020-10-29", category: "Entertainment" },
{ id: 1, name: "Meals", amount: 300, spendDate: "2020-10-30", category: "Food" },
{ id: 1, name: "Mobile", amount: 3500, spendDate: "2020-11-02", category: "Gadgets" },
{ id: 1, name: "Exam Fees", amount: 1245, spendDate: "2020-11-04", category: "Academic" }
]
ReactDOM.render(
<React.StrictMode>
<ExpenseEntryItem item={item} />
</React.StrictMode>,
document.getElementById('root')
);
ExpenseEntryItemList.css
開啟 ExpenseEntryItemList.css 併為表格新增樣式。
html {
font-family: sans-serif;
}
table {
border-collapse: collapse;
border: 2px solid rgb(200,200,200);
letter-spacing: 1px;
font-size: 0.8rem;
}
td, th {
border: 1px solid rgb(190,190,190);
padding: 10px 20px;
}
th {
background-color: rgb(235,235,235);
}
td, th {
text-align: left;
}
tr:nth-child(even) td {
background-color: rgb(250,250,250);
}
tr:nth-child(odd) td {
background-color: rgb(245,245,245);
}
caption {
padding: 10px;
}
使用 npm 命令啟動應用程式。
npm start
輸出
最後,開啟瀏覽器並在位址列中輸入 https://:3000 並按回車鍵。
| 專案 | 金額 | 日期 | 類別 |
|---|---|---|---|
| 披薩 | 80 | 2020年10月10日星期六 | 食物 |
| 葡萄汁 | 30 | 2020年10月12日星期一 | 食物 |
| 電影 | 210 | 2020年10月16日星期五 | 娛樂 |
| Java 程式設計書籍 | 242 | 2020年10月15日星期四 | 學術 |
| 芒果汁 | 35 | 2020年10月16日星期五 | 食物 |
| 連衣裙 | 2000 | 2020年10月25日星期日 | 布料 |
| 旅遊 | 2555 | 2020年10月29日星期四 | 娛樂 |
| 餐食 | 300 | 2020年10月30日星期五 | 食物 |
| 手機 | 3500 | 2020年11月2日星期一 | 小工具 |
| 考試費用 | 1245 | 2020年11月4日星期三 | 學術 |