Рекомендуемые шаблоны для подключения поставщиков контекста в React? - PullRequest
2 голосов
/ 30 сентября 2019

У меня есть приложение React, использующее несколько провайдеров контекста для передачи данных в компоненты, аналогично следующему (упрощенному) коду.

Вот пример провайдера контекста, который потребляет контекст издругой провайдер:


import React from 'react'
import {useAuth} from './auth-context'

const UserContext = React.createContext()

function UserProvider(props) {
  const {
    data: {user},
  } = useAuth()
  return <UserContext.Provider value={user} {...props} />
}

function useUser() {
  const context = React.useContext(UserContext)
  if (context === undefined) {
    throw new Error(`useUser must be used within a UserProvider`)
  }
  return context
}

export {UserProvider, useUser}

Вот вложенные поставщики контекста, экспортированные вместе:


import React from 'react'
import {AuthProvider} from './auth-context'
import {UserProvider} from './user-context'

function AppProviders({children}) {
  return (
    <AuthProvider>
      <UserProvider>{children}</UserProvider>
    </AuthProvider>
  )
}

export default AppProviders

Вот провайдеры, подключенные к приложению. <App /> содержит все компоненты приложения:

import React from 'react'
import ReactDOM from 'react-dom'
import App from './app'
import AppProviders from './context'

ReactDOM.render(
  <AppProviders>
    <App />
  </AppProviders>,
  document.getElementById('root'),
)

Существует ли рекомендуемый шаблон для предоставления вашему приложению React доступа к нескольким поставщикам контекста? Это так?

Дополнительный вопрос: когда поставщики контекста не зависят от другого, это влияет на вашу рекомендацию? Например, если UserProvider в приведенном выше примере не полагался на AuthProvider и вместо этого выглядел примерно так:


import React from 'react'
import userClient from './userClient'

const UserContext = React.createContext()

function UserProvider(props) {
  const [ user, setUser ] = React.useState(null);
  return (
    <UserContext.Provider value={user} {...props} />
  );
}

function useUser() {
  const context = React.useContext(UserContext)

  if (context === undefined) {
    throw new Error(`useUser must be used within a UserProvider`)
  }
  return context
}

function loadUser() {
  return userClient.loadUser().then(data => {
    setUser(data);
  });
}


export {UserProvider, useUser, loadUser}

В этом (втором) сценарии, есть ли минусы для сохранения UserProvider вложено в AuthProvider против разделения провайдеров и где они отображаются в иерархии компонентов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...