Реагировать: useContext, как получить его из внешнего компонента?

Если у меня есть Comp1.js

const Comp1 = () => {
  const globalTheme = new createContext()
  return (
    <globalTheme.Provider globalStyle = {anyVar}>
     <Layout>
      <AnotherComponent />
     </Layout>
    </globalTheme.Provider>
  )
}

А потом в layout.js

  const globalStyle = useContext(globalTheme)
  console.info(globalStyle)

Я получаю globalTheme is not defined, я должен снова создать контекст?

  const globalTheme = new createContext()
  const globalStyle = useContext(globalTheme)
  console.info(globalStyle)

Тогда я получаю undefined за globalStyle

что мне не хватает?


Обновлено: Основываясь на комментариях, я использую третий файл и импортирую контекст, чтобы получить к нему доступ -> theme-context.js

import { createContext } from 'react'

export const themes = {
  light: {
    foreground: '#000000',
    background: '#eeeeee',
  },
  dark: {
    foreground: '#ffffff',
    background: '#222222',
  },
}

export const ThemeContext = createContext(
  themes.dark // default value
)

Затем я предоставляю этот контекст в другом файле blog-template.js

import { ThemeContext } from '../context/theme-context'
import Layout from '../components/layout'

const Blog = () => {
let globalStyle = 'just any value'
return (
    <ThemeContext.Provider globalStyle = {globalStyle}>
      <Layout />
    </ThemeContext.Provider>
)}

А потом в layout.js

import React, { useContext} from 'react'
import { ThemeContext } from '../context/theme-context'

const Layout = () => {
  const globalStyle = useContext(ThemeContext)
  console.info(globalStyle)
}

Но globalStyle не определено, почему так?


Обновлено: ошибка заключалась в том, чтобы не предоставлять ценность в качестве опоры

-<ThemeContext.Provider globalStyle = {globalStyle}>
+-<ThemeContext.Provider value = {globalStyle}>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
3 039
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы хотите использовать createContext вне компонента и использовать Provider с реквизитом value, содержащим данные, которые вы хотите использовать дальше по дереву.

Пример

const { createContext, useContext } = React;
const GlobalTheme = createContext();

const Comp1 = () => {
  const anyVar = { color: "red" };

  return (
    <GlobalTheme.Provider value = {anyVar}>
      <Layout>
        <AnotherComponent />
      </Layout>
    </GlobalTheme.Provider>
  );
};

const Layout = ({ children }) => {
  const globalStyle = useContext(GlobalTheme);

  return <div style = {globalStyle}>{children}</div>;
};

const AnotherComponent = () => {
  return <div> Foo </div>;
};

ReactDOM.render(<Comp1 />, document.getElementById("root"));
<script src = "https://unpkg.com/react@16/umd/react.development.js"></script>
<script src = "https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id = "root"></div>

Лучше создать контекст в отдельном файле, чтобы вы могли экспортировать его и использовать в нескольких местах, одним из которых является useContext() хук. В любом случае это будет повторно отображаться при изменении данных в контексте.

Другие вопросы по теме