反応文脈- Jak Efektywnie Go u Chi Ywaは?


Przetłumaczona wersja artykułu Kenta C. Doddsa


我々はwpisie ozarządzaniu stanem aplikacji w React 日本語教育研究会第一回研究大会報告要旨ポアツァの黙示録kkka przykは、d kのkkは、リーチCCIAは、bzsiのsiのクンテル・タラズのodnieのluckno、jkのefektywnie tworzyのsukonkonststu、kのktetelkstu、unkjのcの問題の問題、wのjednozeを得た.

Zapoznaj się z zarządzaniem stanu w React i postępuj zgodnie z radą, mówiącą, że nie powinieneś używać kontekstu do rozwiązania każdego problemu ze stanem w aplikacji. Ale kiedy już będziesz zmuszony po niego sięgnąć, mam nadzieję, że ten wpis pomoże ci się dowiedzieć jak skutecznie to zrobić. Pamiętaj, że kontekst NIE musi być globalny dla całej aplikacji, ale może być zastosowany do jednej jej części i możesz (a prawdopodobnie powinieneś) mieć wiele logicznie oddzielonych od siebie kontekstów.


NjPierw、stwをrzmy pliksrc/count-context.js , W nim Kontekst :
import * as React from 'react'

const CountContext = React.createContext()
ポーピエロ、ニーマムTutaj Domyは、Lnej Wartoは、ci dla kontekstuを導きます.<論文>リ・チャッホの詩についてReact.createContext({count: 0}) . Zrobiは、Jednak celowoにEMを与えます.Dodawanie Wartoは、Ci Domy Spre Lnej Jest u Chiy yteczne Tylko wタキム・プラゾドを示します:
function CountDisplay() {
  const {count} = React.useContext(CountContext)
  return <div>{count}</div>
}

ReactDOM.render(<CountDisplay />, document.getElementById('⚛️'))
Poniewa Lee - nie - My - My Way - to - ci ci - Domy - sul Lnej , Otrzymamy B - Turp - D - W - Linei , Gdzie destrukturyzujemy Warto - Les - Zwracan chen zuseContext() . Dazieje Si Con - Tak、Gdyシュニーnieundefined , Wは、A - nie tak - chen - warto - cheme . domy - suf ln - ne - ma - nasz - kontekst .
NATT Z NAS NY Lubi Takich Sittuacji , WI Count C Twoj - Le Odruchow Le Okuchow Le Okuchow Le .JednakポーChuntekstuによるJakiによるJaknak Z Kontekstu、na Aktualnyスタンの上のgdyby nie wskazywa修辞?ウィルZdziaは、uによってYu - ywaj - c c Tylko Domyを得ます.W 99 % przypadkは、w、gdy b . dziesz tworzyのi u uのywaのkontekstw w swojej aplikacji wuseContext() ) によって、y y renderowane w ramach rodzica dostawcy、KTは、Loである.

Istnieją sytuacje w których wartości domyślne są przydatne, lecz w większości przypadków tak nie jest.


Dokumentacja Reacta Sugeruje、Le e e Podanie Warto Les CI ci Domy - Sent Lnej "prizdaje si no Podczas Testowania komponent w W W izolacji , Poniewa - ne - nie - Konieczno True ci opakowywania ich w sztucznych dostawc - de "チョウオワタクギリJeest、Le e PozwalaへのZrobi - Lung、Ny Zgadzam Si Chan、Le e Jest to lepsze Od Zapewniania Komponentom Niezb - chen Dnego Kontekstu.パミ・ツァー・タージ、ヘン・E・カ・カム・ディ・レイム、ガディ・ロリッツW TE・シ・コ・コン、Cheego Nie - W W Aplikacji、Zmniejszasz pewno - Rive -Istnieją powody , タックロビChenによって、エールは、ニージェストJeden Zニッチに.

Jeśli używasz TypeScript-u, brak wartości domyślnej może być naprawdę irytujący dla osób korzystających z React.useContext, ale pokażę ci, jak uniknąć tego problemu. Czytaj dalej!


OK、Kontynuujmy.アビーテンModuは、Kontekstuによって、w w og yteczny、musimy u chen y se provii - i udost - ne pni - chen komponent、kkt、リーdostarcza - warto - eval.<翻訳>
function App() {
  return (
    <CountProvider>
      <CountDisplay />
      <Counter />
    </CountProvider>
  )
}

ReactDOM.render(<App />, document.getElementById('⚛️'))
<研究ノート>
import * as React from 'react'

const CountContext = React.createContext()

function countReducer(state, action) {
  switch (action.type) {
    case 'increment': {
      return {count: state.count + 1}
    }
    case 'decrement': {
      return {count: state.count - 1}
    }
    default: {
      throw new Error(`Unhandled action type: ${action.type}`)
    }
  }
}

function CountProvider({children}) {
  const [state, dispatch] = React.useReducer(countReducer, {count: 0})
  // NOTE: *możesz* potrzebować memoizacji tej wartości
  // Dowiedz się więcej: http://kcd.im/optimize-context
  const value = {state, dispatch}
  return <CountContext.Provider value={value}>{children}</CountContext.Provider>
}

export {CountProvider}
Spoojnieは、wymy修辞lony przykの広告広告、ktによって、celowo jest tak zrobiony、pokaza chen、jak wygl - no da da - aby bardziej rzeczywista sytuacja.ヤンOznaczaには、李e za kaのdymのrazemのb dzz dzieにtk skomplikowane!Pe Je Le Pajijeは、Twojego przypadku mouseState . Ponadto、Nenektは、reomomcy dostawcy b . d d . ck tak proste i krは、tkie、inne du no o bardziej zawiは、e、zawierajのce wieleのフックのwのwをkにする.

カスタムフック
WI - KYZO - TRANLIGHT - Interfejs des W API , KT - Re - re - Widzia ' em em , Wygl Lum da da nniej wi - chen cej tak :
import * as React from 'react'
import {SomethingContext} from 'some-context-package'

function YourComponent() {
  const something = React.useContext(SomethingContext)
}
<翻訳> E・・・・・・・・・・・・・user experience . モーニー・ツァーニエム・パウレノンの「我」について
import * as React from 'react'
import {useSomething} from 'some-context-package'

function YourComponent() {
  const something = useSomething()
}
A・T・Zalet Lung , Chene - e - Mo - ez - zrobi - chen - kkka rzeczy , Kt - Re - re Teraz - poka - Lung Praktyce
import * as React from 'react'

const CountContext = React.createContext()

function countReducer(state, action) {
  switch (action.type) {
    case 'increment': {
      return {count: state.count + 1}
    }
    case 'decrement': {
      return {count: state.count - 1}
    }
    default: {
      throw new Error(`Unhandled action type: ${action.type}`)
    }
  }
}

function CountProvider({children}) {
  const [state, dispatch] = React.useReducer(countReducer, {count: 0})
  // NOTE: *możesz* potrzebować memoizacji tej wartości
  // Dowiedz się więcej: http://kcd.im/optimize-context
  const value = {state, dispatch}
  return <CountContext.Provider value={value}>{children}</CountContext.Provider>
}

function useCount() {
  const context = React.useContext(CountContext)
  if (context === undefined) {
    throw new Error('useCount must be used within a CountProvider')
  }
  return context
}

export {CountProvider, useCount}
ナップピエール,フックuseCount 呉日華React.useContext , OtrzymaシュウウォルトToによってCountProvider . Jeは、李ニー馬Takiej Wartoは、CI、Zwrが、Ci pob Cn - Le d d zawieraj Cal pomocn - wh - adadchen、wskazujCountProvider . Z pezへのジェスト
Dratego Zwrは、Cenie Odpowiedniego自家製のKomunikatu Moフェイルファスト

カスタムコンソーシアム
李えん、ヤワのフック、w、pomi - no .<翻訳> Jednak , Le Musisiz Mie Count Wsparcie Dla Reacta w Wersji< 16.8.0 Lub私のものは、Lisz、はいe kontekst musi zostaは、uを噛んでくださいrender-props :
function CountConsumer({children}) {
  return (
    <CountContext.Consumer>
      {context => {
        if (context === undefined) {
          throw new Error('CountConsumer must be used within a CountProvider')
        }
        return children(context)
      }}
    </CountContext.Consumer>
  )
}
OKO Jak Mo - Na - Wykorzysta Kenw w Komponentch Klasowych :
class CounterThing extends React.Component {
  render() {
    return (
      <CountConsumer>
        {({state, dispatch}) => (
          <div>
            <div>{state.count}</div>
            <button onClick={() => dispatch({type: 'decrement'})}>
              Decrement
            </button>
            <button onClick={() => dispatch({type: 'increment'})}>
              Increment
            </button>
          </div>
        )}
      </CountConsumer>
    )
  }
}
uは、YaのYemを食べますteem、zanim mieliは、私のdost - no p p doフックw w i i ziaを与えます.NY Polecam Jednak Zawracania Sobie Tym GはOWY,JE RANO LI‐MU‐EZ U,YWA‐G .フック,W . Hooki S . zaczznie lepsze

タイプスクリプト
Obiecaは、エヌEcecaは、はい、eのpokaのええ、jakのustrzec siのbのbのnoのdのdのwのw zzangのzのzanych z pomijaniem wartoロビーは、Cは、O Czym Wspominaは、emには、オッドrazu unikasz問題!WはWcale - Nie - Jest問題への関心Ciwie呂寸大麻湯
import * as React from 'react'

type Action = {type: 'increment'} | {type: 'decrement'}
type Dispatch = (action: Action) => void
type State = {count: number}
type CountProviderProps = {children: React.ReactNode}

const CountStateContext = React.createContext<
  {state: State; dispatch: Dispatch} | undefined
>(undefined)

