TL; DR
В указанном вами примере c useCallback
используется для генерации ссылочного свойства для передачи другому компоненту в качестве реквизита. Вы делаете это, просто создав bound
метод (вам не нужно беспокоиться о dependencies
, как вы это делаете с хуками, потому что все «зависимости» поддерживаются в вашем экземпляре как props или state.
class Movie extends Component {
constructor() {
this.state = {
loading:true,
error:false,
}
}
fetchMovie() {
this.setState({error:false,loading:true});
try {
// await fetch
this.setState({
...
})
} catch(error) {
this.setState({error});
}
}
fetchMovieProp = this.fetchMovie.bind(this); <- this line is essentially "useCallback" for a class component
render() {
return <SomeOtherComponent fetchMovie={this.fetchMovieProp}/>
}
}
Немного больше о зацепках функциональных и классовых компонентов
Прекрасная вещь в useCallback
состоит в том, чтобы реализовать его на компоненте класса, просто объявив свойство экземпляра, которое функция (привязанная к экземпляру) и все готово.
Цель useCallback
- ссылочная целостность, поэтому, в основном, ваши React.memo
и React.PureComponent
будут работать правильно.
const MyComponent = () => {
const myCallback = () => { ... do something };
return <SomeOtherComponent myCallback={myCallback}/> // every time `MyComponent` renders it will pass a new prop called `myCallback` to `SomeOtherComponent`
}
const MyComponent = () => {
const myCallback = useCallback(() => { ... do something },[...dependencies]);
return <SomeOtherComponent myCallback={myCallback}/> // every time `MyComponent` renders it will pass THE SAME callback to `SomeOtherComponent` UNLESS one of the dependencies changed
}
Чтобы «копировать» useCallback
в компонентах класса, вам не нужно ничего делать:
class MyComponent extends Component {
method() { ... do something }
myCallback = this.method.bind(this); <- this is essentially `useCallback`
render() {
return <SomeOtherComponent myCallback={this.myCallback}/> // same referential integrity as `useCallback`
}
}
Вы обнаружите, что многие из hooks
в действительности это просто механизмы для создания переменных, которые являются «экземплярами» (подсказка: «экземпляр» - это Fiber )