【问题标题】:Why do i have a problem rendering this 'Loading' component in react?为什么我在反应中渲染这个“加载”组件时遇到问题?
【发布时间】:2023-03-28 06:18:01
【问题描述】:

我有 2 个组件使用从 json 服务器获取的相同数据。
一个组件使用的数据如下所示:

function Home(props) {
return (
    <div className='container'>
        <div className='row align-items-start'>
            <div className='col-12 col-md m-1'>
                <RenderCard item={props.dish}
                    isLoading={props.dishesLoading}
                    errMess={props.dishErrMess} />
            </div>
            <div className='col-12 col-md m-1'>
                <RenderCard item={props.promotion}
                    isLoading={props.promoLoading}
                    errMess={props.promoErrMess} />
            </div>
            <div className='col-12 col-md m-1'>
                <RenderCard item={props.leader}
                    isLoading={props.leaderLoading}
                    errMess={props.leaderErrMess} />
            </div>
        </div>
    </div>
);}

其他组件使用数据如下:

const leaders = props.leaders.map((leader) => {
    return (
        <RenderLeader leader={leader} isLoading={props.isLoading}
            errMess={props.errMess} />
    );
});

RenderLeader 和 RenderCard 组件都具有类似的结构,带有一个 if-else 循环来显示加载动画或错误消息以及实际内容。

function RenderLeader({ leader, isLoading, errMess }) {
if (isLoading) {
    return (
        <Loading />
    );
}
else if (errMess) {
    return (
        <h4>{errMess}</h4>
    );
}
else
    return (CONTENT)  

问题是 Home 组件显示加载动画和错误消息,但结构完全相同的其他组件却没有显示。此外,实际上是为第二个组件获取数据,只是它不会显示加载动画和错误消息。这有什么问题?
编辑
这就是我调用它们的方式:

<Home
                dish={this.props.dishes.dishes.filter((dish) => dish.featured)[0]}
                dishesLoading={this.props.dishes.isLoading}
                dishErrMess={this.props.dishes.errMess}
                promotion={this.props.promotions.promotions.filter((promo) => promo.featured)[0]}
                promoLoading={this.props.promotions.isLoading}
                promoErrMess={this.props.promotions.errMess}
                leader={this.props.leaders.leaders.filter((leader) => leader.featured)[0]}
                leaderLoading={this.props.leaders.isLoading}
                leaderErrMess={this.props.leaders.errMess}

            />

<Route path='/aboutus' component={() => <About leaders={this.props.leaders.leaders}
                            isLoading={this.props.leaders.isLoading}
                            errMess={this.props.leaders.errMess} />} />

【问题讨论】:

  • 我已经确保所有的道具都正确匹配。
  • 如果你不链接它,我们很难告诉你另一个组件有什么问题:) 如果它们完全相同,那么一定有一个道具差异 - 你没有显示我们如何调用Home(或其他组件)

标签: reactjs redux react-props conditional-rendering


【解决方案1】:

Home 组件可以正常工作,因为它可以呈现单独的卡片。而对于下面的结构,

const leaders = props.leaders.map((leader) => {
return (
    <RenderLeader leader={leader} isLoading={props.isLoading}
        errMess={props.errMess} />
);
});

如果 props.leaders 为空,它不能迭代,因此 RenderLeader 永远不会被调用。因此,当 props.isLoading 为 true 时,props.leaders 将为空,上面的箭头函数将不返回任何内容。一旦 props.leaders 被填充,上面的函数就会被调用,但是 props.isLoading 已经被设置为 false。 这就是没有显示加载图标或错误消息的原因。

您可以将调用修改为,

<div className="col-12">
       <Media list>
            <RenderLeaderList leaders={props.leaders} isLoading= 
                   {props.leadersLoading} errMess={props.leadersErrMess}/>
       </Media>
</div>

并创建一个名为 RenderLeaderList 的新函数;

function RenderLeaderList({leaders, isLoading, errMess})
{
      if(isLoading)
      {
        return(
         <Loading />
        );
      }
      else if(errMess)
      {
         return(
            <h4>{errMess}</h4>
         );
      }
      else{
         if(leaders!=null)
         {
            const leaders_map = leaders.map((leader) => {
            return(
                <div key={leader.id} className="col-12 mt-5">
                    <RenderLeader leader={leader}/>
                </div>
            );
          });
         return (
            <div>
                {leaders_map}
            </div>
        );
    }
}   

} 让它工作。 希望能帮助到你! :D

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 2020-10-11
    • 1970-01-01
    • 2020-10-01
    • 2017-06-23
    • 2010-10-21
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多