Last active
May 15, 2025 11:26
-
-
Save sunmeat/b9825f773352a1cb860c6e4b5aebf8a5 to your computer and use it in GitHub Desktop.
вызов функции обратного вызова для родителя (callbacks)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Content.jsx (родительская компонента): | |
import './Content.css'; | |
import {useContext, useState} from 'react'; | |
import {AppContext} from '../../contexts/AppContext.jsx'; | |
import {MyButton} from '../mybutton/MyButton.jsx'; | |
export function Content() { | |
const {theme, user} = useContext(AppContext); | |
// состояние для хранения количества кликов | |
const [count, setCount] = useState(0); | |
// !!! функция-обратный вызов для обработки клика от дочернего компонента !!! | |
const handleButtonClick = () => { | |
setCount((prev) => prev + 1); | |
}; | |
// !!! родитель передаёт handleButtonClick дочернему компоненту MyButton через prop onButtonClick !!! | |
return ( | |
<main className="content"> | |
<h2 className="content-title" style={{color: theme.color}}> | |
Добро пожаловать в игру, {user.name}! | |
</h2> | |
<p>Общее количество кликов: {count}</p> | |
<MyButton onButtonClick={handleButtonClick}/> | |
</main> | |
); | |
} | |
===================================================================================================================== | |
MyButton.jsx (дочерняя компонента): | |
import './MyButton.css'; | |
import {useContext, useState} from 'react'; | |
import {AppContext} from '../../contexts/AppContext.jsx'; | |
export function MyButton({onButtonClick}) { | |
const [localCount, setLocalCount] = useState(0); | |
const {theme, toggleTheme} = useContext(AppContext); | |
// обработчик клика | |
const handleClick = () => { | |
setLocalCount((prev) => prev + 1); // локальный счётчик | |
toggleTheme(); | |
onButtonClick(); // !!! вызов функции-обратного вызова для родителя !!! | |
}; | |
return ( | |
<button | |
className="my-button" | |
onClick={handleClick} | |
style={{ | |
backgroundColor: theme.background, | |
color: theme.color, | |
}} | |
> | |
Нажми меня (Локальных кликов: {localCount}) | |
</button> | |
); | |
} | |
===================================================================================================================== | |
про мемоизацию функций (предотвращение их пересоздания при каждом рендере, и ненужных ререндеров дочерних компонентов, | |
использующих эти функции через props: https://react.dev/reference/react/useCallback | |
===================================================================================================================== | |
В React состояние родительского компонента хранится в самом родителе, и дочерний компонент не может напрямую его модифицировать. | |
Вместо этого: | |
- Родитель передает функцию-обратный вызов через props дочернему компоненту | |
- Дочерний компонент вызывает эту функцию при определенном событии (например, клик, ввод текста) и может передать данные | |
- Функция в родителе обновляет его состояние, что приводит к ререндеру родителя и, при необходимости, дочернего компонента !!! | |
Этот подход называется ПОДЪЁМ СОСТОЯНИЯ (lifting state up), и он обеспечивает: | |
- Предсказуемость: Состояние управляется в одном месте | |
- Синхронизацию: Изменения состояния родителя автоматически отражаются во всех дочерних компонентах, зависящих от этого состояния | |
- Однонаправленный поток данных: Данные текут сверху вниз (через props), а события — снизу вверх (через callbacks) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment