开发者问题收集

无法读取 reactjs 中未定义的属性“length”

2019-09-19
745

尝试显示从 api 响应接收到的数据的长度。但它说无法读取未定义的属性


async  componentDidMount() {
        Users.getAppAuthUser(1,true).then((res)=>{
            this.setState({data:res});
            this.setState({loading:false});
        })
        console.log(this.state.data);

}
render() {
    return (
         <div >                    
            <span >({  this.state.data ===[] ?    0 :  this.state.data.accounts.length })
            </span>
        </div>
    )
}
3个回答

我认为你可以做的是

<div>
{ this.state.data && <span> {{this.state.data.length}} </span> }
</div>
AvadaKedavra
2019-09-19

有时可能会发生这种情况,因为在渲染过程中,状态尚未完成,因此它无法获取状态内键的全部属性。 在这种情况下,它尚未完成加载 data ,因此 length 不可用。

componentDidMount 之前的 async 在这里无效。

state = {
  data: [], loading: false
}

componentDidMount() {
    Users.getAppAuthUser(1, true).then((res)=> ({
        this.setState({data: res, loading:false});
    }))
}

render() {
    return (
        <div>                    
            {this.state.data && <span>{this.state.data.accounts.length}</span>}
        </div>
    )
}

如果此行不起作用 {this.state.data && <span>{this.state.data.accounts.length}</span>> ,请改为执行以下操作:

{this.state.data && this.state.data.accounts && <span>{this.state.data.accounts.length}</span>

如果您使用 lodash,您可以导入:

import get from 'lodash.get';

...

<div>                    
  <span>{get(this.state, 'data.accounts.length', null)}</span>
</div>
Non
2019-09-19

你得到未定义的原因是 async/await 的使用不正确。 阅读以获取更多信息兄弟

    async componentDidMount() {
        const response = await fetch(`https://api.coinmarketcap.com/v1/ticker/?limit=10`);
        const json = await response.json();
        this.setState({ data: json });
    }

你应该这样使用它

Dostonbek Oripjonov
2019-09-19