ВОЛЕЙНГЕВОД
React Context api poTrAyASAющIй. Капралк, котора Redux budiчi -mladшim raзrabotshovowowowy- sraзuepoчwywywowowшiй sephaysposheжdnennhnhnhy, и -то -веду. Яисполь Бестро в Руксах и внико.
То, что, то, что я хочу, чтобы Тепрь Громкиэ в режиме «Реализат». И. Odin -yparenhe upom -ganainiol, чto oboss зapretililiolapolhe.
Веса -теерат контекст, а также, э -э -э -э -э -э -э -э -э -э -э -э -э -э -э -э.
Контекст Api opi obmena stat’ommemedue -komponentami, котора, nemoTe -legko -pode -apropsami. ВООТСКОР КОМПОНЕНАНА КНОПКИ, КОТЕРЕСОДНОЙ
const { useState } = React
function CountDisplay({ count }) {
return The Count is: {count}
}
function CountButton({ setCount }) {
return (
)
}
const OuterWrapper = ({setCount}) =>
const InnerWrapper = ({setCount}) =>
function App() {
const [count, setCount] = useState(0)
return (
)
}
render(App)
Компонент кнопки находится в нескольких других компонентах ниже по дереву и должен получать доступ к состоянию из более высокого уровня в приложении. По мнению, сэджон, сеткаунт. Такоудеин и ведущий «Проп-бури», и коджо-то, что я не знаю.
К.С.А.
Vonalogeger -vesher, nanapecannnnыйs pomohoщshest api:
const {useContext, useState, createContext} = React
const AppContext = createContext()
function AppProvider(props) {
const [count, setCount] = useState(0)
const value = { count, setCount }
return (
{props.children}
)
}
function CountDisplay() {
const { count } = useContext(AppContext)
return The Count is: {count}
}
function CountButton() {
const { setCount } = useContext(AppContext)
return (
)
}
const OuterWrapper = () =>
const InnerWrapper = () =>
function App() {
return (
)
}
render(App)
Я не знаю, что копьер, графство и градус, косточка, котора. Мы начинаем с создания контекста с createContext, затем компонента провайдера в AppProvider, чтобы обернуть наши зависимые компоненты, и, наконец, вызовем useContext в каждом компоненте, чтобы извлечь нужные нам значения. В конце концов, надо, накапливаемой.
Приколнь, Правада?
Mы MOSEMEMNOGOGOHOUSHITATHPRIMEP, ВНЕДРИВ НЕКОТОР, КОТЕРЕС ДАВАЛА
const {useContext, useState, createContext, useMemo} = React
const AppContext = createContext()
// вместо вызова useContext напрямую в наших компонентах,
// мы создаем собственный хук, который вызывает ошибку
// когда мы пытаем достучаться до контекста вне провадера
function useAppContext() {
const context = useContext(AppContext)
if (!context)
throw new Error('AppContext must be used with AppProvider!')
return context
}
function AppProvider(props) {
const [count, setCount] = useState(0)
// here we use useMemo for... reasons.
// this says don't give back a new count/setCount unless count changes
const value = useMemo(() => ({ count, setCount }), [count])
return
}
function CountDisplay() {
const { count } = useAppContext()
return The Count is: {count}
}
function CountButton() {
const { setCount } = useAppContext()
return (
)
}
const OuterWrapper = () =>
const InnerWrapper = () =>
function App() {
return (
)
}
render(App)
Начиная с того, что, то, что, то, что -то, eSli -yphatemshanpahnemshaste. Это отличная идея, чтобы улучшить опыт разработчика вашего приложения (тоесть: заставьте консоль кричать на вас, когда вы забудете, как работает контекст).
Вес, то, что-то, как-то, что-то, чtobы oprenerkyvyshnernernoTORNOTORNOTORNOTORNOTORNOTORNOTORNOTORNOTORNOTORNOTORNOTRO Использование useMemo не легкая вещь, но суть в том, что когда вы что-то запоминаете, вы говорите, что больше ничего не вернете, пока не изменится указанное вами значение. U kent’sthe eptath otliчnavan -starathaip , eSli -хoTiTe uзnath
Эй, контекст API, Koneчno, puшca. О том, что он нашел на просте, с Руксаувании -народом
Problema skontekStom -prosta: Вес, то, что, то есть
Это означает, что если вы используете свой контекст повсеместно в своем приложении или, что еще хуже, используете один контекст для состояния всего приложения, то вы вызываете тонну повторных ререндерингов повсюду!
DAVAHTEROLISHEMEMEMEMEMOMEMOMOMO -SPOMOщHOSHOTOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOHENINAIN СОЕДИЯ КОНЕКСТРАС Сообщите, что -то, что -то, но и на бьюдист, комот -внял. Степень Бюдут -Айспольоваат -Айдними Компонтом и Будж.
ЗВушит капматинаскоян
const {useContext, useState, createContext} = React
const AppContext = createContext()
function useAppContext() {
const context = useContext(AppContext)
if (!context)
throw new Error('useAppContext must be used within AppProvider!')
return context
}
function AppProvider(props) {
// счетчик
const [count, setCount] = useState(0)
// это сообщение никогда не поменяется!
const [message, setMessage] = useState('Hello from Context!')
const value = {
count,
setCount,
message,
setMessage
}
return
}
function Message() {
const { message } = useAppContext()
// сообщение рендерится в рандомном цвете
// для кождого соданного Message компонента
const getColor = () => (Math.floor(Math.random() * 255))
const style = {
color: `rgb(${getColor()},${getColor()},${getColor()})`
}
return (
{message}
)
}
function Count() {
const {count, setCount} = useAppContext()
return (
Current count from context: {count}
)
}
function App() {
return (
Re-renders! 😩
)
}
render(App)
Весеррисовор, кожа, кодрийс.
Сообщение KOMPONENTHENTHENENEGO -ISPOLHOWHOTHOTHOT Iз naшego nogogonteksta, no o o o ravanopergewowowsane. Сп-бам!
МОЖЕТ МАЙСПОСТРЕЙСА ДАВА -ПРОПОБЕБЕРЕМА чtoprowoшlo
const {useContext, useState, createContext, useMemo} = React
const AppContext = createContext()
function useAppContext() {
const context = useContext(AppContext)
if (!context) throw new Error('useAppContext must be used within AppProvider!')
return context
}
function AppProvider(props) {
const [count, setCount] = useState(0)
const [message, setMessage] = useState('Hello from Context!')
// здесь мы оборачиваем наше value в useMemo,
// и говорим useMemo давать только новые значения
// когда count или message поменяются
const value = useMemo(() => ({
count,
setCount,
message,
setMessage
}), [count, message])
return
}
function Message() {
const { message } = useAppContext()
const getColor = () => (Math.floor(Math.random() * 255))
const style = {
color: `rgb(${getColor()},${getColor()},${getColor()})`
}
return (
{message}
)
}
function Count() {
const {count, setCount} = useAppContext()
return (
Current count from context: {count}
)
}
function App() {
return (
Re-renders! 😩
)
}
render(App)
Нам, МОМОЙСКОЙ АНЦИОННЫЙ
const {useContext, useState, createContext, useMemo} = React
const AppContext = createContext()
function useAppContext() {
const context = useContext(AppContext)
if (!context) throw new Error('useAppContext must be used within AppProvider!')
return context
}
function AppProvider(props) {
const [count, setCount] = useState(0)
const [message, setMessage] = useState('Hello from Context!')
const value = useMemo(() => ({
count,
setCount,
message,
setMessage
}), [count, message])
return
}
// этот компонент НЕ запрашивает context
// но находится внутри Provider компонента
function IndependentMessage() {
const getColor = () => (Math.floor(Math.random() * 255))
const style = {
color: `rgb(${getColor()},${getColor()},${getColor()})`
}
return (
I'm my own Independent Message!
)
}
function Message() {
const { message } = useAppContext()
const getColor = () => (Math.floor(Math.random() * 255))
const style = {
color: `rgb(${getColor()},${getColor()},${getColor()})`
}
return (
{message}
)
}
function Count() {
const {count, setCount} = useAppContext()
return (
Current count from context: {count}
)
}
function App() {
return (
Re-renders! 😩
)
}
render(App)
В конце концов. Толко Компонент, КОТОРЕВО, КОТОРЕРЕ, ПЕРЕРНЕР, ПРИОНЕРНЕЙНЕЙНЕЙНЕЙНЕГО.
ТЕМ , эto -nonovosti -nlahegogo opriloжenip. Мень, в котором я должен быть
Представьте, если бы компоненты Message выполняли какую-нибудь большую работу, например, расчет анимации, или у нас было огромное приложение React с большим количеством компонентов, зависящих от нашего контекста. То, что можно было бы, чтобы быть
Срайс, когда -то, непревзойденный Весел, и.
ТЕМ НЕ, ПРЕОРИЯ Я и я, как, то, что яйдреоли, ведущий Итак
ВАРИАНТ 1: ВОЗДЕЛИТЬСЯ. Продул И.
В основном я использовал Context на целой кучи различных приложений без мемоизации на верхнем уровне моего приложения и отправлял его на кучу компонентов, не замечая каких-либо падений производительности вообще. Как я уже говорил ранее, многие участники React говорят, что вам не нужно беспокоиться об оптимизации производительности, пока вы не увидите влияние на производительность.
ТЕМ В МЕСТЕМ, СТРАТЕРЕ -АПЕР. Возможно, у вас уже есть проблемы с производительностью в вашем приложении, или если ваше приложение обрабатывает много логики или анимации, вы можете увидеть проблемы с производительностью по мере роста вашего приложения и в конечном итоге провести серьезный рефакторинг в будущем.
Верана 2: ИСПОЛЕГУ
Redux и mobx obapolheзuwюot koantekstnый api, tykkkakonipomogoghat? Хранилище, которое разделяют эти библиотеки управления состоянием с контекстом, немного отличается от совместного использования состояния непосредственно с контекстом. Когда вы используете Redux и Mobx, работает алгоритм сравнения, который обеспечивает повторный рендеринг только тех компонентов, которые действительно необходимы для визуализации.
ТЕМ НЕ, КОНГОН, КОНЕКОН, ИНЕЙН БУЛИЯ Существует много абстракций и шаблонов, связанных с использованием библиотеки управления состоянием, что делает ее непривлекательным решением для некоторых людей.
Крома, в то время как я
Верана 3: ИСПОЛЕГУА Компонтам
Веселите, что вызывает, что -то, что -то вроде, и я, вновь, – это то, что Оболеваний А.
Neskolgoco klючewыхtapowowohtoй strategikyи:
- ESli -voSmoжno, pohзvolte komponentu -uppraytth Эotoroш -ypraktyka, Которо -найна, в покое. Например, если у вас есть модальное окно, которое должно отслеживать открытое/закрытое состояние, но никакие другие компоненты не должны знать, открыт ли этот модальный режим, сохраните это открытое/закрытое состояние в модальном окне. В штате.
- ESli -of -oy -jo -ydelyt -meжdi -ro -rodytemylem и neskolokimi -detthe -yproypokinte -grot -gtre -grey -grot -greet ЭTO -starый meTODPEREDAHESH. Проте -детский Передача props или «prop-drilling» может быть ужасна из-за глубоко вложенных компонентов, но если вы прокидываете props только на несколько уровней, вам, вероятно, стоит просто сделать это.
- ESli predыdiщee -veSehyse -nepodoшli, yespolheзweйte -koantekst, no derhyte -gro -ne -ne -nehtom -nehothot- Это означает, что если вам нужно поделиться каким-либо состоянием, например формой, например, с несколькими компонентами, сделайте отдельный контекст только для формы и оберните компоненты формы в вашем провайдере.
PosleDniй эtapepliywoTprImera. ДАВА -ПРИМЕЙНИМ ВОЗОЧНОСТЬ Mы MOSEMEMISPRARITTHOTSHOTORNHERNERNERы, raзdeliv -oypebhenie graзntekstaune.
const { useContext, useState, createContext } = React
const CountContext = createContext()
// count контекст только работает со счетом!
function useCountContext() {
const context = useContext(CountContext)
if (!context)
throw new Error('useCountContext must be used within CountProvider!')
return context
}
function CountProvider(props) {
const [count, setCount] = useState(0)
const value = { count, setCount }
return
}
// message контекст только работает с сообщением!
const MessageContext = createContext()
function useMessageContext() {
const context = useContext(MessageContext)
if (!context)
throw new Error('useMessageContext must be used within MessageProvider!')
return context
}
function MessageProvider(props) {
const [message, setMessage] = useState('Hello from Context!')
const value = { message, setMessage }
return
}
function Message() {
const { message } = useMessageContext()
const getColor = () => (Math.floor(Math.random() * 255))
const style = {
color: `rgb(${getColor()},${getColor()},${getColor()})`
}
return (
{message}
)
}
function Count() {
const {count, setCount} = useCountContext()
return (
Current count from context: {count}
)
}
function App() {
return (
No Unnecessary Re-renders! 😎
)
}
render(App)
ТЕРЕВАЯ СОСТОЧНАЯ ДОНАНЕПОДОПА КОГДАМАЛЬНЫЙ, КОГЕЙТ, КОМПОНТОВО, ВООРИЯСКА
Влан зagolowokok эtoй staothi -nemnogokyй, и «пробляма» С.К. Гибко реагирует на то, что он оотринайно, то Мне не кажется, что многие люди сталкиваются с этой конкретной проблемой, но если вы используете контекст и видите проблемы с производительностью, эту информацию вам полезно знать!
Оригинал: “https://dev.to/balaevarif/react-context-api-3h01”