Skip to content

Instantly share code, notes, and snippets.

@XaveScor
Last active April 15, 2021 20:36
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save XaveScor/7d8282a578732c74be5b7daddd1f60bc to your computer and use it in GitHub Desktop.
Save XaveScor/7d8282a578732c74be5b7daddd1f60bc to your computer and use it in GitHub Desktop.
Неочевидности реакта

Хуки и componentWillUnmount

С первого взгляда аналог componentWillUnmount очень прост:

function useWrongUnmount(f) {
  useEffect(() => () => f(), [])
}

Если вы гляните на всякие react-awesome, то увидите, что всякие библиотеки хуков используют именно эту имплементацию:

Но это неверная имплементация. Очень простой тест проверяет это

const [state, setState] = useState('')

useWrongUnmount(() => console.log(state))

В итоге в замыкание к useWrongUnmount попадёт только начальное значение state.

Верная реализация будет выглядеть так:

function useUnmount(f) {
  const fWrapper = React.useRef(f)
  if (fWrapper.current != f) {
    fWrapper.current = f
  }
  React.useEffect(() => () => fWrapper.current(), []) 
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment