【问题标题】:ReactJS hooks: how to useContext in two different .js files?ReactJS 钩子:如何在两个不同的 .js 文件中使用上下文?
【发布时间】:2020-01-10 23:34:51
【问题描述】:

我在同一个 .js 文件中使用 React.createContext() 和 React.useContext() 有两个组件。现在我想将 Menu 组件移动到另一个 .js 文件中,但我在使用相同的上下文时遇到了问题。这是代码:

const ManagerContext = React.createContext(null);

export default function LessonManager() {

const [title, setTitle] = React.useState('SomeOtherTitle');
const [editing, toggleEditor] = React.useState(false);

const value = React.useMemo(() => {
  return {
    title,
    setTitle,
    editing,
    toggleEditor,
    log: (t) => console.log(t)
  }
}, [title, editing]);

return (
  <ManagerContext.Provider value={value}>

    <div className='box-default expand'>

      <div className='handle' style={{display: 'flex', justifyContent: 'center', width: '100%', cursor: 'grab'}}>

          <LessonMenu/>

      </div>

    </div>

  </ManagerContext.Provider>
)
}

export function LessonMenu() {

  const state = React.useContext(ManagerContext);

  return (
      <ButtonGroup size='sm'>
          <IconButton
              className='rsuite-btn menu-button'
              onClick={()=>state.toggleEditor(!state.editing)}
              icon={ <Icon icon={state.editing ? ('eye') : ('edit2')} />} />
      </ButtonGroup>
  )
}

我尝试导出 const ManagerContext:

export const ManagerContext = React.createContext(null);

并将其导入我使用 Menu 组件创建的 Menu.js 文件中,但它不起作用。我做错了什么?

【问题讨论】:

  • "并将其导入到我使用 Menu 组件创建的 Menu.js 文件中,但它不起作用",告诉我们
  • 这意味着什么不起作用,它未定义?运行时错误?请参考How to create a Minimal, Reproducible Example

标签: reactjs react-hooks


【解决方案1】:

您的代码似乎可以工作,请注意您需要如何导入上下文:

// export const ManagerContext = React.createContext(null);

import { ManagerContext } from "./Menu.js";

export function LessonMenu() {
  const { toggleEditor, editing } = React.useContext(ManagerContext);

  return (
    <ButtonGroup size="sm">
      <IconButton
        className="rsuite-btn menu-button"
        onClick={() => toggleEditor(!editing)}
        icon={<Icon icon={toggleEditor ? "eye" : "edit2"} />}
      />
    </ButtonGroup>
  );
}

【讨论】:

  • 谢谢,导入是错误背后的原因。
  • 这将创建循环依赖并抛出警告
  • 为什么?您有此类警告的可生产示例吗?
  • 是的,我没有得到循环依赖。看起来这是文档建议做的事情,除了没有显示如何在多个文件中做:reactjs.org/docs/hooks-reference.html#usecontext
  • 循环依赖不会发生,因为useContext,它的发生是因为开发人员如何构建他们的文件 - 这是开发人员的错误。像Atomic Design 这样的方法可以提前解决这些问题。随意浏览我的 GitHub 以获取示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 2018-07-21
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多