オン->オフ/オフ->スイッチング要素をオーバーラップさせないロジック
親構成部品 // 자식 컴포넌트에서 open한 index를 저장하기 위한 state
const [saveIndex, setSavedIndex] = useState(-1)
// index를 저장하는 메서드
const changeSaveIndex = (index) => {
setSavedIndex(index)
}
{arr.map((data, idx) => (
<Child
key={idx}
data={data}
index={idx}
saveIndex={saveIndex}
setSavedIndex={setSavedIndex}
changeSaveIndex={changeSaveIndex}
/>
))}
サブエレメント const Child = (props) => {
// 자식 컴포넌트의 toggle을 on/off 하는 state
const [isOpenDetail, setIsOpenDetail] = useState(false)
const handleToggle = () => {
setIsOpenDetail(!isOpenDetail)
props.changeSaveIndex(props.index)
}
useEffect(()=>{
setIsOpenDetail(props.saveIndex == props.index)
}, [props.saveIndex])
return (
<button onClick={handleToggle}>클릭</button>
)
}
オン
// 자식 컴포넌트에서 open한 index를 저장하기 위한 state
const [saveIndex, setSavedIndex] = useState(-1)
// index를 저장하는 메서드
const changeSaveIndex = (index) => {
setSavedIndex(index)
}
{arr.map((data, idx) => (
<Child
key={idx}
data={data}
index={idx}
saveIndex={saveIndex}
setSavedIndex={setSavedIndex}
changeSaveIndex={changeSaveIndex}
/>
))}
const Child = (props) => {
// 자식 컴포넌트의 toggle을 on/off 하는 state
const [isOpenDetail, setIsOpenDetail] = useState(false)
const handleToggle = () => {
setIsOpenDetail(!isOpenDetail)
props.changeSaveIndex(props.index)
}
useEffect(()=>{
setIsOpenDetail(props.saveIndex == props.index)
}, [props.saveIndex])
return (
<button onClick={handleToggle}>클릭</button>
)
}
オンisOpenDetail
の切り替え.changeSaveIndex
現在クリックしているサブエレメントのインデックスを保存します.isOpenDetail
のスイッチです.useEffect
現在クリックしているサブエレメントは変更のたびに実行されます.親インデックスが現在のインデックスと同じ場合は、trueを返してsetIsOpenDetail
に保存します.親インデックスが現在のインデックスと異なる場合はfalseが返されます.
Reference
この問題について(オン->オフ/オフ->スイッチング要素をオーバーラップさせないロジック), 我々は、より多くの情報をここで見つけました https://velog.io/@miyoni/toggle-요소들을-겹치지-않게-on-off-off-on-시키는-로직テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol