在前台导师网站(FAQ Accordion)上有一个挑战.我已经用Reaction解决了这个挑战.然而,我的代码不能正常工作.

除了在页面加载时第一次点击任何问题外,我必须双击每个问题才能切换它.我怀疑我的useState代码中有错误.

我创建了一个组件,该组件呈现问题/答案列表,并使用details个HTML标记显示它们.我只想使用详细信息标签来解决这个问题.

以下是我的组件代码:

import { Fragment, useState } from "react";
import minus from "./icon-minus.svg";
import plus from "./icon-plus.svg";

const Faq = ({ questionsObj }) => {
  const [isOpen, setIsOpen] = useState(false);
  const [selectedId, setSelectedId] = useState(null);
  function handleClick(id) {
    if (selectedId !== id) {
      setSelectedId(id);
    }
    if (selectedId === id) {
      setIsOpen(!isOpen);
    }
  }

  return (
    <main>
      {questionsObj.map((question, index) => (
        <Fragment key={question.id}>
          <details
            onClick={(e) => handleClick(question.id)}
            open={selectedId === question.id ? isOpen : null}
          >
            <summary>
              <span>{question.question}</span>

              <img
                src={
                  isOpen === false && selectedId === question.id
                    ? `${minus}`
                    : `${plus}`
                }
                alt=""
              />
            </summary>
            <p className="animate__animated animate__flipInX">
              {question.answer}
            </p>
          </details>
          {index !== questionsObj.length - 1 ? <hr /> : null}
        </Fragment>
      ))}
    </main>
  );
};

export default Faq;

我也认为我的代码不适合解决像手风琴这样的简单问题. 如果有人告诉我代码中的问题在哪里,我会很感激.

谢谢

推荐答案

参见issues/15486#issuecomment-873516817,您应该在<details/>的Click事件处理程序中使用e.preventDefault()

另外,你不需要isOpen个州.第selectedId章足够了

例如:

import { Fragment, useState } from 'react';

const Faq = ({ questionsObj }) => {
  const [selectedId, setSelectedId] = useState(null);
  function handleClick(e, question) {
    e.preventDefault();
    if (selectedId !== question.id) {
      setSelectedId(question.id);
    }
  }

  return (
    <main>
      {questionsObj.map((question, index) => (
        <Fragment key={question.id}>
          <details
            onClick={(e) => handleClick(e, question)}
            open={selectedId === question.id}
          >
            <summary>
              <span>{question.question}</span>
              <span>{selectedId === question.id ? '-' : '+'}</span>
            </summary>

            <p>{question.answer}</p>
          </details>
          {index !== questionsObj.length - 1 ? <hr /> : null}
        </Fragment>
      ))}
    </main>
  );
};

export default Faq;

stackblitz

Javascript相关问答推荐

禁用从vue.js 2中的循环创建的表的最后td的按钮

如何判断属于多个元素的属性是否具有多个值之一

TypScript界面中的Infer React子props

警告!合同执行期间遇到错误[执行已恢复](Base Layer 2)

Javascript,部分重排序数组

togglePopover()不打开但不关闭原生HTML popover'

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

在数组中查找重叠对象并仅返回那些重叠对象

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

TinyMCE 6导致Data:Image对象通过提供的脚本过度上载

为什么我的按钮没有从&q;1更改为&q;X&q;?

try 将Redux工具包与MUI ToggleButtonGroup组件一起使用时出错

如何根据查询结果重新排列日期

本地损坏的Java脚本

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色

未找到用于 Select 器的元素:in( puppeteer 师错误)

如何从图表中映射一组图表-js使用REACT

如何在不获取其子元素的文本内容的情况下获取元素的文本内容?

如何将缓冲区数组转换回音频

我正在为我的单选按钮在HTML中设置一个值.使用Java脚本,我如何才能获得该值?