React 狀態與事件
React 狀態與事件處理程序
- State and Event Handler
- State: 指隨著時間變化資料
- Event Handlers: 指使用者 clicking、hovering、focusing on form 等互動操作時觸發的函數
Convention
- Event Handlers 通常會以 handleEventName 形式來命名,即 handle 起始並以 event 動作結尾。
- handler 通常會與 UI component 綁定並在 UI 元件內實作。
- 注意:
- snapshot,event handler 預期應該是一個 js function。
- 使用時是傳遞註冊 event function 還是呼叫,別不小心加上小括號。
Event
- 指使用者 clicking、hovering、focusing on form 等互動操作時觸發的函數
- 注意編寫 Event Handler 的重要注意事項:
- 事件處理程序的設定方式 (設定與呼叫間的差異)
- 事件處理設計技巧:
- 可以利用 React 元件封裝技巧自行定義新元件的 專屬 event。
Handler 註冊方式: 註冊與呼叫
註冊一個函式
<button onClick={handleClick}>
<button onClick={() => alert('...')}>
錯誤方式,會直接執行doSomething
<button onClick={doSomething()}>
自訂 Event: onSmash
- 範例: 除了自定義的 onSmash event 外,也經由 children 演示客製化元件的外觀動態設定方式。
- onSmash event: 事件
- children component: 外觀
function MyButton({ onSmash, children }) {
return (
<button onClick={onSmash}>
{children}
</button>
);
}
export default function App() {
return (
<div>
<MyButton onSmash={() => alert('Playing!')}>
Play Movie
</MyButton>
<MyButton onSmash={() => alert('Uploading!')}>
Upload Image
</MyButton>
</div>
);
}
// from https://react.dev/
- line 1: props 解構。
- line 3: 封裝自訂 event。
- line 4: 可經由 children 或範例中的 Button 更改 UI component 的外觀。
Propagation 事件傳遞
- 事件傳遞,React UI 元件封裝過程中,預設內部元件(子元件)觸發的 event 活動會引發一連串向外(父元件)脈衝。
- React 若要中斷 event 向外脈衝可採用 e.stopPropagation()。
- 針對非事件類的瀏覽器行為,如 form 的 submit 送交資訊行為。
- e.stopPropagation(): 阻止附加到標籤的 事件處理程序觸發 。
- e.preventDefault(): 阻止特定事件 (ex: form submit) 的 預設瀏覽器行為。
- Propagation_Demo
function Button({ onClick, children }) {
return (
<button onClick={e => {
// e.stopPropagation();
onClick();
}}>
{children}
</button>
);
}
export default function Toolbar() {
return (
<div className="Toolbar" onClick={() => {
alert('You clicked on the toolbar!');
}}>
<Button onClick={() => alert('Playing!')}>
Play Movie
</Button>
<Button onClick={() => alert('Uploading!')}>
Upload Image
</Button>
</div>
);
}
// example from https://react.dev/
客製化元件事件設計技巧
- 封裝一個 Presentation UI 元件,UI 元件利用 Browser 中 button 或 link 等預設的 event 來進行觸發,觸發後的動作則可自行客製。
Concept 演示
- Toolbar 表面看似乎出現特殊的 onPlayMovie、onUploadImage 事件。實際上則是借用 EveneMarkupContainer 的 onClick 事件。
- EveneMarkupContainer 則利用 React 元件父子關係,可自行更換外觀長相。
- Container_Demo
export default function App() {
function Msg({ message }) {
return (
<span>
{message}: customize your view
</span>
);
}
function EveneMarkupContainer({ onClick, children }) {
return (
<div onClick={onClick}>
{children}
</div>
);
}
function Toolbar({ onPlayMovie, onUploadImage }) {
return (
<div>
<EveneMarkupContainer onClick={onPlayMovie} >
<Msg message={'Play Movie!'}></Msg>
</EveneMarkupContainer>
<EveneMarkupContainer onClick={onUploadImage}>
Upload Image
</EveneMarkupContainer>
</div>
);
}
return (
<Toolbar
onPlayMovie={() => alert('Playing!')}
onUploadImage={() => alert('Uploading!')}
/>
);
}
//example from https://react.dev/learn/adding-interactivity