从另一个模块导入 PropType 值导致未定义
Importing PropType value from another module results in undefined
免责声明:我是 React 和 ES6 的新手,所以请耐心等待!
在 FacetGroups.js 中,我定义了一些模式,用于使用在各种模块中跨应用程序使用的 PropTypes 进行比较。它在这个文件中工作得很好
import React from 'react'
import PropTypes from 'prop-types'
import FacetGroup from './FacetGroup';
/* ... */
const FacetGroups = ({ facets }) => (
<div>
{Object.keys(facets).map( facetName => {
const facet = facets[facetName];
return (
<section key={facetName}>
<header>{facet.displayName}</header>
<FacetGroup group={facet} groupName={facetName} />
</section>
);
})}
</div>
);
const GROUP_PROP_TYPE = PropTypes.shape({
displayName: PropTypes.string.isRequired,
/* ... */
isOpen: PropTypes.bool,
isShowingAll: PropTypes.bool
});
FacetGroups.propTypes = {
facets: PropTypes.objectOf( GROUP_PROP_TYPE ).isRequired /* This works fine */
}
/* ... */
export { GROUP_PROP_TYPE, /* ... */ };
然后,在 FacetGroup.js(同级文件)中,我导入变量,并在 FacetGroup proptype 定义中使用它:
import React from 'react'
import PropTypes from 'prop-types'
import { GROUP_PROP_TYPE, /* ... */ } from './FacetGroups';
const FacetGroup = ({ group, groupName }) => (
<span>I am a Facet Group</span>
);
FacetGroup.propTypes = {
group: GROUP_PROP_TYPE.isRequired,
groupName: PropTypes.string.isRequired
}
这让我在浏览器控制台中出现运行时错误,其中 GROUP_PROP_TYPE
未定义(因此 isRequired
失败。
Uncaught TypeError: Cannot read property 'isRequired' of undefined
我 运行 这个 JS 文件通过 gulp 使用 webpackStream 和 webpack - 这是我的配置:
module: {
loaders: [
{
loader: 'babel-loader',
query: {
presets: ['es2015', 'react'],
plugins: ['transform-object-rest-spread']
}
}
]
}
有人可以帮我理解为什么会失败吗?这与评估顺序有关吗?我无法像在普通 JS 中那样在浏览器中有效调试,因为它都是通过 webpack 和 babel 编译的...
在 FacetGroup.js 中正确定义 FacetGroup
import React from 'react'
import PropTypes from 'prop-types'
import { GROUP_PROP_TYPE, /* ... */ } from './FacetGroups';
/* ... */
const FacetGroups = {
facets: PropTypes.objectOf(GROUP_PROP_TYPE).isRequired /* This works fine */
}
你应该避免循环依赖。
尝试在单独的文件中定义 GROUP_PROP_TYPE
免责声明:我是 React 和 ES6 的新手,所以请耐心等待!
在 FacetGroups.js 中,我定义了一些模式,用于使用在各种模块中跨应用程序使用的 PropTypes 进行比较。它在这个文件中工作得很好
import React from 'react'
import PropTypes from 'prop-types'
import FacetGroup from './FacetGroup';
/* ... */
const FacetGroups = ({ facets }) => (
<div>
{Object.keys(facets).map( facetName => {
const facet = facets[facetName];
return (
<section key={facetName}>
<header>{facet.displayName}</header>
<FacetGroup group={facet} groupName={facetName} />
</section>
);
})}
</div>
);
const GROUP_PROP_TYPE = PropTypes.shape({
displayName: PropTypes.string.isRequired,
/* ... */
isOpen: PropTypes.bool,
isShowingAll: PropTypes.bool
});
FacetGroups.propTypes = {
facets: PropTypes.objectOf( GROUP_PROP_TYPE ).isRequired /* This works fine */
}
/* ... */
export { GROUP_PROP_TYPE, /* ... */ };
然后,在 FacetGroup.js(同级文件)中,我导入变量,并在 FacetGroup proptype 定义中使用它:
import React from 'react'
import PropTypes from 'prop-types'
import { GROUP_PROP_TYPE, /* ... */ } from './FacetGroups';
const FacetGroup = ({ group, groupName }) => (
<span>I am a Facet Group</span>
);
FacetGroup.propTypes = {
group: GROUP_PROP_TYPE.isRequired,
groupName: PropTypes.string.isRequired
}
这让我在浏览器控制台中出现运行时错误,其中 GROUP_PROP_TYPE
未定义(因此 isRequired
失败。
Uncaught TypeError: Cannot read property 'isRequired' of undefined
我 运行 这个 JS 文件通过 gulp 使用 webpackStream 和 webpack - 这是我的配置:
module: {
loaders: [
{
loader: 'babel-loader',
query: {
presets: ['es2015', 'react'],
plugins: ['transform-object-rest-spread']
}
}
]
}
有人可以帮我理解为什么会失败吗?这与评估顺序有关吗?我无法像在普通 JS 中那样在浏览器中有效调试,因为它都是通过 webpack 和 babel 编译的...
在 FacetGroup.js 中正确定义 FacetGroup
import React from 'react'
import PropTypes from 'prop-types'
import { GROUP_PROP_TYPE, /* ... */ } from './FacetGroups';
/* ... */
const FacetGroups = {
facets: PropTypes.objectOf(GROUP_PROP_TYPE).isRequired /* This works fine */
}
你应该避免循环依赖。
尝试在单独的文件中定义 GROUP_PROP_TYPE