function countReducer(state: State, action: Action) {
  switch (action.type) {
    case 'increment': {
      return {count: state.count + 1}
    }
    default: {
      throw new Error(`Unhandled action type: ${action.type}`)
    }
  }
}

function CountProvider({children}: CountProviderProps) {
  const [state, dispatch] = React.useReducer(countReducer, {count: 0})
  // NOTE: *możesz* potrzebować memoizacji tej wartości
  // Dowiedz się więcej: http://kcd.im/optimize-context
  const value = {state, dispatch}
  return (
    <CountStateContext.Provider value={value}>
      {children}
    </CountStateContext.Provider>
  )
}

function useCount() {
  const context = React.useContext(CountStateContext)
  if (context === undefined) {
    throw new Error('useCount must be used within a CountProvider')
  }
  return context
}

export {CountProvider, useCount}
杜の木のてっかuseCount ベズKoniecznoは、CI CI Sprwdzania Wartoは、CI Ci、Poniewa Les RimimyをZa Niegoにします!
Daiaは、AJ - Ch prprkを広告しますCodeSandbox

コッツ・リットルdispatch ?
J・・・・・・・・・・・・・・・・・.U - YWAJ . Cのタイプは、u i majはc o c c dodoze otypowane akcje、najprawdopodobniej ich nie potrzebujesz.Die Le Ki Temu Uzykuksesz autouzupeは、nianie sk mit adni!


Polecam u Chenywadispatch WテンスステンB、DZI - Chi Temu JestのスタビニーPzez CAuseEffect .
JE - Le - Nie Typujesz - swojego - kodu - javascript ( Prawdopodobnie - poiniini - to - zmieni Lung ) Wtedy Zwracany B - Chient - d - Oa - en - e - si - zziemPzezjdは、私のDo Nast Le Pnej Skcji、Powinna CI POM DEC C .

Co z非晶質酸化物
ドブールピタニー.共産主義者としての共産主義Jasne、Le E Mo Mo eseszのZrobiのためのBezpoは、Ricnio w Komponencie、エールR Chune Czne Ustawianie tego w Ka - Le - DeJ SytuacjiによってOby Do Vicchen Denerwuj Count CE .
Suceruj chen u ycie funkcji pomocniczej , kat de la przyjmuje jako argumensdispatch オアズイントロpotrzebneデイン私は、b b ' d dzy odpowiedzialna za obsは、ug .Tutaj przyk ad ad mojegokursu o zaawansowanych wzorcach w React :
async function updateUser(dispatch, user, updates) {
  dispatch({type: 'start update', updates})
  try {
    const updatedUser = await userClient.updateUser(user, updates)
    dispatch({type: 'finish update', updatedUser})
  } catch (error) {
    dispatch({type: 'fail update', error})
  }
}

export {UserProvider, useUser, updateUser}
Nast Le Pnie mo - ne esz tego u chen y no w w spos - b :
import {useUser, updateUser} from './user-context'

function UserSettings() {
  const [{user, status, error}, userDispatch] = useUser()

  function handleSubmit(event) {
    event.preventDefault()
    updateUser(userDispatch, user, formState)
  }

  // more code...
}
ユダヤ人zadowolony z tego wzorca、wiとc jeは、リーBym Nuczydaj mi znać (Lub Dopisz Siは、Lyny OczekujはCych na kolejne warsztatyをします)!

ポプラトゥーニエ
タックウィジル
import * as React from 'react'

const CountContext = React.createContext()

function countReducer(state, action) {
  switch (action.type) {
    case 'increment': {
      return {count: state.count + 1}
    }
    case 'decrement': {
      return {count: state.count - 1}
    }
    default: {
      throw new Error(`Unhandled action type: ${action.type}`)
    }
  }
}

function CountProvider({children}) {
  const [state, dispatch] = React.useReducer(countReducer, {count: 0})
  // NOTE: *możesz* potrzebować memoizacji tej wartości
  // Dowiedz się więcej: http://kcd.im/optimize-context
  const value = {state, dispatch}
  return <CountContext.Provider value={value}>{children}</CountContext.Provider>
}

function useCount() {
  const context = React.useContext(CountContext)
  if (context === undefined) {
    throw new Error('useCount must be used within a CountProvider')
  }
  return context
}

export {CountProvider, useCount}
Tutaj dziaは、AJCodeSandbox
『ズワワ』と『女』CountContext . ユシュウィによってwnoのywam Tylko jednego sposobu zarのno wno.<研究ノート>第二次世界大戦について
マムNadziejは、、チェンテンArtykuは、Okazaは、siサイddcicibie pomocnyを引きます!パミ
  • Rynwi Con Za Ka - Ken - dy問題によるNie Powiniene
  • Kontekst -ニーMusiは、Globalny DLA CAによって、EJ Aplikacji(Tylko DLA JeJ Cz Count - Chi)です.
  • Mr . Ez ( I Prawdopodobnie Powiniene )のMie Le Kilka , Oddzielonych od siebie Logiczony Kontekst de W
  • Powodzenia!