前提・実現したいこと
お世話になっております。
タイトル通りReactで複数のselect要素の値をそれぞれユニークな値にしたいと思っています。
例えば3つのselect要素があり、それぞれ1~3の数字が選択できるとして、いずれかで1を選択した場合は他の2つでは1が選択できなくなる、という仕様にしたいです。
一応自分なりに実装はしてみたのですが、なぜか画面上でselect要素が更新されずおかしな動きになっています。
該当のソースコード
tsx
1import { useState, ChangeEvent } from 'react' 2 3type RankData = { 4 name: string 5 rank?: string 6} 7const initialData = [{ name: '佐藤' }, { name: '田中' }, { name: '鈴木' }, { name: '高橋' }] 8const ranks = ['1位', '2位', '3位', '4位'] 9 10export const App = () => { 11 const [rankData, setRankData] = useState<RankData[]>(initialData) 12 const unselectedRanks = ranks.filter((rank) => { 13 const usedRanks = rankData.map(({ rank: usedRank }) => usedRank) 14 return !usedRanks.includes(rank) 15 }) 16 const updateRankData = (e: ChangeEvent<HTMLSelectElement>, targetIndex: number) => { 17 setRankData((preRankData) => 18 preRankData.map((preData, index) => { 19 const { name } = preRankData[targetIndex] 20 const rank = e.target.value 21 return index === targetIndex ? { name, rank } : preData 22 }) 23 ) 24 } 25 26 return ( 27 <div id="app"> 28 {rankData.map(({ name, rank }, index) => ( 29 <div key={name}> 30 <p>{name}</p> 31 <select onChange={(e) => updateRankData(e, index)} value={rank}> 32 <option>--順位を選択--</option> 33 {unselectedRanks.map((unselectedRank) => ( 34 <option key={unselectedRank} value={unselectedRank}> 35 {unselectedRank} 36 </option> 37 ))} 38 </select> 39 </div> 40 ))} 41 </div> 42 ) 43}
試したこと
上記の通り、unselectedRanks
というrankData
内で使われていない値を保持する配列を作成して、それをループさせてoptionを作成しました。
今の自分では、正直どこが間違っているのか分からないので、よろしければみなさん力をお貸しください。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/08 03:09