PublishedAt

React

เริ่มต้นหัดเขียน React.js กันดีกว่า (อัพเดทปี 2025)

เริ่มต้นหัดเขียน React.js กันดีกว่า (อัพเดทปี 2025)

สวัสดีครับ วันนี้จะมาแนะนำการเริ่มต้นเขียน React.js ฉบับปี 2025 สำหรับผู้ที่เพิ่งเริ่มศึกษานะครับ โดยบทความจะเน้นไปที่ตัวอย่าง แนะนำโค๊ด เพื่อให้เห็นภาพ มากกว่าทฤษฎีนะครับ แต่ก็มีอธิบายไว้คร่าวๆ เช่นกัน (จริงๆ แนะนำ ว่าควรลงมือเขียนโค๊ดไปด้วยเลยครับ)

React
React is the library for web and native user interfaces. Build user interfaces out of individual pieces called components written in JavaScript. React is designed to let you seamlessly combine components written by independent people, teams, and organizations.react.dev

ก่อนหน้านี้ผมเคยเขียนไว้ 2 บทความ เกี่ยวกับ เริ่มต้นเขียน React.js ซึ่งบทความแรก ก็ 10ปีได้แล้ว และบทความที่ 2 ก็ตั้ง7ปีแล้ว

ควรรู้อะไรมาก่อนบ้าง?

  1. แน่นอน ต้องพอมีพื้นฐาน HTML, CSS และ JavaScript มาก่อน
  2. ติดตั้ง Node.js หรือสามารถใช้คำสั่งพื้นฐาน เพื่อติดตั้ง library หรือสร้างโปรเจ็คได้
  3. Command Line พื้นฐาน สามารถเปิด Terminal เป็น

React คืออะไร?

  • เป็น JavaScript Library สำหรับสร้าง User Interface (UI) ที่พัฒนาโดย Facebook (Meta)
  • ใช้แนวคิด Component-Based คือแบ่ง UI เป็นส่วนย่อยๆ ที่สามารถนำกลับมาใช้ซ้ำได้
  • มี Virtual DOM ที่ช่วยจัดการประสิทธิภาพในการอัพเดท UI
  • ใช้ JSX ซึ่งเป็นการผสมผสาน JavaScript กับ HTML หรือมองคล้ายๆ XML ก็ได้เช่นกัน

เริ่มต้นเรียนรู้ React

React มีเอกสารและแหล่งเรียนรู้มากมายให้เราได้ศึกษา สามารถศึกษาเพิ่มเติมได้จาก links ข้างล่างประกอบได้เช่นกัน:

Quick Start – React
The library for web and native user interfacesreact.dev
Tutorial: Tic-Tac-Toe – React
The library for web and native user interfacesreact.dev
React Reference Overview – React
The library for web and native user interfacesreact.dev

พื้นฐาน React

ตัวนามสกุลของไฟล์จะเป็น .jsx หรือ .tsx (สำหรับ TypeScript) เราสามารถใช้ react library จาก cdn หรือ download ไฟล์ js มาไว้ที่ local แต่ที่นิยมคือ ใช้ vite หรือ Rsbuild ซึ่งเป็น Build tool ช่วย (เดี๋ยวจะอธิบายรายละเอียดเพิ่มเติมครับ)

JSX

JSX คือ extension ของ JavaScript ที่ให้เราสามารถเขียน คล้ายๆกับ HTML tag ลงใน JavaScript อารมณ์คล้ายๆกับ รวม HTML กับ JavasScript ไว้ที่เดียวกัน

ตัว JSX มีกฎข้อบังคับอยู่เล็กน้อย เช่น

  1. return ต้องเป็น single root element

ตัวอย่างเช่น ถ้าเราจะ return elements หลายๆตัว เราต้อง wrap ด้วย single parent tag ก่อน เช่น <div> ตัวอย่าง

// ❌ แบบนี้ไม่ได้
<h1>Hello</h1>
<p>This is paragraph</p>
// ✅ ต้องหุ้มด้วย div ให้เป็น single tag
<div>
<h1>Hello</h1>
<p>This is paragraph</p>
</div>
  1. ต้องปิด tag ทุกครั้ง ถ้า html ธรรมดา เราสามารถทำได้เช่น <img> แต่ใน JSX เราต้องเป็นแบบนี้
<img />
  1. ใช้ camelCase เกือบทุกสิ่งอย่าง หลักๆ ก็เช่น class ใน JSX เราจะใช้เป็น className
// HTML
<div class="header"></div>
// JSX
<div className="header"></div>
Writing Markup with JSX – React
The library for web and native user interfacesreact.dev

อ่านเพิ่มเติมเกี่ยวกับการเขียน JSX

Components

  • มองทุกอย่างเป็น Component (naming convention แนะนำ ตั้งชื่อขึ้นต้นด้วยตัวใหญ่)
  • Component คือ ชิ้นส่วนของ UI ที่เราสร้างขึ้นมา สามารถ reuse ใช้ซ้ำได้ โค๊ดเป็นระเบียบ หน้าตาคล้ายๆ element อื่นๆ ของ HTML และเราตั้งชื่อได้อิสระ เช่น <MyComponent />
  • Component สามารถเขียนได้ 2 แบบ คือ
    1. Function Component (ปัจจุบัน นิยมใช้วิธีนี้)
    2. Class Component (วิธีแบบเก่า)

ตัวอย่าง Function Component:

function Greeting() {
return <h1>Hello, React!</h1>
}

เวลานำไปใช้งาน ก็คือเรียกแบบนี้ (หากไม่มี children สามารถใส่ self closing tag ได้เลย)

<Greeting />
// หรือแบบนี้ (ถ้าไม่มี children แนะนำ แบบ self closing tag ครับ)
<Grreting></Greeting>

Props

Props ใน React จะคล้ายๆกับ attribute ของ element เป็นข้อมูลที่เราสามารถส่งไปให้ component ได้ ถ้าลองนึกถึง tag html <img> มี attributes เป็น src และ alt ใช่มั้ย

<img src="/path/to/image" alt="Image" />
  • Props เป็น read-only ไม่สามารถแก้ไขค่าได้โดยตรงใน Component
  • สามารถส่ง Props ได้หลายรูปแบบ เช่น string, number, array, object, function

ทีนี้ React Component ถ้าเราอยากให้มันรับข้อมูลภายนอก เราก็ต้องทำแบบ <img> เช่น ผมสร้าง Greeting component ขึ้นมา ก่อนหน้านี้มีแค่ Hello React เราก็เพิ่ม message ลงไป

function Greeting(props) {
return <h1>Hello, {props.name}!</h1>
}

เวลาใช้งาน ก็ส่งค่า ไปกับ props ชื่อ name แบบนี้เลย

<Greeting name="React!" />

หรือการส่งจาก Parent Component ไปยัง Child Component:

function ParentComponent() {
return <ChildComponent title="Hello from Parent" />
}
function ChildComponent({ title }) {
return <h1>{title}</h1>
}

State

State เป็นเหมือนข้อมูลที่ component นั้นๆ (ต่างจาก props นะครับ ที่ข้อมูลมาจากข้างนอก component) และเมื่อข้อมูล state มีการเปลี่ยน Component ก็จะทำการ re-render (แสดงผลใหม่) เพื่อให้หน้าเว็บอัพเดทข้อมูลที่เปลี่ยนไป

้ถ้าให้พูดง่ายๆ คือ State ก็คล้ายๆ หน่วยความจำของ Component ที่ใช้เก็บข้อมูล

การใช้ state ใน React เราจะใช้ผ่าน useState ตัว useState จะ return array มา 2ช่อง ช่องแรก เป็นค่า state ที่เราจะเก็บ ค่าที่สองเป็น function ที่เราต้องการจะ update ค่า state

การจัดการ State ด้วย useState Hook:

import { useState } from 'react'
function Counter() {
const [count, setCount] = useState(0)
return <button onClick={() => setCount(count + 1)}>Clicked {count} times</button>
}

อธิบายนิดนึงเกี่ยวกับ Array destructuring ตรงนี้

const [count, setCount] = useState(0)

ถ้าใครงง มันคือการเขียนแบบนี้

const stateArray = useState(0)
const count = stateArray[0]
const setCount = stateArray[1]

และใน React ecosystem จะนิยมเขียนแบบ Array destructuring นะครับ หวังว่าจะไม่งงเนอะ

สร้าง Project ด้วย Vite

หลังจากรู้จัก Component, Props และ State ไปแล้ว ลองมาเขียนโค๊ดกันดีกว่า ลองเขียน ลองฝึก ดีกว่าอ่านอย่างเดียว ลุย

Vite
Next Generation Frontend Toolingvite.dev
Rsbuild
Rsbuild is a high-performance build tool powered by Rspack. It provides out-of-the-box setup for enjoyable development experience.rsbuild.dev

เราจะใช้ vite ในการสร้างโปรเจ็ค React กันนะครับ เปิด terminal ขึ้นมา แล้วรันตามนี้

