คำว่า onClick (ตัว C ใหญ่) ที่เราใช้ใน JSX ไม่ได้เป็นแค่ "ตัวสะกดแปลก ๆ" แต่มีความเกี่ยวข้องลึกกับ JavaScript, JSX, DOM, และ React
ทำไมใน JSX เขียน onClick ไม่ใช่ onclick?
เพราะใน JSX เรากำลังเขียน JavaScript object syntax ที่ map ไปยัง DOM properties ไม่ใช่ HTML attributes
อธิบายแบบเข้าใจง่ายๆก็คือ
HTML ใช้ attribute → lowercase:
- onclick = attribute ที่ browser อ่านได้จาก HTML
<!-- HTML ธรรมดา -->
<button onclick="alert('hi')">Click</button>
JSX ไม่ใช่ HTML → เป็น JavaScript
- onClick = property ของ JavaScript object
<button onClick={() => alert("hi")}>Click</button>
React จะเอาค่าใน JSX ไปแปลงเป็น JavaScript เช่น:
React.createElement("button", {
onClick: () => alert("hi")
});
ที่สำคัญ: ใน DOM จริง ๆ onClick คือ property ของ DOM element (HTMLElement.prototype.onclick)
ชื่อ property ใน JavaScript = camelCase
ดังนั้น...
มุมมอง | ใช้แบบไหน | เพราะอะไร |
---|---|---|
HTML (แท้ ๆ) | onclick |
เป็น HTML attribute |
JSX (React) | onClick |
เป็น JavaScript property (camelCase) |
เกี่ยวข้องกับ object key ไหม?
เกี่ยว! เพราะ JSX จะถูกแปลงเป็น JavaScript object
และ key ของ object (เช่น onClick) ต้องเขียนให้ตรงกับ property ชื่อจริงใน DOM API
ซึ่งเป็น camelCase ตาม JavaScript convention
ตัวอย่าง JSX → JS:
<input type="text" onChange={handleChange} />
--> จะกลายเป็น:
React.createElement("input", {
type: "text",
onChange: handleChange
});
สรุป
- onClick = React ใช้ JavaScript syntax → ต้อง camelCase
- JSX ไม่ใช่ HTML → React จึงไม่ใช้ onclick แบบ HTML
- เกี่ยวข้องกับ object key เพราะ JSX = การส่ง props เป็น object
- React จะ map key เช่น onClick ไปยัง DOM property element.onclick = ...
โบนัส
การที่เราใช้ { สองครั้งใน JSX ของ React เพื่อกำหนด style นั้น เกี่ยวข้องกับการส่ง JavaScript object เข้าไป ใน props ของ JSX โดยตรง ซึ่งเรามาอธิบายกันแบบเข้าใจง่ายๆ:
🔍 โครงสร้างของ style ใน JSX
เมื่อเราเขียน JSX แบบนี้:
<div style={{ color: 'red' }}>Hello</div>
มันมี { สองระดับเพราะว่า:
- ชั้นนอก { ... }: เป็นการบอก React ว่า “ค่าที่อยู่ภายในนี้เป็น JavaScript expression” ไม่ใช่ string ธรรมดา
- ชั้นใน { color: 'red' }: คือ JavaScript object ที่ใช้แทน CSS
🔁 เปรียบเทียบกับ HTML ปกติ
ใน HTML ปกติ:
<div style="color: red;">Hello</div>
style คือ string
แต่ใน React JSX เราไม่ใช้ string — เราใช้ object แทน เพราะ React ต้องการให้ style ถูกจัดการเป็น JavaScript object
✅ ตัวอย่างเพิ่มเติม
const myStyle = {
backgroundColor: 'blue',
fontSize: '20px'
};
function MyComponent() {
return <div style={myStyle}>Styled div</div>;
}
หรือแบบ inline:
<div style={{ backgroundColor: 'yellow', padding: '10px' }}>Nice!</div>
🚫 ถ้าใช้ { ครั้งเดียวจะเกิดอะไร?
ถ้าเขียนแบบนี้:
<div style={ color: 'red' }>Hello</div> // ❌ Error!
จะได้ error เพราะ React จะไม่เข้าใจว่า color: 'red' คืออะไร — ต้องห่อมันใน object ก่อน
Syntax | ความหมาย |
---|---|
{ ... } |
JSX expression (JS code) |
{ key: value } |
JavaScript object (CSS แบบ object) |
ดังนั้น style={{ color: 'red' }} → ชั้นนอกคือ JSX expression, ชั้นในคือ CSS object ครับ
Top comments (0)