const [winner, setWinner] = useState("");
const [turn, setTurn] = useState("0");
const [tableData, setTableData] = useState([
["", "", ""],
["", "", ""],
["", "", ""],
]);
위의 긴 코드를 useReducer을 이용해 짧게 줄일 수 있음
reducer은 액션을 dispatch할 때 마다 reducer이 실행되어 state를 바
return {
...state,
winner: action.winner,
};
…state: 기존 state를 바꾸는게 아니라 새 state를 만들어서 변화
const initialState = {
winner: "",
turn: "0",
tableData: [
["", "", ""],
["", "", ""],
["", "", ""],
],
};
const reducer = (state, action) => {
switch (action.type) {
case "SET_WINNER":
return {
...state,
winner: action.winner,
};
}
};
const TicTacToe = () => {
const [state, dispatch] = useReducer(reducer, initialState);
const onClickTable = useCallback(() => {
dispatch({ type: "SET_WINNER", winner: "0" });
});
state를 수정하고 싶으면 action을 만들고 dispatch로 실행해야함. 이 dispatch는 reducer이 기록
import React, { useReducer, useState, useCallback } from "react";
import Table from "./Table";
const initialState = {
winner: "",
turn: "0",
tableData: [
["", "", ""],
["", "", ""],
["", "", ""],
],
};
const SET_WINNER = "SET_WINNER";
const reducer = (state, action) => {
switch (action.type) {
case "SET_WINNER":
return {
...state,
winner: action.winner,
};
}
};
const TicTacToe = () => {
const [state, dispatch] = useReducer(reducer, initialState);
const onClickTable = useCallback(() => {
dispatch({ type: "SET_WINNER", winner: "0" });
}, []);
return (
<>
<Table onClick={onClickTable} tableData={state.tableData} />
{winner && <div>{winner}님의 승리</div>}
</>
);
};
export default TicTacToe;