繁体   English   中英

条件渲染仅适用于数组的第一个元素

[英]Conditional rendering only works for first element of the array

我有一个从“themealdb.com”渲染食物的项目。 使用全局上下文并从全局上下文导入数据。 themealdb 提供的每顿饭都用“地图”function 呈现。我有一个名为“收藏夹”的数组,如果已经将餐点添加到收藏夹,我想相应地呈现类似按钮。

我的目标是根据收藏夹数组中是否已有膳食来呈现类似按钮。 我的代码现在没有任何错误消息,但我在收藏夹数组中有一个用于迭代的 for 循环,但它仅适用于第一个元素。

我尝试对收藏夹数组中的每个元素使用 foor 循环进行迭代,如果 id 匹配,我希望它为 map function 中的每顿饭呈现不同的图标。

function decideLikeButton(favorites,idMeal){


    if(favorites.length<1){
      return(
        <FcLike />
      )     

    }
    else if(favorites.length>0){
      for (let i=0; i<favorites.length; i++){
        if(favorites[i].idMeal === idMeal){
          return(
            <FcDislike/>
          )
        }
        else{
          return(
            <FcLike/>
          )
        }
      }
    }
  }

这是我对组件的回报

 return <section className={"section-center"}>
{meals.map((singleMeal) => {
  const { idMeal, strMeal: title, strMealThumb: image } = singleMeal
  return <article key={idMeal} className={darkMode? "single-meal-dark": "single-meal"}>
    <img src={image} className='img' onClick={() => selectMeal(idMeal)} />
    <footer>
      <h5>{title}</h5>
      <button className="like-btn" onClick={() => { addToFavorites(idMeal) }}> 
        {
          decideLikeButton(favorites, idMeal)
          
        }
       </button>
    </footer>
  </article>
})}

问题与您的for循环有关。 您通过在第一次迭代中返回来打破循环。 您需要更换这部分:

for (let i=0; i<favorites.length; i++){
    if(favorites[i].idMeal === idMeal){
      return(
        <FcDislike/>
      )
    }
    else{
      return(
        <FcLike/>
      )
    }
}

使用此代码:

for (let i=0; i<favorites.length; i++){
    if(favorites[i].idMeal === idMeal){
      return(
        <FcDislike/>
      )
    }
}

return(
    <FcLike/>
)

重写 decideLikeButton function

function decideLikeButton(favorites, idMeal){
 if(favorites.findIndex(fav => fav.idMeal === idMeal) !== -1) {
    return <FcDislike/>

 } else {
    <FcLike/>
 }
}

这是因为你总是在第一次迭代时返回,试试这个:

function decideLikeButton(favorites, idMeal) {
  if (favorites.some((favorite) => favorite.idMeal === idMeal)) {
    return <FcDislike />;
  }
  return <FcLike />;
}

个人 ID go 用于:

const getReactionIcon = (favorites, lookUpIdMeal) => {
  if (favorites.some(({ idMeal }) => idMeal === lookUpIdMeal)) return <FcDislike />


return <FcLike />;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM