1. 컴포넌트 디자인 (상태 그리고 분리)


⇒ 아래와 같이 sessionList를 그려주는 React 컴포넌트를 생성한다.

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";

const rootElement = document.getElementById("root");
const sessionList = [
  { id: 1, title: "1회차: Overview" },
  { id: 2, title: "2회차: Redux 만들기" },
  { id: 3, title: "3회차: React 만들기" },
  { id: 4, title: "4회차: 컴포넌트 디자인 및 비동기" }
];

ReactDOM.render(
  <React.StrictMode>
    <App store={{ sessionList }} />
  </React.StrictMode>,
  rootElement
);
/* App.js */
import React from "react";

const SessionItem = ({ title }) => <li>{title}</li>;

class ClassApp extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      displayOrder: "ASC"
    };
  }

  toggleDisplayOrder = () => {
    // ▼ arrow 함수는 렉시컬 스코프를 가지므로 this가 오염되지 않는다.
    //   문맥상 this가 고정된다
    this.setState({
      displayOrder: displayOrder === "ASC" ? "DESC" : "ASC"
    });
  };

  render() {
    return (
      <div>
        여기여기
        <button onCLick={this.onToggleDisplayOrder}>정렬</button>
      </div>
    );
  }
}
import React from "react";

const SessionItem = ({ title }) => <li>{title}</li>;

const App = (props) => {
  const [displayOrder, toggleDisplayOrder] = React.useState("ASC");
  const { sessionList } = props.store;
  const orderedSessionList = sessionList.map((session, i) => ({
    ...session,
    order: i
  }));

  const onToggleDisplayOrder = () => {
    // toggleDisplayOrder는 함수 안에서만 호출되어지므로, 이런 의미에서 클로저를 가지지만, 
    // 훅 자체가 클로저를 가지는 것은 아니다.
    toggleDisplayOrder(displayOrder === "ASC" ? "DESC" : "ASC");
  };
  return (
    <div>
      <header>
        <h1>React and TypeScript</h1>
      </header>
      <p>전체 세션 갯수: 4개 {displayOrder}</p>
      <button onClick={onToggleDisplayOrder}>재정렬</button>
      <ul>
        {orderedSessionList.map((session) => (
          <SessionItem key={session.id} title={session.title} />
        ))}
      </ul>
    </div>
  );
};

export default App;
  useEffect(()=>{
    // ...
    // 구독();
    return () => {
      // 클린업 대상은 클로저 메모리를 정리하는 의미가 아님
      // 메모리를 정리하는 건 React나 자바스크립트의 GC(garbage collector)들이 지워준다.
      // 구독해제();
    }
	}

2. 제너레이터와 비동기


function* foo() {}
async function bar() {}