React:useContext,如何从外部组件中获取它?
React: useContext, how to retrieve it from an external component?
如果我在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.log(globalStyle)
我得到 globalTheme is not defined
,我应该重新创建上下文吗?
const globalTheme = new createContext()
const globalStyle = useContext(globalTheme)
console.log(globalStyle)
然后我得到 undefined
for 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.log(globalStyle)
}
但是globalStyle
是未定义的,这是为什么?
编辑:错误是没有提供价值作为 prop
-<ThemeContext.Provider globalStyle={globalStyle}>
+-<ThemeContext.Provider value={globalStyle}>
您想在组件外部使用 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()
挂钩。当 Context 中的数据发生变化时,这无论如何都会重新呈现。
如果我在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.log(globalStyle)
我得到 globalTheme is not defined
,我应该重新创建上下文吗?
const globalTheme = new createContext()
const globalStyle = useContext(globalTheme)
console.log(globalStyle)
然后我得到 undefined
for 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.log(globalStyle)
}
但是globalStyle
是未定义的,这是为什么?
编辑:错误是没有提供价值作为 prop
-<ThemeContext.Provider globalStyle={globalStyle}>
+-<ThemeContext.Provider value={globalStyle}>
您想在组件外部使用 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()
挂钩。当 Context 中的数据发生变化时,这无论如何都会重新呈现。