オン->オフ/オフ->スイッチング要素をオーバーラップさせないロジック


親構成部品

// 자식 컴포넌트에서 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が返されます.
  • ex:2つの切り替えがあれば、1つ目の切り替えが開いた場合、2つ目の切り替えをクリックしました.(要するに、1つ目のスイッチは必ずオフにし、2つ目のスイッチは必ずオンにしなければなりません!)もしそうであれば、親に格納されているインデックス値が1番目の切り替え[0]であり、現在クリックされているインデックス値が2番目の切り替え[1]であれば、現在のサブコンポーネントはisOpenDetailをfalseに返します.