Terminal window
npm create vite@latest my-app -- --template react

ตัวอย่าง ตั้งชื่อโปรเจ็คว่า my-app จากนั้น ติดตั้ง dependencies ที่ folder my-app

Terminal window
cd my-app
npm install

ลอง start server

Terminal window
npm run dev

จะได้หน้าเว็บที่ url http://localhost:5173

Terminal window
VITE v6.3.5 ready in 376 ms
Local: http://localhost:5173/
Network: use --host to expose
press h + enter to show help

Vite start project

ลองทำการเปิด project สำหรับไฟล์ และลองทำความเข้าใจโค๊ดก่อน ลองแก้ไขไฟล์ src/App.jsx แล้วเซฟดูการเปลี่ยนแปลงครับ

มาลองสร้าง Component ส่ง props สร้าง state กันดูบ้าง จากไฟล์ src/App.jsx เราจะทำการสร้าง component ชื่อ <Counter> เพื่อเอาไว้แสดงปุ่ม button

src/App.jsx
import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'
function App() {
const [count, setCount] = useState(0)
return (
<>
<div>
<a href="https://vite.dev" target="_blank">
<img src={viteLogo} className="logo" alt="Vite logo" />
</a>
<a href="https://react.dev" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
</div>
<h1>Vite + React</h1>
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>count is {count}</button>
<p>
Edit <code>src/App.jsx</code> and save to test HMR
</p>
</div>
<p className="read-the-docs">Click on the Vite and React logos to learn more</p>
</>
)
}
export default App

ยกเอาส่วน ใน class card ไปสร้างใหม่เป็น Counter.jsx สร้างไว้ใน folder ใหม่ชื่อ components (ลบ <p> ตรง Edit code ออก)

components/Counter.jsx
const Counter = () => {
return (
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>count is {count}</button>
</div>
)
}
export default Counter

ทีนี้ จะมี error คือมันไม่รู้จัก count และ setCount เราก็จะใช้วิธีรับมาจาก props แบบนี้

components/Counter.jsx
const Counter = ({ count, setCount }) => {
return (
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>count is {count}</button>
</div>
)
}
export default Counter

ในส่วน App.jsx เราก็ใช้ <Counter> แทนที่เก่า ส่ง props ไปด้วย แบบนี้

App.jsx
import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'
import Counter from './components/Counter'
function App() {
const [count, setCount] = useState(0)
return (
<>
<div>
<a href="https://vite.dev" target="_blank">
<img src={viteLogo} className="logo" alt="Vite logo" />
</a>
<a href="https://react.dev" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
</div>
<h1>Vite + React</h1>
<Counter count={count} setCount={setCount} />
<p className="read-the-docs">Click on the Vite and React logos to learn more</p>
</>
)
}
export default App

ผลลัพธ์ไม่มีอะไรเปลี่ยน เราแค่ย้ายโค๊ดไปเป็น Component

ทีนี้ สมมติเราอยากได้ปุ่ม Counter 3-4 ตัว การทำแบบนี้ มีปัญหาแน่ๆ เพราะว่า เวลาคลิ๊กแค่อันแรก แต่อันอื่นๆ ก็แสดง จำนวน click แชร์กันทั้งหมด

App.jsx
<Counter count={count} setCount={setCount} />
<Counter count={count} setCount={setCount} />
<Counter count={count} setCount={setCount} />

Counter

ถ้ากรณีแบบนี้ เราก็ต้องทำการเก็บ state ของใครของมัน ไว้ใน component แทนที่จะไว้ข้างนอก นั่นเอง (ทั้งนี้ทั้งนั้น การออกแบบว่าจะเป็น state หรือ props ไม่มีตายตัวครับ ขึ้นอยู่กับความต้องการและจุดประสงค์ของเรา)

เปลี่ยน Counter.jsx ให้ใช้ state ในตัวเอง

/components/Counter.jsx
import { useState } from 'react'
const Counter = () => {
const [count, setCount] = useState(0)
return (
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>count is {count}</button>
</div>
)
}
export default Counter

และส่วน src/App.jsx ส่วนที่ render Counter เราก็จะเหลือแค่นี้

src/App.jsx
<Counter />
<Counter />
<Counter />

CSS ใน React

การเขียน CSS ใน react component ทำได้หลายวิธีครับ ตัวอย่างแรก

  1. inline styles - กำหนดผ่าน attribute style ไปตรงๆ ในรูปแบบ JavaScript object ธรรมดาเลย key, value (แต่ property จะเป็นรูปแบบ camelCase)
