Рефи дають можливість отримати доступ до DOM-елементів або React-елементів, створених у методі рендеру.
import React, { useRef } from 'react';
const Component = () => {
const newTaskRef = useRef(null);
const someEventHandler = () => newTaskRef.current.focus()
return (
<input placeholder='new task' ref={newTaskRef}/>
)
}
// some/path/to/OurComponents.js
const OurComponents.js = {
const newTaskRef = React.useRef(null);
return (<CustomInput placeholder='new task' ref={newTaskRef}/>)
}
// src/ui/Input.js
const Input = React.forwardRef((props, ref) => (
<input type="text" ref={ref} {...props} />
))
Портали дозволяють рендерити дочірні елементи в DOM-елемент, який знаходиться поза DOM-ієрархією батьківського компонента.
Застосування порталів: діалогові вікна, спливаючі картки та спливаючі підказки. (тобто, коли в батьківському компоненті задані стилі. overflow: hidden або z-index, але вам потрібно, щоб дочірній елемент візуально виходив за межі свого контейнера).
import ReactDOM from 'react-dom';
{ReactDOM.createPortal(
<Modal {...{ onClose, onDone }}/>,
document.getElementById('modal-root')
)}
Контекст дозволяє передавати дані через дерево компонентів без необхідності передавати пропси на проміжних рівнях (наприклад: UI-тема або вибрана мова).
Зазвичай контекст використовується, якщо необхідно забезпечити доступ до даних у багатьох компонентах на різних рівнях вкладеності.
const ThemeContext = createContext('light');
Коли React рендерить компонент, який підписаний на цей об'єкт, React отримає поточне значення контексту з найближчого відповідного Provider вище в дереві компонентів.
Якщо Provider не буде знайдений, то використовується defaultValue.
Context використовується разом з компонентом Provider, який дозволяє дочірнім компонентам, що використовують цей контекст, підписатися на його зміни.
value - обов'язковий проп, який буде переданий у всі компоненти, що використовують контекст.
Всі споживачі, які є нащадками Provider, будуть повторно рендеритись, як тільки проп value у Provider зміниться.
<ThemeContext.Provider value='dark'>
<App/>
</ThemeContext.Provider>
Consumer - компонент, який підписується на зміни контексту.
Ця функція приймає поточне значення контексту (тобто проп value найближчого компонента Provider або defaultValue, якщо Provider не знайдений) і повертає React-компонент.
<ThemeContext.Consumer>
{(themeCtx) => { ... }}
</ThemeContext.Consumer>
useContext - приймає об'єкт контексту і повертає поточне значення контексту для цього контексту.
import React, { useContext } from 'react';
import ThemeContext from '../../context/theme';
const themeCtx = useContext(ThemeContext);