我是新的react ,所以请友好.

我有一个手风琴,显示搜索的词,我试图传递一个状态到这个手风琴中的每个子,但我似乎不能让状态切换时,子元素被点击.

到目前为止,我有我的手风琴(我已经删除了它周围的代码):

const [isOpen, setIsOpen] = useState(false)

 const toggleAccordion = () => {
     setIsOpen(!isOpen)   
 }

return (
  <div className='grid'>
    {enableSearch && searchComponents}
    {accordionData.length > 0
      ? (
        <section className='accordion' data-kontent-item-id={id}>
          {title &&
            <h2 className='accordion__title'>{title}</h2>}
          {accordionData.map(
            (item, key) =>
              item.title && (
                <AccordionItem
                  key={key}
                  title={item.title}
                  text={item.text}
                  itemId={item.id}
                  onClick={toggleAccordion}
                  onKeyDown={handleKeyDown}
                  isOpen={isOpen}
               />
              )
          )}
        </section>
        )
      : (
          enableSearch && (
            <div
              className='mt-8'
              dangerouslySetInnerHTML={{ __html: noResultsText }}
            />
          )
        )}
  </div>
)

我的手风琴项目:

const AccordionItem = ({ title, text, itemId, isOpen }) => {

 const contentRef = useRef(null)

  return (
    <div className={`accordion__item ${isOpen ? 'accordion__item-label--expanded' : ''}`} data-kontent-item-id={itemId}>
      <div
        className='accordion__item-label js-accordion__item-label'
        tabIndex={0}
      >
      </div>
      <div
        className='accordion__item-content js-accordion__item-content'
        ref={contentRef}
      >
        <div className='accordion__item-content-wrapper' dangerouslySetInnerHTML={{ __html: text }} />
      </div>
    </div>
  )
}

我希望在单击手风琴项时更改isOpen状态.我没有得到任何错误.

推荐答案

AccordionItem应该像button元素一样将onClick prop传递给实际的DOMNode,这样当它被点击时,它就可以切换状态.

示例:

const AccordionItem = ({
  onClick,
  title,
  text,
  itemId,
  isOpen
}) => {
  const contentRef = useRef(null);

  return (
    <div className={`accordion__item ${isOpen ? 'accordion__item-label--expanded' : ''}`} data-kontent-item-id={itemId}>
      <div
        className='accordion__item-label js-accordion__item-label'
        tabIndex={0}
      >
      </div>

      <button type="button" onClick={onClick}>
        Toggle Accordion
      </button>

      <div
        className='accordion__item-content js-accordion__item-content'
        ref={contentRef}
      >
        <div className='accordion__item-content-wrapper' dangerouslySetInnerHTML={{ __html: text }} />
      </div>
    </div>
  )
}

您将遇到的下一个问题是,您正在使用一个isOpen状态,该状态被传递给所有手风琴组件,并且它们都将被切换到一起.我的建议是将isOpen从一个布尔值改为一个可空的字符串/数字类型,它与你想要打开的特定手风琴相一致,或者如果你想一次打开多个手风琴,就使用一个对象.

示例:

单开手风琴:

const [isOpen, setIsOpen] = useState(null);

const toggleAccordion = (id) => {
  setIsOpen(isOpen => isOpen === id ? null : id);
}
{accordionData
  .filter(item => item.title)
  .map((item) => (
    <AccordionItem
      key={item.id}
      title={item.title}
      text={item.text}
      itemId={item.id}
      onClick={() => toggleAccordion(item.id)}
      onKeyDown={handleKeyDown}
      isOpen={isOpen === item.id}
    />
  )
)}

多开口手风琴:

const [isOpen, setIsOpen] = useState({});

const toggleAccordion = (id) => {
  setIsOpen(isOpen => ({
    ...isOpen,
    [id]: !isOpen[id],

  }));
}
{accordionData
  .filter(item => item.title)
  .map((item) => (
    <AccordionItem
      key={item.id}
      title={item.title}
      text={item.text}
      itemId={item.id}
      onClick={() => toggleAccordion(item.id)}
      onKeyDown={handleKeyDown}
      isOpen={isOpen[item.id]}
    />
  )
)}

Javascript相关问答推荐

当在select中 Select 选项时,我必须禁用不匹配的 Select

我应该在redux reducer中调用其他reducer函数吗?

Google Apps脚本中的discord邀请API响应的日期解析问题

角色 map 集/spritebook动画,用户输入不停止在键上相位器3

在观察框架中搜索CSV数据

jQuery s data()[storage object]在vanilla JavaScript中?'

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

如何将多维数组插入到另一个多维数组中?

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

在使用位板时,如何在Java脚本中判断Connect 4板中中柱的对称性?

覆盖加载器页面避免对页面上的元素进行操作

一个实体一刀VS每个实体多刀S

JS Animate()方法未按预期工作

如何在和IF语句中使用||和&;&;?

顶点图使用组标签更新列之间的条宽

JavaScript:多个图像错误处理程序

React数组查找不读取变量

使用props 将VUE 3组件导入JS文件

相对于具有选定类的不同SVG组放置自定义工具提示

在JS/TS中构造RSA公钥