
- 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日星期三 | 學術 |