В основном мы связываем функции обработчика событий в конструкторе или делаем их как стрелочные функции в компонентах класса React, как показано ниже.
class Test extends Component{
constructor(props){
super(props);
this.state = { count:0 };
this.setCount = this.setCount.bind(this);
}
setCount() {
this.setState({count: this.state.count + 1});
}
render() {
return <button onClick = {this.setCount}>Increase</button>
}
}
Но после того, как в React v16.7.0 были введены хуки, компоненты класса стали функциональными компонентами с состоянием.
Итак, как я могу связать функцию с крючками в функциональном компоненте?
вам не нужно, если вы используете функцию стрелки
Хорошо, что, если я использую метод подключения Redux с mapStateToProps. Как я могу получить доступ к реквизитам в функциональном компоненте, таком как this.props, или просто в реквизитах?
Вы просто используете props ... а не this.props



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Нет необходимости связывать функции / обратные вызовы в функциональных компонентах, поскольку в функциях нет this. В классах было важно привязать this, потому что мы хотим убедиться, что this в обратных вызовах ссылается на сам экземпляр компонента. Однако выполнение .bind в конструкторе имеет еще одно полезное свойство - создавать функции однажды в течение всего жизненного цикла компонента, и новый обратный вызов создавался не при каждом вызове render(). Чтобы инициализировать обратный вызов только один раз, используя перехватчики React, вы должны использовать useCallback.
class Foo extends Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.info('Click happened');
}
render() {
return <Button onClick = {this.handleClick}>Click Me</Button>;
}
}
function Foo() {
const memoizedHandleClick = useCallback(
() => {
console.info('Click happened');
},
[], // Tells React to memoize regardless of arguments.
);
return <Button onClick = {memoizedHandleClick}>Click Me</Button>;
}
Спасибо. Разве я не могу написать функцию обработчика событий, такую как const memoizedHandleClick = () => {console.info ('Нажатие произошло'); }?
@ Думай дважды, да, ты можешь. Но он будет воссоздавать обработчик при каждом рендеринге (так же, как при использовании стрелочных функций в render() на основе классов).
Хорошо, что такое useCallback? Это предопределенное имя?
Да это еще один крючок. Вы читали документы? Вы должны проверить весь раздел о хуках: reactjs.org/docs/hooks-intro.html
Вы могли бы также написать компонент Foo, описанный выше, таким образом и сэкономить время на вводе текста. Обратите внимание на синтаксис handleClick ... он определяет закрытие handleClick как поле в Foo, а не как метод. Это избавляет вас от необходимости использовать привязку для перезаписи ссылки на объект handleClick в конструкторе. (Кроме того, вам не нужно определять конструктор, если вы просто вызываете «супер»!)
class Foo extends Component {
handleClick = () => {
console.info('Click happened');
}
render() {
return <Button onClick = {this.handleClick}>Click Me</Button>;
}
}
Точно так же для вашего исходного примера просто объявите state и setCount напрямую и упростите свой код:
class Test extends Component{
state = {count: 0}
setCount = () => {
this.setState({count: this.state.count + 1});
}
render() {
return <button onClick = {this.setCount}>Increase</button>
}
}
Это просто альтернативный подход к решению проблемы привязки для компонентов класса. OP спрашивает, как это решается для функциональных компонентов.
Люди приходят в SO и копируют код. Оставьте этот ответ здесь, чтобы сообщество React не ошибалось в запоминании всего и, возможно, выполняло больше работы, чем необходимо.
function Foo() {
const handleClick = function(){
// use function statements to avoid creating new instances on every render
// when you use `bind` or arrow functions
console.info('memoizing can lead to more work!')
};
return <Button onClick = {handleClick}>Click Me</Button>;
}
Совет: посмотрите, какой код передается при использовании useCallback, и посмотрите, нужен ли он, прежде чем вставлять его. Если вы не уверены, что он вам нужен, вероятно, нет. и чтобы быть уверенным, что это приносит вам пользу, профилируйте его.
Нет необходимости связывать функцию в функциональном компоненте, поскольку вы не используете
this.