หัดเขียน React
Tags: react, typescript
Published: 2020-12-15 15:29:35

[React](https://reactjs.org/) เป็น Javascript/(and Typescript)  library เพื่อสร้างและจัดการ web UI ที่คนใช้กันเยอะแยะมากมาย แต่เนื่องจากผมทำส่วน Backend ซะมากกว่าในช่วงหลายปีที่ผ่านมา ล่าสุดที่เขียน frontend เป็นงานเป็นการคือสมัย AngularJS 1.x โน้น เลยลองมาหัดเขียน ซะหน่อย

เครื่องไม้เครื่องมือเดี๋ยวนี้ก็จะมีหลักๆคือ NodeJS แน่นอนเป็น Javascript Runtime ที่มีเครื่องมืออย่าง npm, yarn เอาไว้จัดการ dependencies จัดการ project เพื่อ build Typescript ออกไปเป็น JS ที่ browser อ่านออกอีกที

เริ่มแรกไปติดตั้ง NodeJS และ yarn ให้ได้ก่อนจากนั้นจะสร้าง React project ก็แค่สั่งแบบนี้

```shell
yarn create react-app clock-app --template typescript
```

โดยที่ `clock-app` คือชื่อโปรเจ็ค และ `--template typescript` คืออ็อปชั่นบอกว่าจะใช้ TypeScript นะ มันจะได้เจนไฟล์ config และ dependencies ต่างๆสำหรับใช้เขียน TypeScript ให้

ก็จะได้ folder `clock-app` ที่ข้างในมีของประมาณนี้

```
.
├── README.md
├── node_modules
├── package.json
├── public
├── src
    ├── App.css
    ├── App.test.tsx
    ├── App.tsx
    ├── index.css
    ├── index.tsx
    ├── logo.svg
    ├── react-app-env.d.ts
    ├── reportWebVitals.ts
    └── setupTests.ts
├── tsconfig.json
└── yarn.lock
```

จริงๆมันก็มีโค้ดใน App.tsx กับ index.tsx มาให้แล้วแหละ แต่เดี๋ยวมาสรุป concept คร่าวๆกันก่อน

React จะให้เราแบ่ง UI ออกเป็น component ซึ่งจริงๆวิธีสร้าง component คือเขียน function ธรรมดานี่แหละให้ return โครงสร้าง UI ในรูปแบบของ JSX ออกมา ซึ่ง JSX ก็จะแบบ HTML Element เนี่ยแหละแต่เป็นการเอา Component มาประกอบร่างกันแทน HTML Element ปกติ

ซึ่ง React จะเอาไปจัดการ render ให้แล้วในการ render React ก็จะจัดการ life cycle ของ component ให้เรา เราสามารถใช้ Hook เพื่อเขียนโค้ดเพิ่มเติมให้ Component เราจัดการ state จัดการ effect หรือ ส่วนอื่นๆของ component life cycle ได้

ตัวอย่างเช่นเดี๋ยวเราจะสร้าง Component ชื่อ Clock แล้วให้แสดงเวลาปัจจุบันโดยเปลี่ยนไปเรื่อยๆทุกวินาที โค้ดเราอยู่ในไฟล์ `src/Clock.tsx`

```typescript
// import useEffect กับ useState hook
import { useEffect, useState } from "react";

// เขียน Component ของเราเป็น function Clock
function Clock() {
  // เราใช้ useState เพื่อเพิ่ม state ให้กับ component โดยเริ่มต้นให้มีค่าเป็น new Date()
  // แล้วใช้ date เพื่อแสดงใน UI ของ component กับ ใช้ updateDate เพื่อเปลี่ยน state
  let [date, updateDate] = useState(new Date());

  // เราใช้ useEffect เพื่อจัดการบางอย่างเมื่อ component เราถูก insert หรือ remove ออกจาก UI tree
  useEffect(() => {
    // เราสร้าง setInterval เพื่อ udpate date state ค่าใหม่ทุกๆ 1 วินาที
    let timerID = setInterval(() => updateDate(new Date()), 1000);

    // เราต้อง return function สำหรับ clear interval ด้วยเมื่อ component ถูกเอาออกจาก UI tree
    return () => clearInterval(timerID);
  });

  // สุดท้ายเราเขียนส่วน UI element ของ component ของเรา โดยที่ {} ใช้เพื่อ render TypeScript value
  return (
    <div>
      <h1>Clock</h1>
      <h1>{date.toLocaleString()}</h1>
    </div>
  );
}

// สุดท้าย export Component เราออกไปด้วยสำหรับ module นี้
export default Clock;

```

จากนั้นเราไปแก้โค้ดใน index.tsx ให้มาเรียกใช้ Clock component ของเราแบบนี้

```typescript
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import Clock from './Clock';

ReactDOM.render(
  <React.StrictMode>
    <Clock />
  </React.StrictMode>,
  document.getElementById('root')
);

```

แล้วลองสั่งให้รันด้วย `yarn start` ทีนี้เข้าไปที่ `localhost:3000` ก็จะได้หน้าเว็บที่แสดง clock แบบนี้

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/qkf2gq2lx3k2wxxgtmka.png)