【问题标题】:react.js buttons that display different items from array显示数组中不同项目的 react.js 按钮
【发布时间】:2021-05-27 01:00:59
【问题描述】:

我不知道如何问这个问题,但基本上我只想要显示不同文本的按钮列表。当您单击一个按钮时,它会显示文本。但不是硬编码每个按钮,我希望它是动态的。到目前为止,当我单击任何按钮时,所有内容都会显示而不是单独显示。 (一个按钮应该显示一个定义”我认为这可能是我使用状态的方式。

import React, { useState } from "react";
import terms from "./TermsComponentData.js";
import "./TermsComponent.css";
function TermsComponent() {
  const [showTerm, setShowTerm] = useState(false);
  const buttonList = terms.map((term, index) => (
    <div>
      {showTerm && <h1>{term.definition}</h1>}
      <button
        key={index}
        className="buttons-container-button"
        onClick={() => {
          setShowTerm(!showTerm);
        }}
      >
        {term.name}
      </button>
    </div>
  ));

  return (
    <div className="terms-container">
      <div className="buttons-container">{buttonList}</div>
    </div>
  );
}

我的数据

const terms = [
  {
   
    name: "Term1",
    definition: "This is the definition1",
  },
  {
   
    name: "Term2",
    definition: "This is the definition2",
  },
  {
   
    name: "Term3",
    definition: "This is the definition 3",
  },
  {
   
    name: "Term4",
    definition: "This is the definition 4",
  }
];

export default terms;

【问题讨论】:

    标签: arrays reactjs button


    【解决方案1】:

    目前,您的状态变量showTerm 对所有按钮都是通用的。所以要达到你描述的结果,你需要封装每个按钮的状态。

    最简单的方法是创建一个包含showTerm 状态的单独组件,然后根据terms 将这个组件的列表与给定数据映射:

    // ? added separate term button with it's own state
    function TermButton({ term }) {
      const [showTerm, setShowTerm] = useState(false);
    
      return (
        <div>
          {showTerm && <h1>{term.definition}</h1>}
          <button
            className="buttons-container-button"
            onClick={() => {
              setShowTerm(!showTerm);
            }}
          >
            {term.name}
          </button>
        </div>
      );
    }
    
    function TermsComponent() {
      return (
        <div className="terms-container">
          <div className="buttons-container">
            { // ? for each term, create a TermButton with the given term
              terms.map((term, index) => <TermButton key={index} term={term} />)}
           </div>
        </div>
      );
    }
    

    【讨论】:

    • 工作就像一个魅力!你这个炸弹!对于下面的那些,我必须在 Termbutton 函数中传递 index 属性。所以 ....function TermButton ({term , index})......而不是函数 TermButton ({term})。很明显,只需创建一个单独的组件!喜欢它。
    • 我已经更新了示例,因此直接为 TermsButton 设置了键并从组件内的按钮中删除了索引。
    • 谢谢!如果我想让所有按钮的输出在一个地方显示文本,我需要 If 语句吗?或案例?例如我点击按钮 1 它显示文本,我点击按钮 2 它替换相同的文本。
    • @lache 如果您知道如何在一个地方输出文本,请告诉我。到目前为止,这里是您的代码的工作链接:codesandbox.io/s/bold-haze-xpzrv?file=/src/TermsComponent.js
    • 我有更新版本但没有使用codesandbox.io,如何添加?
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2021-03-30
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多