2 回答

TA貢獻1839條經驗 獲得超15個贊
創建單獨的組件來保持“打開”狀態。像這樣的東西..
function QuestionAnswer({post}) {
const [open1, setOpen1] = useState(true);
return (
<>
<div
className="questionrectangle "
onClick={() => setOpen1(!open1)}
name="step-one"
aria-controls="example-collapse-text"
aria-expanded={open1}
>
<p className="questiontext "> {post.QString}</p>
</div>
{open1 && (
<div name="step-two">
<p className="questionanswer">{post.Answer}</p>
</div>
)}
</>
);
}
現在,從您的主應用程序中獲取數據并為每個帖子創建一個組件 - 就像這樣
// Replace this with fetch request
const data = [
{ QString: "Question 1", Answer: "answer 1" },
{ QString: "Question 2", Answer: "answer 2" },
{ QString: "Question 3", Answer: "answer 3" }
];
return (
<Container fluid={true} className="text-center">
{data.map((post) => (
<QuestionAnswer post={post} />
))}
</Container>
);
}
現在,每個組件將保存自己的“打開”狀態副本,并且能夠處理單獨的打開和關閉狀態。
您可以查看完整的示例
https://codesandbox.io/s/beautiful-surf-ejron

TA貢獻1830條經驗 獲得超9個贊
思考這個問題的技巧是,每個子元素(您的 <Containers /> 列表)不應該負責了解它們的兄弟元素,或者如何負責任地管理它們之間的打開狀態而不引起沖突。這種責任應該更高一個層次,能夠看到所有的孩子并為他們管理。
應該很容易采用該手風琴示例供您自己使用。
const DocsManager = () => {
// Manage which step is open here, at a higher level
const [openIndex, setOpenIndex] = useState(0); // or whatever the default should be
// Records could live here, or be passed in as props
const [docs, setDocs] = useState([]);
useEffect(() => {
getDocs.then(setDocs);
}, [])
return docs.map((doc, i) =>
<YourComponent
isOpen={openIndex === i}
// Or maybe
open={() => setOpenIndex(i)}
// Or maybe
close={() => setOpenIndex(null)}
// Or maybe
next={() => setOpenIndex(openIndex + 1)}
doc={doc}
/>
);
};
添加回答
舉報