微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React - 未能为具有相同 ID卡片和模态的 2 个元素提供相同的状态

如何解决React - 未能为具有相同 ID卡片和模态的 2 个元素提供相同的状态

我正在渲染一些卡片,点击卡片后,我有相应的模式。卡片及其模态都有一个心形图标,我想在单击它们中的任何一个时将它们标记为“收藏夹”。我有一个“favoriteBeers”数组,我想在其中推送最喜欢的啤酒。我还有另一个名为“favorite”的状态,这是布尔值。问题是这种状态似乎颠倒了(当它应该是真的时它是假的,反之亦然)。此外,似乎只有一个项目在收藏夹数组中,无论我如何尝试将项目设置为收藏夹。

我已经解除了根组件上的数组状态,这是位于那里的一段代码

  const [favoriteBeers,setFavoriteBeers] = useState([]);

  const handleSetFavorite = id => {
    setFavoriteBeers([...favoriteBeers,beers.find(beer => beer.id === id)]);
  };

  const handleRemoveFavorite = id => {
    setFavoriteBeers(favoriteBeers.filter(beer => beer.id !== id));
    
  };

我还有一个用于卡片的组件,一个用于它的模态。我在两个组件中都有相同的功能

const [isFavorite,setIsFavorite] = useState(false);

 if (!isFavorite) {
        setIsFavorite(true);
        handleSetFavorite(id);
      } else {
        setIsFavorite(false);
        handleRemoveFavorite(id);
      }
    };

//the icon that calls the function
<IconButton aria-label='add to favorites'>
     {!isFavorite ? (
       <FavoriteBorderIcon
          onClickCapture={e => handleIconClick(e,beer.id)}
        />
      ) : (
         <FavoriteIcon onClickCapture={e => handleIconClick(e,beer.id)} />
  )}
</IconButton>

我还准备了一个带有组件的代码和盒子codesandbox,提前致谢

解决方法

一个问题是,在 <Home> 中,您的 isFavorite 道具是 undefined,因为 <App> 没有传递这样的东西。此外,您没有使用此道具值(当前为 undefined)来初始化 <BeerCard><BeerCardExpanded> 组件。

第二个问题 - 下面的代码只是更新组件自己的 isFavorite 状态并调用 handleSetFavorite,因为每个组件都有自己的本地 isFavorite 状态。

 if (!isFavorite) {
    setIsFavorite(true);
    handleSetFavorite(id);
  } 

例如,当 <BeerCard> 翻转它的 isFavorite 状态时,<BeerCardExpanded> 不会。所以我删除了这些本地状态并直接使用了 props.isFavorite


这是updated sandbox

我已在 <Home> 中添加了此方法:

const isFavorite = (beer,favoriteBeers) => {
   return favoriteBeers.includes(beer);
};

用于为 isFavorite (<BeerCard>) 的 isFavorite={isFavorite(beer,favoriteBeers)} 属性传递正确的布尔值

<BeerCardExpanded> (isFavorite={isFavorite(isClicked,favoriteBeers)}) 组件。


我使用了 rest params 语法 ...props 只是为了避免重命名 isFavorite 道具并进行最少的更改。你可以即兴创作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。