鐵人賽 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+ReduceruseReducer將剛剛建立的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更完整。