前提・実現したいこと
React で依存関係がある、かつその初期値が非同期で取得される。というようなフォームの作成をしています。
例:
・地方セレクトボックス
・県セレクトボックス
・市セレクトボックス
上記のようなセレクトボックスがあり「地方の値によって県の値が変わる」「県の値によって市の値が変わる」というような依存関係を持っている。かつユーザー設定値が初期表示時には設定される。
(「東北」を選択すると「青森県」」「青森市」が自動設定される。ただしユーザーが「弘前市」に住んでいた場合、初期表示時は「東北」「青森県」「弘前市」となる)
上記のようなフォームを useEffect() useState() を使用し作成しようとしています。
発生している問題
ユーザー設定値を初期値として設定する方法がわかりません。
依存関係のあるフォームなので useEffect() の第二引数配列に依存値を設定し値決定するように作ろうと思ったのですが、その場合、初期値を設定すると useEffect() が作動してしまい、初期値を上書きしてしまいます。(例だと市の初期値は「紘前」としたいが「青森」になってしまう)
依存値設定と初期値設定両方が実現できる方法がありましたらご教授願います。
(実際にはさらにフォームがあり依存関係が複雑なため、より煩雑でない実装方法であると幸いです)
該当のソースコード
typescript
1const Home: NextPage = () => { 2 const [region, setRegion] = useState('関東') // 地方 3 useEffect(() => { 4 const setInitialValue = async () => { 5 // 非同期で初期値を取得して設定 6 setRegion('東北') 7 } 8 setInitialValue() 9 }, []) 10 const handleChangeRegion = (e: ChangeEvent<HTMLSelectElement>) => { 11 setRegion(e.target.value) 12 } 13 14 const [prefecture, setPrefecture] = useState('東京') // 都道府県 15 useEffect(() => { 16 switch (region) { 17 case '関東': 18 setPrefecture('東京') 19 break 20 case '関西': 21 setPrefecture('大阪') 22 break 23 case '東北': 24 setPrefecture('青森') 25 break 26 } 27 }, [region]) 28 useEffect(() => { 29 const setInitialValue = async () => { 30 // 非同期で初期値を取得して設定 31 setPrefecture('青森') 32 } 33 setInitialValue() 34 }, []) 35 const handleChangePrefecture = (e: ChangeEvent<HTMLSelectElement>) => { 36 setPrefecture(e.target.value) 37 } 38 39 const [city, setCity] = useState('渋谷') // 市区 40 useEffect(() => { 41 switch (prefecture) { 42 case '東京': 43 setCity('渋谷') 44 break 45 case '大阪': 46 setCity('大阪') 47 break 48 case '青森': 49 setCity('青森') 50 break 51 } 52 }, [prefecture]) 53 useEffect(() => { 54 const setInitialValue = async () => { 55 // 非同期で初期値を取得して設定 56 setCity('弘前') 57 } 58 setInitialValue() 59 }, []) 60 const handleChangeCity = (e: ChangeEvent<HTMLSelectElement>) => { 61 setCity(e.target.value) 62 } 63 64 return ( 65 <Box> 66 <Box color="gray"> 67 <Box display="flex"> 68 <label>地方</label> 69 <select value={region} onChange={handleChangeRegion}> 70 <option value="関東">関東</option> 71 <option value="関西">関西</option> 72 <option value="東北">東北</option> 73 </select> 74 </Box> 75 <Box display="flex"> 76 <label>県</label> 77 <select value={prefecture} onChange={handleChangePrefecture}> 78 <option value="東京">東京</option> 79 <option value="大阪">大阪</option> 80 <option value="青森">青森</option> 81 </select> 82 </Box> 83 <Box display="flex"> 84 <label>市</label> 85 <select value={city} onChange={handleChangeCity}> 86 <option value="渋谷">渋谷</option> 87 <option value="大阪">大阪</option> 88 <option value="青森">青森</option> 89 <option value="弘前">弘前</option> 90 </select> 91 </Box> 92 </Box> 93 </Box> 94 ) 95} 96 97export default Home
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/02 10:30