【问题标题】:useContext across files causes circular dependenciesuseContext 跨文件导致循环依赖
【发布时间】:2021-02-28 17:28:44
【问题描述】:

我有两个组件 Parent 和 Child,我想将上下文从 Parent 导出到 Child,但这会导致循环依赖。

考虑,例如,Parent.js 是

import {Child} from './Child.js';

export const MyContext = React.createContext();

const Parent = () => {
    return <MyContext.Provider><Child /></MyContext.Provider>;
}

和 Child.js 一样

import {MyContext} from 'Parent';

const Child = () => {
    const myContext = useContext(MyContext);
    return <>{myContext}</>;
}

我可以将它作为道具传递,但如果有多层嵌套,那就很难了。我能想到的一个可能的解决方案是使用另一个名为 contexts.js 的文件,并从那里导出我的所有上下文。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: javascript reactjs react-hooks use-context


    【解决方案1】:

    将您的上下文放在它自己的文件中,例如Context.js。那么Parent.jsChild.js 都可以导入。

    【讨论】:

    • 是的,正如我所提到的,这就是我想出的。我只是在寻找开发人员通常使用的更好的方法,因为这似乎是很多人应该遇到的情况。
    【解决方案2】:

    通常情况下,您不会使子级成为父级的依赖项,而是通过使用props.children 将上下文提供程序组件与其子级松散耦合。

    Parent.js:

    export const MyContext = React.createContext();
    
    const Parent = ({ children }) => {
        return <MyContext.Provider>{children}</MyContext.Provider>;
    };
    
    export default Parent;
    

    Child.js:

    import { MyContext } from './Parent';
    
    const Child = () => {
        const myContext = useContext(MyContext);
        return <>{myContext}</>;
    };
    
    export default Child;
    

    然后在创建虚拟 DOM 时使用 &lt;Child /&gt; 填充 props.children

    import Parent from './Parent';
    import Child from './Child';
    
    const App = () => {
        return <Parent><Child /></Parent>;
    };
    
    ...
    

    【讨论】:

    • 这只适用于简单的情况。您不能指望将每个组件都放入 App 中吗?
    • @pbuzz007 你有点字面意思,这只是我能提供的最简单的例子。 &lt;Child /&gt; 可以在 &lt;Parent&gt;...&lt;/Parent&gt; 内的任何地方深度嵌套 JSX,这意味着它们之间可以存在任意数量的组件。不,Parent 也不必进入App
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2015-06-08
    • 2018-07-22
    • 1970-01-01
    • 2020-11-18
    • 2013-03-18
    相关资源
    最近更新 更多