Migrate Class Component to Functional Component
Local State
เราสามารถแปลงจาก Class Component ด้านล่างนี้
import React from 'react';
interface MyProps {  message: string;};interface MyState {  count: number;};class App extends React.Component<MyProps, MyState> {  state: MyState = {    // optional second annotation for better type inference    count: 0,  };  render() {    return (      <div>        {this.props.message} {this.state.count}      </div>    );  }}ให้เป็น Functional Component แบบนี้ได้
import React, { useState } from 'react';
interface PropTypes {  message: string;}
function App({ message }: PropTypes){  const [count, setCount] = useState(0);
  return (    <div>      {message} {count}    </div>  );};export default App;ทำไมถึงไม่แนะนำ React.FC หรือ React.FunctionComponent/React.VoidFunctionComponent อ่านรายละเอียดใน Functional Component
Handle Click Event
เราสามารถแปลงจาก Class Component ด้านล่างนี้
import React from 'react';
interface PropTypes {  message: string;}interface StateTypes {  counter: number;}class App extends React.Component<PropTypes, StateTypes> {  state: StateTypes = {    counter: 0  };
  handleClick(amount: number) {    this.setState( state => ({      counter: state.counter + amount    }));  }
  render() {    return (      <div>        <h1>{this.props.message}</h1>        <button onClick={() => this.handleClick(1)}> Increase </button>        <p>{this.state.counter}</p>      </div>    );  }}
export default App;Note: Using an arrow function in render creates a new function each time the component renders, which may break optimizations based on strict identity comparison. Read more at React Official Doc.
ให้เป็น Functional Component แบบนี้ได้
import React, { useState } from 'react';
interface PropTypes {  message: string;}
function App({ message }: PropTypes) {  const [counter, setCounter] = useState(0);
  const handleClick = (amount: number) => {    setCounter(counter + amount);  };
  return (    <div>      <h1>{message}</h1>      <button onClick={() => handleClick(1)}> Increase </button>      <p>{counter}</p>    </div>  );};export default App;componentDidMount() in React Hook
หนึ่งใน React Lifecyle ที่ใช้บ่อยๆ มากๆ คือ componentDidMount() ซึ่งจะทำครั้งแรก ครั้งเดียวเมื่อ Component โหลดเสร็จ
function FirstExecuteComponent() {
  // add event listeners (Flux Store, WebSocket, document, etc.)  useEffect(    () => console.log("Component loaded"),    []  );  return null;}ข้อสังเกตุ useEffect ต้องการรับ 2 parameters ถ้าอยากให้เหมือน componentDidMount() ให้ใส่ Array เปล่าๆ ใน parameters ตัวที่สอง []
componentWillUnmount() in React Hook
อีกหนึ่งใน React Lifecyle ที่มีใช้บ้างคือคือ componentWillUnmount() ซึ่งจะทำงานครั้งสุดท้ายครั้งเดียวก่อนที่ Component ถูกเอาออก (Component is unmounted and destroyed)
function FirstAndLastExecuteComponent() {
  // remove event listeners (Flux Store, WebSocket, document, etc.)  useEffect(    () => {        console.log("Component loaded");        return () => console.log("Component unloaded");    },    []  );  return null;}เราสามารถใช้ประโยชน์จาก function useEffect ได้ ตรงที่ return ของ parameters ตัวแรกของ useEffect โดยเราสามารถ remove event listeners หรือล้างข้อมูลอะไรบางอย่าง ก็ได้ครับ