如果有錯誤,歡迎留言指教~ Q_Q
就是不在主要的程式執行順序上~~ 在瀏覽器 render 之後才會執行
像是更新取得資料或操作畫面上的 Dom 做些動態效果
而寫的這些事情 function 我們將其稱為「effect」
在 component render (DOM 更新之後),才會執行的這些 effect
如果你比較熟悉生命週期,那可以把 useEffect
當作 componentDidMount
,componentDidUpdate
,與 componentWillUnmount
的組合
但把 effect 想成發生在「render 之後」比較簡單,而不要考慮這時是「mount」還是「update」
在 class component 裡,無論是 mount 或是 update,你需要在兩個地方維護同一份程式碼,雖然你可以寫個共用的 function ,但你還是必須在兩個地方 call function
// 換一下範例好了
componentDidMount() {
document.title = `You clicked ${this.state.count} times`;
}
componentDidUpdate() {
document.title = `You clicked ${this.state.count} times`;
}
用 useEffect
就可以寫一次就好了~
function 就會在 render 後執行
// 換一下範例好了
useEffect(() => {
document.title = `You clicked ${count} times`;
});
在生命週期裡,會在 componentDidMount
中設定好初始要做的事情
然後在 componentWillUnmount
中把它清除釋放掉
那在 Hook 裡面,我們該怎麼做呢?
我們在 useEffect
中 return 執行清除的 function
這使我們可以把 Mount、Update、Unmount 的邏輯都放在一起了~
因為它們都屬於同一個 effect!
useEffect(() => {
let update;
if (updateTab) {
update = setInterval(() => {
cronFetch(updateTab);
}, UPDATE_TIME);
}
// 釋放掉吧!事件移除、取消綁定
return () => clearInterval(update);
}, []);
元件因為狀態(state/props)改變了,觸發 useEffect 產生了什麼效果
useEffect(()=>{
// 做 data 變化後,要做的事情
// 綁定事件
alert('新增成功')
// 事件移除
return () => {
// 取消綁定 removeEventListener
}
},[data]);
// 當依賴的 state 的 data 有變動,useEffect 就會執行
useEffect
帶著兩組參數
第一個是執行的 function
第二個則是該 effect 所依賴的值 array -> 決定要偵測誰才觸發 effect
當遇到什麼事情,這個 array list 有變化時(也可能是空值),就會去執行上面的 function
useEffect(()=>{
console.log('只有第一次 render 會執行')
},[]);
https://codesandbox.io/s/useeffect-r35sw
import { useState, useEffect } from "react";
export default function App() {
const [data, setData] = useState("");
const [value, setValue] = useState("!");
useEffect(() => {
console.log(data);
}, [data]);
return (
<div className="App">
<button
onClick={() => {
console.log("click");
setData(new Date());
}}
>
click
</button>
</div>
);
}
useEffect(()=>{
console.log('每次 render 都會執行')
});
如果 dependencies array 彼此之間沒有相關的話,就拆分不同的 useEffect 吧
要多少 Effect 就多少 Effect ~~~
把邏輯相同的放在一起即可!