const myStyle = {
color: 'red',
backgroundColor: 'green',
fontSize: '20px'
}
return <p style={myStyle}>>Hello</p>
  1. ไฟล์ css ธรรมดา แบบเดียวกับที่เราเขียน HTML/CSS ปกติเลย ใช้งานก็แค่ import file css แล้วก็จะเป็น className แทน class
style.css
.my-class {
color: red;
background-color: green;
font-isze: 20px;
}

ใช้งาน

import './style.css'
return <p className="my-class">Hello</p>
  1. CSS Module - คล้ายๆกับแบบ css ธรรมดา แต่จะแก้ปัญหาเรื่อง global scope ของ CSS ไม่ให้ชนกัน เนื่องจากมันจะสร้าง class name แบบ unique ให้เราอัตโนมัติ เมื่อเรา import css ไปใน component

หลักการคือ ต้องสร้างไฟล์ css ลงท้ายด้วย .module เช่น styles.module.css

styles.module.css
.myClass {
color: red;
background-color: green;
font-isze: 20px;
}

การใช้งาน ก็ import มาแบบเดียวกัน

import styles from './styles.module.css'
return <p className={styles.myClass}>Hello</p>

โดยตัวอย่าง styles.myClass จะถูกแปลงเป็น Component_RandomHash ครับ

Conditional Rendering

เราสามารถแสดงผลแบบมีเงื่อนไขใน React ได้ ตัวอย่างเช่น สมมติ เรามี condition ใน render component นี้ โดยเช็คว่า user logged in อยู่หรือเปล่า เราก็จะใช้ประมาณนีี้ครับ

function Greeting({ isLoggedIn }) {
// แบบที่ 1. ใช้ ternary operator
return <div>{isLoggedIn ? <h1>Welcome back!</h1> : <h1>Please log in</h1>}</div>
}
// แบบที่ 2. ใช้ && operator
function Notification({ message }) {
return <div>{message && <p>{message}</p>}</div>
}

ทีนี้ ลองมาปรับ logic แก้ Counter เล่นๆ ให้แสดงเลขคู่/คี่ คนละสี ก็จะเป็นแบบนี้

/components/Counter.jsx
import { useState } from 'react'
const Counter = () => {
const [count, setCount] = useState(0)
const blue = { color: 'blue' }
const red = { color: 'red' }
const countStyle = count % 2 === 0 ? blue : red
return (
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>
count is <span style={countStyle}>{count}</span>
</button>
</div>
)
}
export default Counter

Lists และ Keys

การแสดงผล List ใน React เราจะใช้ Arrap map แบบ JavaScript ได้เลย แบบนี้

function TodoList() {
const todos = [
{ id: 1, text: 'ตื่นนอน' },
{ id: 2, text: 'อาบน้ำ' },
{ id: 3, text: 'กินข้าว' }
]
return (
<ul>
{todos.map((todo) => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
)
}
  • ต้องกำหนด key ให้กับแต่ละ item ใน list เสมอ
  • key ควรเป็นค่าที่ unique ในระดับของ list นั้นๆ

สรุป

ทั้งหมดนี้เป็นพื้นฐานเบื้องต้นของ React นะครับ ยังมีอีกหลายเรื่องที่น่าสนใจเช่น Form, Event, Data Fetching, Context API, Custom Hooks, Error Boundaries, และอื่นๆ อีกมากมาย แนะนำให้ลองศึกษาเพิ่มเติมจากเอกสารอ้างอิงที่ให้ไว้ข้างต้นครับ

สุดท้ายนี้ขอให้สนุกกับการเรียนรู้ React นะครับ หวังว่าบทความนี้จะเป็นประโยชน์กับผู้ที่กำลังเริ่มต้นศึกษา React ไม่มากก็น้อยครับ

Happy Coding ❤️

แหล่งเรียนรู้ต่อเพิ่มเติม

Quick Start – React
The library for web and native user interfacesreact.dev
React Foundations | Next.js
Learn the fundamental JavaScript and React concepts that'll help you get started with Next.js.nextjs.org
Learn React | Codecademy
Learn React in our course for front-end web development. Create interactive user interfaces and dynamic web apps.codecademy.com
React Developer Roadmap: Learn to become a React developer
Community driven, articles, resources, guides, interview questions, quizzes for react development. Learn to become a modern React developer by following the steps, skills, resources and guides listed in this roadmap.roadmap.sh
roadmap.sh
Authors
avatar

Chai Phonbopit

เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust

Related Posts