react hooks

如果你曾經使用過 React,你應該對 React 生命週期的強大有一定的了解。即將推出的 React Hooks 將改變我們處理生命週期的方式。

React Hooks 是現有功能的統一,包括狀態和生命週期。在這篇文章中,我將向你展示如何將生命週期的類別方法轉換為 React Hooks,以深入了解 React Hooks。

對於三個最常見的生命週期方法 (componentDidMount、componentDidUpdate、componentWillUnmount),我將展示一個類別樣式的實現和一個 Hooks 樣式的對應實現,然後解釋其背後的原理。

componentDidMount

class Example extends React.Component {
  componentDidMount() {
    console.log('我已經掛載!');
  }
  render() {
    return null;
  }
}
function Example() {
  useEffect(() => console.log('掛載'), []);
  return null;
}

useEffect 是一個 React hook,你可以在其中應用副作用,例如從伺服器獲取資料。

第一個參數是一個回調函數,該回調函數會在瀏覽器布局和繪製之後觸發。因此,它不會阻塞瀏覽器的繪製過程。

第二個參數是一個值的陣列(通常是 props)。

  • 如果陣列中的任何一個值發生變化,回調函數將在每次渲染後觸發。
  • 當該參數不存在時,回調函數將在每次渲染後都會被觸發。
  • 當它是一個空列表時,回調函數只會觸發一次,類似於 componentDidMount。

componentDidUpdate

componentDidMount() {
  console.log('已掛載或更新');
}

componentDidUpdate() {
  console.log('已掛載或更新');
}
useEffect(() => console.log('已掛載或更新'));

在 Hooks 中並沒有直接取代 componentDidUpdate 的實現。useEffect 函數可用於在組件每次渲染後觸發回調,包括在組件掛載和組件更新後。

不過這並不是一個大問題,因為大多數情況下我們會將相似的函數放在 componentDidMount 和 componentDidUpdate 中。

單獨模仿 componentDidUpdate 可以成為另一篇文章的討論主題。

componentWillUnmount

componentWillUnmount() {
  console.log('將卸載');
}
useEffect(() => {
  return () => {
    console.log('將卸載');
  }
}, []);

當你在傳遞給 useEffect 的回調中返回一個函數時,該返回的函數將在組件從 UI 中移除之前被調用。

如我們之前所討論的,我們需要將空列表作為 useEffect 的第二個參數傳遞,以便回調函數只會被調用一次。這同樣適用於返回的函數。

通常我們在 componentWillUnmount 中進行清理。假設你想在 componentDidMount 時創建一個事件監聽器,並在 componentWillUnmount 時進行清理。使用 Hooks 時,這段代碼將合併到一個回調函數中。

我們可以為不同的副作用創建多個 Hooks 並重複使用它們。將相關代碼分組並使狀態管理可重用是 React Hooks 的主要目的之一。

useEffect vs useLayoutEffect

現在我們可以將 componentDidMount、componentDidUpdate 和 componentWillUnmount 轉換為 React Hooks,太好了!

但是,等等,還有一個問題:這兩種樣式的效果並不完全相同。

與 componentDidMount 和 componentDidUpdate 不同,傳遞給 useEffect 的函數在布局和繪製之後觸發,在一個延遲事件中。

通常這不是問題。但如果你想在效應中操作 DOM,並且希望在瀏覽器繪製之前確保它發生,你需要使用 useLayoutEffect。語法與 useEffect 一樣。

總結

總結來說,我們可以使用 useEffect hook 來取代生命週期方法,但它們並不完全相同。在使用它們時,儘量用 Hooks 的思維方式!

參考文獻


原文出處:https://dev.to/trentyang/replace-lifecycle-with-hooks-in-react-3d4n


共有 0 則留言