質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

654閲覧

ラジオボタン3つのうち2つを同じ値にしたい、しかしonChangeイベントは発動するようにしたい

k49977

総合スコア27

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/06/03 10:43

編集2021/06/04 05:33

前提・実現したいこと

現在Reactの勉強をしています。
React,Formikを使っています。

ラジオボタンが現状3つあり、そのうち2つは同じvalueを持たせる設計です。
イメージ説明
「犬派」「犬派(理由あり)」を選択したときは、その下に新たに描画します

以下はイメージです。Formikを使えてはいません
https://codesandbox.io/s/priceless-kilby-l2bbb?file=/src/App.js

設計としてはラジオボタンの「犬派」「犬派(理由あり)」はdogとし、
その下に描画されるコンポーネントでdog,dog_riyuuをパラメータとして渡すようにします。

しかしその実装方針や方法がわかりません。
アドバイスいただけないでしょうか?

試したこと

ここに問題に対して試したことを記載してください。

・hiddenのフィールドを置いて、radioButtonのchangeイベントでそのフィールドに値を設定し、リクエストを投げる方針を思いつきましたが、実装方法がわかりません。Reactにinput type='hidden'はあるのか

追記

すみません、うまくやりたいことの意図が伝えられていなかったかもしれません。
基本的にラジオボタンはmustで、ラジオボタン郡はname="animal"的な感じです。そのanimalの値がcatとdogと区別したいです。
その上でラジオボタンの2つ目と3つ目を押したときにvalue値はdogとして送られるけど、表示領域が変わるようにしたいです
https://codesandbox.io/s/admiring-brattain-dzbkl?file=/src/App.js:0-949

react

1import React from "react"; 2 3function App() { 4 const [val, setVal] = React.useState("cat"); 5 6 const handleChange = (e) => setVal(e.target.value); 7 8 return ( 9 <> 10 {/* Field name='animal'的な*/} 11 <label> 12 <input 13 type="radio" 14 value="cat" 15 onChange={handleChange} 16 checked={val === "cat"} 17 /> 18 猫派 19 </label> 20 <label> 21 <input 22 type="radio" 23 value="dog" 24 onChange={handleChange} 25 checked={val === "dog"} 26 /> 27 犬派(理由なし) 28 </label> 29 <label> 30 <input 31 type="radio" 32 value="dog" // 送信されるvalue値としては2つ目もここも'dog'としたい 33 onChange={handleChange} 34 checked={val === "dog"} 35 /> 36 犬派(理由あり) 37 </label> 38 {/*//TODO 犬派(理由なし)を押したときに表示したい*/} 39 {<p>犬派(理由なし)</p>} 40 {/*//TODO 犬派(理由あり)を押したときに表示したい*/} 41 {<p>犬派(理由あり)です</p>} 42 </> 43 ); 44} 45 46export default App; 47 48

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/06/04 00:22

フォームの処理は、ブラウザが直接 form として送信するってことですか? それとも js で処理しますか?
k49977

2021/06/04 08:21 編集

formはformikを使って処理します。 あとはaxiosでAPIを叩いてrails連携をしてrails側でDBに保存します。 あとはreduxとか使っています。 すみません、少し質問を理解しきれておらず、答えになっていないかもしれません
hoshi-takanori

2021/06/04 06:39

formik 使ったことないので外してるかもですが、そのラジオボタンの選択内容を axios で API に送信するなら、その際にパラメータを好きなように設定できるのでは、ということです。
k49977

2021/06/04 08:20

ふむふむ。なるほどです!ありがとうございます。試してみます!
k49977

2021/06/04 09:03

ありがとうございます!hoshi-takanori様の開発方針でやりたいことができました。 onSubmit時にanimal='dog_riyuu_ari'の場合は、'dog_riyuunashi'と条件分岐を入れれば対応できました。 ありがとうございます。
guest

回答1

0

ベストアンサー

valueを同じにする必要があるのかはわかりませんが、やりたいことはこういうことでしょうか?
ボタンをコンポネント化して、取得したvalueに対し、indexOfメソッドでdogを含むか確認してから、あとはそれを表示するなり、制御に用いるなりするといいでしょう。

js

1import React from "react"; 2 3const Animal = (props) => { 4 const { handleChange } = props; 5 return ( 6 <input 7 type="radio" 8 name="animal" 9 onChange={() => { 10 handleChange(); 11 }} 12 /> 13 ); 14}; 15 16function App() { 17 const [val, setVal] = React.useState(""); 18 const getVal = (e) => { 19 let val = "" 20 if(e.indexOf('dog') !== -1){ 21 val = "犬派です" 22 }else if(e.indexOf('cat') !== -1){ 23 val = "猫派です" 24 } 25 setVal(val) 26 }; 27 const setKey = (animal) => { 28 return ( 29 <Animal 30 value={animal} 31 handleChange={() => { 32 getVal(animal); 33 }} 34 /> 35 ); 36 }; 37 38 return ( 39 <> 40 <label> 41 猫派 42 {setKey("cat")} 43 </label> 44 <label> 45 犬派(理由なし) 46 {setKey("dog")} 47 </label> 48 <label> 49 犬派(理由あり) 50 {setKey("dog_riyuu")} 51 </label> 52 <p>{val}</p> 53 </> 54 ); 55} 56 57export default App;

投稿2021/06/04 02:50

編集2021/06/04 02:54
FKM

総合スコア3647

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k49977

2021/06/04 05:13

ありがとうございます。確認させて頂きますmm
k49977

2021/06/04 05:31

indexOfの考え方はなかったので参考になりました。 少し目的を再度追記に書かせていただきましたのでご覧になっていただければ幸いです。
k49977

2021/06/04 09:03

onSubmit時にanimal='dog_riyuu_ari'の場合は、'dog_riyuunashi'と条件分岐を入れれば対応できました。 ご回答頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問