鐵人賽
React
javascript
nodejs
鐵人賽第16天,學了這麼多知識,是時候來個實戰讓自己融會貫通一下。
Hello World
,也就是To Do List
的範例,這個範例可以讓我們練習之前的React招式系列及讓React更優雅的JS系列。ToDoApp
為Top-component:
- 包含一個
title
,可用<h2>
來設計- 包含
Input
及ToDoApp
兩個套件
Input
元件,其中包含:
- 一個
<input>
輸入框- 一個
<button>
送出事件
ToDoList
元件,內容包含:
- 多個
<div>
以顯示所有的代辦事項
ToDoList
我們透過Reducer
做統一管理,其中:
state
: 存放待辦事項的紀錄,我們使用[Array]
dispatch
:新增、刪除...等存取待辦事項的動作
React第三招
,我們可以透過Context+Reducer
讓我們可以輕鬆的讓各個元件,進行一致的操作。// ToDoApp.sj
import React, { useReducer, createContext } from "react";
export default function ToDoApp() {
return (
<div>
<h2 style={{ borderBottom: "1.5px black solid" }}>To Do List</h2>
</div>
);
}
ADD
新增功能,之後再一點一滴地把其他功能補上// reducers/js
export default function reducers(toDoList, action) {
switch (action.type) {
case "ADD":
return toDoList.push(action.newEvent);
default:
return toDoList;
}
}
Context+Reducer
useReducer
將剛剛建立的reducers
連結起來,同時我們給予state
初始值["Hello", "One", "Two"]
,以利初步測試// ToDoApp.js
import React, { useReducer, createContext } from "react";
import reducers from "./reducers";
export const ContextStore = createContext();
export default function ToDoApp() {
const appReducer = useReducer(reducers, ["Hello", "One", "Two"]); //<--給予`state`初始值`["Hello", "One", "Two"]`,以利初步測試
return (
<ContextStore.Provider value={{ appReducer: appReducer }}>
<div>
<h2 style={{ borderBottom: "1.5px black solid" }}>To Do List</h2>
</div>
</ContextStore.Provider>
);
}
ContextStore
傳遞過來的toDoList
一個接一個顯示出來// ToDoList.js
import React, { useContext } from "react";
import { ContextStore } from "./ToDoApp";
export default function ToDoList() {
const { appReducer } = useContext(ContextStore);
const toDoList = appReducer[0];
return (
<div>
{
toDoList.map((e) => (<p>{e}</p>) )
}
</div>
);
}
ToDoApp.js
將ToDoList
加入喔// ToDoApp.js
import React, { useReducer, createContext } from "react";
import reducers from "./reducers";
import ToDoList from "./ToDoList"; //<-- 加入 ToDoList
export const ContextStore = createContext();
export default function ToDoApp() {
const appReducer = useReducer(reducers, ["Hello", "One", "Two"]);
return (
<ContextStore.Provider value={{ appReducer: appReducer }}>
<div>
<h2 style={{ borderBottom: "1.5px black solid" }}>To Do List</h2>
<ToDoList />
</div>
</ContextStore.Provider>
);
}
Input.js
ToDoApp.js
將Input
加進來喔//Input.js
import React, {useContext} from 'react'
export default function Input() {
return (
<div>
<input style={{width:"150px"}}></input>
<button>{"Send"}</button>
</div>
)
}
ToDoApp
的架構設定好,明天我們來將整個動作串起來,讓整個app更完整。