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

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

ก่อนหน้านี้ผมเคยเขียนไว้ 2 บทความ เกี่ยวกับ เริ่มต้นเขียน React.js ซึ่งบทความแรก ก็ 10ปีได้แล้ว และบทความที่ 2 ก็ตั้ง7ปีแล้ว
ควรรู้อะไรมาก่อนบ้าง?
- แน่นอน ต้องพอมีพื้นฐาน HTML, CSS และ JavaScript มาก่อน
- ติดตั้ง Node.js หรือสามารถใช้คำสั่งพื้นฐาน เพื่อติดตั้ง library หรือสร้างโปรเจ็คได้
- Command Line พื้นฐาน สามารถเปิด Terminal เป็น
React คืออะไร?
- เป็น JavaScript Library สำหรับสร้าง User Interface (UI) ที่พัฒนาโดย Facebook (Meta)
- ใช้แนวคิด Component-Based คือแบ่ง UI เป็นส่วนย่อยๆ ที่สามารถนำกลับมาใช้ซ้ำได้
- มี Virtual DOM ที่ช่วยจัดการประสิทธิภาพในการอัพเดท UI
- ใช้ JSX ซึ่งเป็นการผสมผสาน JavaScript กับ HTML หรือมองคล้ายๆ XML ก็ได้เช่นกัน
เริ่มต้นเรียนรู้ React
React มีเอกสารและแหล่งเรียนรู้มากมายให้เราได้ศึกษา สามารถศึกษาเพิ่มเติมได้จาก links ข้างล่างประกอบได้เช่นกัน:



พื้นฐาน React
ตัวนามสกุลของไฟล์จะเป็น .jsx
หรือ .tsx
(สำหรับ TypeScript) เราสามารถใช้ react library จาก cdn หรือ download ไฟล์ js มาไว้ที่ local แต่ที่นิยมคือ ใช้ vite หรือ Rsbuild ซึ่งเป็น Build tool ช่วย (เดี๋ยวจะอธิบายรายละเอียดเพิ่มเติมครับ)
JSX
JSX คือ extension ของ JavaScript ที่ให้เราสามารถเขียน คล้ายๆกับ HTML tag ลงใน JavaScript อารมณ์คล้ายๆกับ รวม HTML กับ JavasScript ไว้ที่เดียวกัน
ตัว JSX มีกฎข้อบังคับอยู่เล็กน้อย เช่น
- 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>
- ต้องปิด tag ทุกครั้ง ถ้า html ธรรมดา เราสามารถทำได้เช่น
<img>
แต่ใน JSX เราต้องเป็นแบบนี้
<img />
- ใช้
camelCase
เกือบทุกสิ่งอย่าง หลักๆ ก็เช่นclass
ใน JSX เราจะใช้เป็นclassName
// HTML<div class="header"></div>
// JSX<div className="header"></div>

อ่านเพิ่มเติมเกี่ยวกับการเขียน JSX
Components
- มองทุกอย่างเป็น Component (naming convention แนะนำ ตั้งชื่อขึ้นต้นด้วยตัวใหญ่)
- Component คือ ชิ้นส่วนของ UI ที่เราสร้างขึ้นมา สามารถ reuse ใช้ซ้ำได้ โค๊ดเป็นระเบียบ หน้าตาคล้ายๆ element อื่นๆ ของ HTML และเราตั้งชื่อได้อิสระ เช่น
<MyComponent />
- Component สามารถเขียนได้ 2 แบบ คือ
- Function Component (ปัจจุบัน นิยมใช้วิธีนี้)
- 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 ในการสร้างโปรเจ็ค React กันนะครับ เปิด terminal ขึ้นมา แล้วรันตามนี้
npm create vite@latest my-app -- --template react
ตัวอย่าง ตั้งชื่อโปรเจ็คว่า my-app
จากนั้น ติดตั้ง dependencies ที่ folder my-app
cd my-app
npm install
ลอง start server
npm run dev
จะได้หน้าเว็บที่ url http://localhost:5173
VITE v6.3.5 ready in 376 ms
➜ Local: http://localhost:5173/ ➜ Network: use --host to expose ➜ press h + enter to show help
ลองทำการเปิด project สำหรับไฟล์ และลองทำความเข้าใจโค๊ดก่อน ลองแก้ไขไฟล์ src/App.jsx
แล้วเซฟดูการเปลี่ยนแปลงครับ
มาลองสร้าง Component ส่ง props สร้าง state กันดูบ้าง จากไฟล์ src/App.jsx
เราจะทำการสร้าง component ชื่อ <Counter>
เพื่อเอาไว้แสดงปุ่ม button
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 ออก)
const Counter = () => { return ( <div className="card"> <button onClick={() => setCount((count) => count + 1)}>count is {count}</button> </div> )}
export default Counter
ทีนี้ จะมี error คือมันไม่รู้จัก count
และ setCount
เราก็จะใช้วิธีรับมาจาก props แบบนี้
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 ไปด้วย แบบนี้
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 แชร์กันทั้งหมด
<Counter count={count} setCount={setCount} /><Counter count={count} setCount={setCount} /><Counter count={count} setCount={setCount} />
ถ้ากรณีแบบนี้ เราก็ต้องทำการเก็บ state ของใครของมัน ไว้ใน component แทนที่จะไว้ข้างนอก นั่นเอง (ทั้งนี้ทั้งนั้น การออกแบบว่าจะเป็น state หรือ props ไม่มีตายตัวครับ ขึ้นอยู่กับความต้องการและจุดประสงค์ของเรา)
เปลี่ยน Counter.jsx
ให้ใช้ state ในตัวเอง
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 เราก็จะเหลือแค่นี้
<Counter /><Counter /><Counter />
CSS ใน React
การเขียน CSS ใน react component ทำได้หลายวิธีครับ ตัวอย่างแรก
- inline styles - กำหนดผ่าน attribute
style
ไปตรงๆ ในรูปแบบ JavaScript object ธรรมดาเลย key, value (แต่ property จะเป็นรูปแบบcamelCase
)
const myStyle = { color: 'red', backgroundColor: 'green', fontSize: '20px'}
return <p style={myStyle}>>Hello</p>
- ไฟล์ css ธรรมดา แบบเดียวกับที่เราเขียน HTML/CSS ปกติเลย ใช้งานก็แค่ import file css แล้วก็จะเป็น
className
แทนclass
.my-class { color: red; background-color: green; font-isze: 20px;}
ใช้งาน
import './style.css'
return <p className="my-class">Hello</p>
- CSS Module - คล้ายๆกับแบบ css ธรรมดา แต่จะแก้ปัญหาเรื่อง global scope ของ CSS ไม่ให้ชนกัน เนื่องจากมันจะสร้าง class name แบบ unique ให้เราอัตโนมัติ เมื่อเรา import css ไปใน component
หลักการคือ ต้องสร้างไฟล์ css ลงท้ายด้วย .module
เช่น 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. ใช้ && operatorfunction Notification({ message }) { return <div>{message && <p>{message}</p>}</div>}
ทีนี้ ลองมาปรับ logic แก้ Counter เล่นๆ ให้แสดงเลขคู่/คี่ คนละสี ก็จะเป็นแบบนี้
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 ❤️
แหล่งเรียนรู้ต่อเพิ่มเติม


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