ข้ามไปยังเนื้อหา

Events

React คิดค้น synthetic event ขึ้นมาพร้อม handler prop แบบ camelCase (onClick, onChange, onSubmit) ส่วน Svelte 5 ตัด syntax พิเศษพวกนี้ทิ้งไปทั้งหมด — event handler ก็แค่ HTML attribute ตัวพิมพ์เล็ก ชื่อเดียวกับที่ browser ใช้ (onclick, oninput, onsubmit) ถ้าคุณรู้วิธีเขียน attribute onclick ในไฟล์ HTML ธรรมดา คุณก็รู้วิธีใช้ event ของ Svelte แล้ว

React
function Counter() {
const [count, setCount] = React.useState(0);
return (
<button onClick={() => setCount(c => c + 1)}>
Count: {count}
</button>
);
}
Svelte
<script>
let count = $state(0);
</script>
<button onclick={() => count++}>
Count: {count}
</button>

จุดสำคัญ:

  • React: onClick (O ตัวใหญ่ C ตัวใหญ่) ส่วน Svelte 5: onclick (ตัวพิมพ์เล็กทั้งหมด)
  • React ต้องมี setter function จาก useState ส่วน Svelte 5 mutate $state ได้ตรง ๆ — count++ ก็ใช้ได้เลย
  • ใน Svelte 5 directive on:click แบบเก่าจาก Svelte 4 หายไปแล้ว ให้ใช้ onclick ตัวพิมพ์เล็กเสมอ

inline arrow function ใช้ได้ดีสำหรับเคสง่าย ๆ แต่ถ้าอยากให้อ่านง่ายขึ้นก็แยกออกมาเป็น named function:

React
function Form() {
const [value, setValue] = React.useState('');
function handleChange(e) {
setValue(e.target.value);
}
return <input value={value} onChange={handleChange} />;
}
Svelte
<script>
let value = $state('');
function handleInput(e) {
value = e.target.value;
}
</script>
<input {value} oninput={handleInput} />

หมายเหตุ: สำหรับ two-way binding ของ input นั้น bind:value สะอาดกว่า (จะพูดถึงในบทเรียน Bindings) ที่ยกแพตเทิร์น named handler มาให้ดูตรงนี้ก็เพราะแมปตรง ๆ กับแพตเทิร์น onChange ของ React

คุณเข้าถึง native DOM event ได้เต็มที่ — ไม่มี synthetic wrapper มาครอบ:

React
function KeyLogger() {
const [key, setKey] = React.useState('');
return (
<input
onKeyDown={e => setKey(e.key)}
placeholder="Press a key"
/>
);
}
Svelte
<script>
let key = $state('');
</script>
<input
onkeydown={e => (key = e.key)}
placeholder="Press a key"
/>
{#if key}
<p>Last key: <kbd>{key}</kbd></p>
{/if}
คุณ attach click handler ใน Svelte 5 อย่างไร?
Svelte 4 ใช้ "on:click" แล้วมีอะไรเปลี่ยนไปใน Svelte 5?
คุณอยากเรียก e.preventDefault() ตอน submit form ใน Svelte 5 ต้องทำอย่างไร?
Svelte 5 ส่งอะไรเป็น event argument ให้กับ handler?