html React -如何更改当前单击项的折叠式标题的文本

ryoqjall  于 2022-11-27  发布在  React
关注(0)|答案(2)|浏览(107)

我正在制作一个简单的Reactjs accordion应用程序,其中完成了每个单独项的折叠和展开。

要求:

一个简单的要求是,我需要根据点击将标题的文本切换为ExpandShrink
如果我们单击任何一项,则会显示内容,在这种情况下,文本将更改为“收缩”,因为折叠式面板打开,因此“收缩”标题用于关闭折叠式面板。

完整的工作示例:


在上面的示例中,我使用了以下代码来更改文本,

** accordion .js**

import React, { useState } from "react";
import Text from "./text";
import Heading from "./heading";
import getAccordion from "./GetAccordion";

const Accordion = getAccordion(1);

const accordionData = [
  {
    id: 1,
    content: "This is a first content"
  },
  {
    id: 2,
    content: "This is a second content"
  },
  {
    id: 3,
    content: "This is a third content"
  }
];

const NormalAccordion = () => {
  const [toggleValue, setToggleValue] = useState(-1);

  const toggleHandler = (index) => {
    setToggleValue(index);
  };

  return (
    <div>
      {accordionData.map((item, index) => (
        <Accordion>
          <Heading>
            <div
              style={{ padding: "10px", cursor: "pointer" }}
              className="heading"
              onClick={() => toggleHandler(index)}
            >
              {toggleValue !== index ? `Expand` : `Shrink`}
            </div>
          </Heading>
          <Text>{item.content}</Text>
        </Accordion>
      ))}
    </div>
  );
};

export default NormalAccordion;

这一行{toggleValue !== index ?Expand:Shrink}更改了文本一次,但之后在标题上进一步切换(扩展/收缩)时不会进行任何更改。
请帮助我实现基于相应的点击在展开和收缩之间切换文本的结果。

3bygqnnd

3bygqnnd1#

如果已单击该项目,则应重置toggleValue

const toggleHandler = (index) => {

    index===toggleValue?setToggleValue(-1): setToggleValue(index);
  };

然后使用condition呈现当前内容:

<Text>{toggleValue === index && item.content}</Text>

并将Text组件简化为:

<div style={{ ...this.props.style }}>
        <div className={`content ${this.props.text ? "open" : ""}`}>
          {this.props.children}
        </div>
      </div>
5hcedyr0

5hcedyr02#

您应该使用布尔值,因为折叠面板可以有2个值。

创意:

  • 创建定义展开/折叠行为的独立accourdion组件。
  • 创建一个调用this组件的 Package 视图组件。
  • 从该视图中将数据作为道具传递,而不是使用本地硬编码对象。

这种方法的好处是你有两个模块化的组件,只在道具上工作。这些可以在以后导出到它们自己的独立库。
理想情况下,组件应该是哑的,并且应该只知道它自己基于状态和属性的行为。
Updated sandbox

  • Accoirdion组件变更
const [toggleValue, setToggleValue] = useState(false);

const toggleHandler = () => {
  setToggleValue(!toggleValue);
};
  • 可折叠视图更改
const AccordionView = ({ accordionData }) => {
  return (
    <div>
      {accordionData.map((item) => (
        <NormalAccordion content={item.content} />
      ))}
    </div>
  );
};
  • Constants:我创建了一个名为constants的文件夹,用于保存硬编码对象,然后使用来自index.js的props传递它
export const accordionData = [{
    id: 1,
    content: "This is a first content"
  },
  {
    id: 2,
    content: "This is a second content"
  },
  {
    id: 3,
    content: "This is a third content"
  }
];
  • index.js中的更改
import { accordionData } from '../constants/accordion-data'

...

<NormalAccordion accordionData={ accordionData } />

相关问题