使用 reactstrap 切换手风琴功能?

Toggle Accordion functionality with reactstrap?

使用 reactstrap 文档,我创建了一个带有可折叠卡片的 pseudo-accordion。我希望能够切换卡片,这样当我点击 list 2 的卡片 header 时,它会打开,如果我点击它,它会再次关闭连续地。如果我单击 list 1list 2 应该关闭,list 1 应该打开,如预期的那样。

手风琴组件:

import React, { Fragment, useState } from 'react';
import { Collapse, CardBody, Card, CardHeader } from 'reactstrap';

const Lists = () => {
    const [isOpen, setIsOpen] = useState('');
    const [lists, setLists] = useState([
        {
            _id: 'id_abc',
            item_names: ['item 1', 'item 2', 'item 3'],
            list_name: 'List 2',
            author_name: 'Samantha Samson',
        },
        {
            _id: 'id_xyz',
            item_names: ['item 1', 'item 1', 'item 2', 'item 16'],
            list_name: 'List 1',
            author_name: 'John Johnson',
        },
    ]);

return (
    <Fragment>
        {lists.map((list) => (
            <Card key={list._id}>
                <CardHeader onClick={() => setIsOpen(list._id)}>
                    <h4>{list.list_name}</h4>
                </CardHeader>
                <Collapse isOpen={isOpen === list._id ? true : false}>
                    <CardBody>
                        <ul>
                            {list.item_names.map((item) => (
                                <li>{item}</li>
                            ))}
                        </ul>
                    </CardBody>
                </Collapse>
            </Card>
        ))}
    </Fragment>

);

我尝试向 onClick 添加一个函数,如下所示:

const handleToggle = (id) => {
    if(isOpen === id) {
        setIsOpen('');
    } else {
        setIsOpen(id);
    }
}

并给出了 header:

onClick={handleToggle(list._id)}

但这给了很多 rerenders/infinite 循环错误。

我也尝试了该函数的细微变化,结果相同。

你已经用这个修复了它:

  const handleToggle = (id) => {
    if (isOpen === id) {
      setIsOpen("");
    } else {
      setIsOpen(id);
    }
  };

太棒了!你犯错的地方是这样称呼它:

onClick={handleToggle(list._id)}

这将在每次渲染时调用该函数,并且由于它会更新状态变量,您将获得无限次渲染。

应该是:

onClick={() => handleToggle(list._id)}

沙盒:https://codesandbox.io/s/hungry-jepsen-1ip0x?file=/src/App.js

仅供参考: 您可以将三元运算符简化为:

isOpen={isOpen === list._id}