首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使一次从一格牌中只扩大一张牌?

问如何使一次从一格牌中只扩大一张牌?
EN

Stack Overflow用户
提问于 2022-07-28 18:45:03
回答 2查看 228关注 0票数 0

我有一个‘卡片’显示游戏的网格,当我点击时,展开显示更多的信息,但是当我点击一个,所有的卡片展开打开,我只想一次展开一个。

这是我到目前为止所拥有的一个码箱。谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-28 19:12:29

这是工作部件。组件状态必须反映当前打开的卡,如果没有打开卡,则为null。还将class更改为className,因为这是从CSS设置组件类的正确方法

代码语言:javascript
复制
export const GameCard = () => {

  const [openedCard, setOpenedCard] = useState(null);

  return (
    <div id="card_wrapper">
      {games.map((game) => (
        <motion.div
          transition={{ layout: { duration: 1, type: "spring" } }}
          layout
          onClick={() => setOpenedCard(game.id)}
          key={game.id}
          className="card"
          name={game.name}
          style={{
            backgroundImage: `url(${game.background})`,
            backgroundSize: "cover",
            backgroundRepeat: "no-repeat"
          }}
        >
          <motion.h2 layout="position">
            {" "}
            <img src={game.logo} alt={game.alt} />
          </motion.h2>
          {openedCard === game.id && (
            <motion.div
              initial={{ opacity: 0 }}
              animate={{ opacity: 1 }}
              transition={{ duration: 1 }}
              className="expand"
            >
              <p> {game.description} </p>
            </motion.div>
          )}
        </motion.div>
      ))}
    </div>
  );
};

当点击任何卡时,扩展所有卡的问题与React无关,但它是由#card_wrapper的flex-box设置引起的:默认情况下,align-items设置为stretch,但您需要将其改为flex-start。

代码语言:javascript
复制
#card_wrapper {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: flex-start;
}

顺便说一下。您在样式表中定义了两次#card_wrapper,而不是在样式表中定义的。

最后一个但最不重要的是--记住使用className螺旋桨而不是class --您需要修复这个问题的games.js。

票数 1
EN

Stack Overflow用户

发布于 2022-07-28 19:06:57

试试这个:

代码语言:javascript
复制
// add new state to capture the index of the clicked element :
const [elementId, setElementId] = useState(null);

在返回部分中,捕获onClick中单击的索引:

代码语言:javascript
复制
return (
    <div id="card_wrapper">
      {games.map((game) => (
        <motion.div
          transition={{ layout: { duration: 1, type: "spring" } }}
          layout
          onClick={() => {
            setIsOpen(!isOpen);
            setElementId(game.id);
       }}
...)

最后,只有在(isOpen)和(game.id === elementId):

代码语言:javascript
复制
{isOpen && game.id === elementId && (
            <motion.div
              initial={{ opacity: 0 }}
              animate={{ opacity: 1 }}
              transition={{ duration: 1 }}
              class="expand"
            >

全沙箱示例:这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73157779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档