React 默认 props 被忽略
2017-09-23
3914
我在我的 React 应用中使用 Flow v.0.52 进行输入,但在正确分配默认 props 方面遇到了问题。
News.jsx
class News extends Component {
static defaultProps = {
postList: {apiData: [], total: '0'},
};
componentDidMount() {
this.props.getPostListData(this.props.lang, null, this.props.category);
}
props: {
postList: {apiData: Array<Content>, total: string},
getPostListData: Function,
};
render() {
const { postList } = this.props;
let renderNewsCards;
if (postList.apiData.length !== 0) {
renderNewsCards = (
<NewsCards ... />
);
} else {
renderNewsCards = <p style={{ textAlign: 'center' }}>Loader...</p>;
}
...
在
News.jsx
组件中,默认 props 被忽略,导致
postList.apiData.length
遇到类型错误
Uncaught TypeError: Cannot read property 'length' of undefined
P.S.
链接
到文件
News.jsx
3个回答
您发布的所有代码看起来都很好。
从此错误消息:
未捕获的 TypeError:无法读取未定义的属性“长度”
我们可以推断
postList.apiData
未定义,而
postList
确实是一个对象。在什么情况下会发生这种情况?好吧,在您提供的链接中,
postList
在您的
connect()
过程中被绑定到 redux 存储中的某个东西。
当
yourReduxStore.postlistData
为空对象时,将发生您收到的错误。在这种情况下,不会使用默认的 props,因为
{
是一个真值。
John Shammas
2017-10-10
我觉得打字有点问题,我对流程脚本没有太多经验。但下面的方法可以!你可以尝试回复
import * as React from 'react'
type Content = number // assumed content type as number
type Props = {
postList: {apiData: Array<Content>, total: string},
getPostListData: Function,
lang: string,
category: string
}
class News extends React.Component<Props> {
static defaultProps = {
postList: {apiData: [], total: '0'},
lang: 'defaultLanguage',
category: 'defaultCategory'
}
componentDidMount() {
return this.props.getPostListData(this.props.lang, null, this.props.category)
}
render() {
const { postList } = this.props;
return postList.apiData.length !== 0 ?
<div> news Cards </div> :
<p style={{ textAlign: 'center' }}>Loader...</p>
}
}
Sanjeev
2017-09-23
以下解决方案对我有用,希望可以解决您的问题。
class News extends Component {
static defaultProps = {
postList: {apiData: [], total: '0'},
};
componentDidMount() {
this.props.getPostListData(this.props.lang, null, this.props.category);
}
props: {
postList: {apiData: Array<Content>, total: string},
getPostListData: Function,
};
render() {
const { postList } = this.props;
let renderNewsCards;
if ((postList.apiData) && Object.keys(postList.apiData).length > 0){
renderNewsCards = (
<NewsCards ... />
);
} else {
renderNewsCards = <p style={{ textAlign: 'center' }}>Loader...</p>;
}
...
f.jafari
2017-10-10