🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
React.js

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

Q&A

解決済

1回答

675閲覧

react 子コンポーネントの排他処理(クラスのオンオフ)

cheche0830

総合スコア187

React.js

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

0グッド

0クリップ

投稿2019/10/02 05:26

編集2019/10/02 05:32

https://teratail.com/questions/214103
でご質問させていただいたのですが、どうもうまくいかず再掲載です。
(前回分は念のためまだ解決済みにしておりません。)

https://codepen.io/ashpwwqg/pen/zYOgZGP
にソースを用意させていただいたのですが、
簡単に解説すると複数のボタンをmapで配置しており、
クリックしたものに特定のクラスをつけて選択されている状態を表現したいのですが、
(ここまでは一回できました)
ただ、ほかのボタンコンポーネントが選択された状態のままになってしまうので、
常にどれかひとつのみ選択された状態にしたいのですが、
どうもうまくできません。。

どのようにしたらよいかご教授いただけますと幸いです。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

CodePen の React のバージョンを見たら v0.13 びっくりしたので v16.8 を使っています。

jsx

1const preDataMembers = [{ 2 id: 1, 3 name: "あああ ああああ", 4}, { 5 id: 2, 6 name: "いいい いいいい", 7}, { 8 id: 3, 9 name: "ううう うううう", 10}]; 11 12function Members() { 13 const [members, setMembers] = React.useState(preDataMembers); 14 const [selectedMemberId, setSelectedMemberId] = React.useState(); 15 16 return ( 17 <section> 18 {members.map((member) => ( 19 <Member 20 name={member.name} 21 id={member.id} 22 onSelect={setSelectedMemberId} 23 selected={member.id === selectedMemberId} 24 /> 25 ))} 26 </section> 27 ); 28} 29 30function Member({ id, name, onSelect, selected }) { 31 const createClickHandler = (memberId) => (event) => { 32 onSelect(memberId); 33 } 34 35 return ( 36 <div onClick={createClickHandler(id)}> 37 <div style={{ color: selected && 'red' }}> 38 <span>{id}</span> 39 {name} 40 </div> 41 </div> 42 ); 43} 44 45const App = () => (<Members />); 46 47ReactDOM.render( 48 <App />, 49 document.querySelector('#root'), 50);

https://codepen.io/og24715/pen/MWWgBbM?editors=0010


クリックしたものに特定のクラスをつけて選択されている状態を表現したいのですが、

(ここまでは一回できました)
ただ、ほかのボタンコンポーネントが選択された状態のままになってしまうので、
常にどれかひとつのみ選択された状態にしたい

正しいマークアップをするならラジオボタンを使うべきでは?

<input type="radio"> - HTML: Hypertext Markup Language | MDN
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/radio

投稿2019/10/04 06:00

og24715

総合スコア832

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

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

cheche0830

2019/10/04 06:15

ありがとうございます。この書き方初めて見ました。。すいませんあまりreact得意ではなくて。、 ありがとうございます! すいません、ボタンの部分は実際はテーブルの行になってましてわかりやすいように簡略化してました! ご助言ありがとうございました! いただいたコード解読してみます!
cheche0830

2019/10/04 06:38

子でクリックしたものを親に伝播させるあたりがまだあまり理解できてないので調べてみます! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問