Рубрики
Без рубрики

Problema React Context API

ВОЛЕЙСПОРТАЦИЯ СТАРЕТИЯ ПРОБЛЕМА С КОНТЕКСТАМИ РЕАКТА API API API API POTRYASASHIй. Кака Tagged with React, JavaScript, WebDev, Tuperial.

ВОЛЕЙНГЕВОД

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)

Компонент кнопки находится в нескольких других компонентах ниже по дереву и должен получать доступ к состоянию из более высокого уровня в приложении. По мнению, сэджон, сеткаунт. Такоудеин и ведущий «Проп-бури», и коджо-то, что я не знаю.

К.С.А.

У Кент С. Доддс. Аписин В Блоге , на которе, я СССЛА -САН В.С. Если у вас нет времени, чтобы прочитать это, вот короткая версия: Контекст – это способ поделиться состоянием между несвязанными или удаленными компонентами. Вес, то, что я не буду, то есть, в контексте контекста. Провайдер, а также voTem, usecontext (контекст), nuotri totogo -opomponenta, чotobы -poluhitth -optoop -n -nepmo -nemy -ne -zy -ne -ne -ne -ne -ne -nemy -jemy -jemo -jo -hymy -hymy -hym

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и:

  1. ESli -voSmoжno, pohзvolte komponentu -uppraytth Эotoroш -ypraktyka, Которо -найна, в покое. Например, если у вас есть модальное окно, которое должно отслеживать открытое/закрытое состояние, но никакие другие компоненты не должны знать, открыт ли этот модальный режим, сохраните это открытое/закрытое состояние в модальном окне. В штате.
  2. ESli -of -oy -jo -ydelyt -meжdi -ro -rodytemylem и neskolokimi -detthe -yproypokinte -grot -gtre -grey -grot -greet ЭTO -starый meTODPEREDAHESH. Проте -детский Передача props или «prop-drilling» может быть ужасна из-за глубоко вложенных компонентов, но если вы прокидываете props только на несколько уровней, вам, вероятно, стоит просто сделать это.
  3. 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”