【问题标题】:How to show only one element in a Gatsby .map function?如何在 Gatsby .map 函数中只显示一个元素?
【发布时间】:2020-10-10 15:23:05
【问题描述】:

我是盖茨比的新手。我已经失去了在这里做什么......请帮助我...... 单击按钮时,我只想显示一个元素(h4)。 例如,我有 5 个计划,每个计划都有一个按钮和一个 h4 标签。 当我单击第三个按钮时,只会显示第三个 h4 标签。 正如我的代码所预期的那样,当单击按钮时,它会显示地图的每个元素的 h4 标记。在这种情况下,我有什么办法可以只为地图的一个元素启用/停用该组件? 提前谢谢你。

  import React, { useState } from "react"

  const TourPage = ({
      const [isOpen, setOpen] = React.useState(false)
      const toggleOpen = () => {
        setOpen(!isOpen)
      }

  return (
        <article>
           {plans.map((plan, index) => {
              return (
                <div key={index}>
                    <button
                      className="btn"
                      onClick={toggleOpen}
                    > button </button>
                    <div
                      className={`${isOpen ? "active" : "inactive"}`}
                    >
                      <h4>{plan.iternary}</h4>
                    </div>
                 </div>
               )
            })}
        </article>

【问题讨论】:

  • 发生这种情况是因为您的渲染循环考虑了 isOpen 状态变量,因为它对于所有索引都是相同的。检查另一个 SO answer

标签: javascript reactjs gatsby use-state array.prototype.map


【解决方案1】:

您需要有多个状态,每个计划的状态。

这里是一个简单的例子,你可以随心所欲地实现它,但概念是一样的:管理组件内的多个状态。

const plans = [{ id: `id1`, iternary: "a1" }, { id: `id2`, iternary: "a2" }];

const INITIAL = {
  id1: false,
  id2: false
};

const TourPage = () => {
  const [openManager, setOpenManager] = React.useState(INITIAL);

  return (
    <article>
      {plans.map(plan => {
        const onClick = () => {
          setOpenManager(prev => ({ ...prev, [plan.id]: !prev[plan.id] }));
        };
        return (
          <div key={plan.id}>
            <button className="btn" onClick={onClick}>
              button
            </button>
            <div className={`${openManager[plan.id] ? "active" : "inactive"}`}>
              <h4>{plan.iternary}</h4>
            </div>
          </div>
        );
      })}
    </article>
  );
};

【讨论】:

  • 非常感谢。它运行良好。我试图理解,但我无法 100% 理解这部分。如果你能解释一下,我将不胜感激。谢谢你。 :) const onClick = () => { setOpenManager(prev => ({ ...prev, [plan.id]: !prev[plan.id] })) }
猜你喜欢
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 2021-12-01
  • 2018-09-02
  • 2016-12-31
  • 1970-01-01
相关资源
最近更新 更多