【问题标题】:React context provider does not show defaultsReact 上下文提供程序不显示默认值
【发布时间】:2020-08-10 18:37:54
【问题描述】:

我正在努力使我的项目井井有条。所以我创建了一个config 文件夹,在其中放置了一个context 文件夹。在context 文件夹中,我想处理所有上下文。

所以我有index.ts,如下:

import { ThemeContextProvider } from './context';
export default ThemeContextProvider;

还有一个context.tsx 文件,其中包含以下内容:

import { createContext } from 'react';

export const ThemeContext = createContext({});
export const ThemeContextProvider = ThemeContext.Provider;

在我的app.tsx 我有

import React from 'react';
import ThemeContextProvider from './config/context';
import theme from './theme';

export default function App() {
  return (
    <ThemeContextProvider value={theme}>
      ...
    </ThemeContextProvider>
  );
}

以上工作。但我想将主题移动到context.tsx 并将其作为默认值加载到那里,因此我尽可能保持App.tsx 干净

所以在context.tsx我改成:

import { createContext } from 'react';
import theme from '../../theme';

export const ThemeContext = createContext(theme);
export const ThemeContextProvider = ThemeContext.Provider;

App.tsx 中,我将&lt;ThemeContextProvider value={theme}&gt; 更改为&lt;ThemeContextProvider&gt;

React 立即抱怨 &lt;ThemeContextProvider&gt; 并想要 value 属性。当我通过 value={} 并尝试从上下文中获取默认值时,它们不再存在。

对正在发生的事情有什么想法并就如何处理它提出建议,并就最佳做法提出建议?可能是我写错了?

【问题讨论】:

    标签: reactjs react-context


    【解决方案1】:

    您可以创建另一个组件来包装内容并将主题传递给上下文提供者

    import { createContext } from 'react';
    import theme from '../../theme';
    
    export const ThemeContext = createContext({});
    export const ThemeContextProvider = ThemeContext.Provider;
    export const YourContextProvider = ({ children }) => (
      <ThemeContextProvider value={theme}>
        {children}
      </ThemeContextProvider>;
    );
    

    然后在app组件中使用

    import React from 'react';
    import YourContextProvider from './config/context';
    
    export default function App() {
      return (
        <YourContextProvider>
          ...
        </YourContextProvider>
      );
    }
    
    

    如果需要,您仍然可以将 YourContextProvider 命名为 ThemeContextProvider,但我不建议这样做。以后的维护可能很难跟进。

    【讨论】:

    • 我本来也是这么想的,结果不行。当我导入YourContextProvider 并按照您提到的&lt;YourContextProvider&gt; 使用时,React 抱怨value 是必需的,并且无法访问默认值。
    • 它不能抱怨 YourContextProvider 上的值,因为该组件没有这样的道具。尝试从 YourContextProvider 中删除 ThemeContextProvider 以仅渲染子项,然后当它工作时,再次添加 ThemeContextProvider 并在里面添加值。
    猜你喜欢
    • 2019-07-24
    • 2021-02-12
    • 2019-01-01
    • 2011-10-14
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多