【发布时间】:2017-10-31 17:00:38
【问题描述】:
我有以下模块结构:
/components
├── Button.js
├── Checkbox.js
├── index.js
├── DateSelect
├── DateSelect.js
└── index.js
与/components/DateSelect/index.js:
import DateSelect from './DateSelect';
export default DateSelect;
/components/index.js:
import DateSelect from './DateSelect';
import Button from './Button';
import Checkbox from './Checkbox';
export {
DateSelect,
Button,
Checkbox,
};
还有/components/DateSelect/DateSelect.js:
import { Checkbox } from '../';
// ...code
// I want to do this!
const MyCustomCheckbox = props => <Checkbox style={someStyle} />;
// ...code
class DateSelect extends React.Component {
// code
}
export default DateSelect;
现在,我想在文件的顶级范围内访问Checkbox,就像上面的代码一样,但我得到了undefined。但是,如果我在DateSelect 的render 方法中访问此变量,它会按预期工作。
我不完全确定为什么会这样,或者我该如何解决这个问题(我可以做到import Checkbox from '../Checkbox',但我不想更改使用目录的index.js 文件的模式),我也想确切地了解发生了什么。有什么想法吗?
【问题讨论】:
-
为什么
Checkbox.js依赖于Dateselect.js?你能把它的代码贴出来吗? -
@Bergi 当然,给我几分钟去我的电脑,但是复选框不依赖于 DateSelect,我谈到的循环依赖是在 DateSelect.js 和 components/index.js 之间,相互导入模块。
-
嗯,这反过来使
Checkbox也依赖于导入的Dateselect。 Avoid such circular references!直接导入Button模块即可。 -
是的@Bergi 是对的——直接导入
Checkbox。使用index模式非常适合定义内部 API 和维护严格的模块边界,但您不能从它导入的组件中引用它。如果您想坚持索引模式,请将Checkbox文件分解为一个迷你模块/components/CheckBox/Checkbox.js和/components/CheckBox/index.js,然后从该索引文件中导入。 -
感谢 Bergi 和 @MarcDavies!不过我有一个问题,因为我想保留索引模式,为什么将 Checkbox 移动到这样的迷你模块可以解决问题?我不太清楚为什么我的 DateSelect 组件在具有这些循环依赖项的情况下工作,哈哈。
标签: javascript reactjs webpack es6-modules