【发布时间】:2021-05-23 17:09:22
【问题描述】:
使用 reactstrap 文档,我创建了一个带有可折叠卡片的伪手风琴。我希望能够切换卡片,这样当我单击 list 2 的卡片标题时,它会打开一次,如果我连续单击它,它将再次关闭。如果我点击 list 1,list 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);
}
}
并给出了标题:
onClick={handleToggle(list._id)}
但这给了太多的重新渲染/无限循环错误。
我还尝试了该函数的细微变化,结果相同。
【问题讨论】:
-
像这样重写
onClick处理程序:onClick={() => handleToggle(list._id)}
标签: reactjs accordion infinite-loop reactstrap