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

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

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

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

Q&A

解決済

1回答

2458閲覧

react クリックしたところにクラスをつけてそれ以外ははずす

cheche0830

総合スコア187

React.js

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

0グッド

0クリップ

投稿2019/09/27 05:31

編集2019/09/27 05:32
*一部を抜粋 constructor(props) { super(props); this.state = { cssstyle: false, }; } cssChange= () => { this.setState({ cssstyle: !this.state.cssstyle}); }; render() { const cssstyle= ClassNames({ [theme.cssstyle]: this.state.cssstyle, }); return ( <section> <div className={cssstyle} onClick={ this.cssChange.bind(this) } >ボタン1</div> <div className={cssstyle} onClick={ this.cssChange.bind(this) } >ボタン2</div> <div className={cssstyle} onClick={ this.cssChange.bind(this) } >ボタン3</div> </section> ); };

cssファイル

section > div { width:100px; height:20px; color:#333; } .cssstyle { border:1px solid #ff0000; background:#000; color:#fff; }

このような形でボタンが3つあり、
くりっくしたものだけ、.cssstyleのクラスを付与したいのですが、
上記ですと当然どのボタンを押しても全部のボタンに.cssstyleがついてしまいます。
jqueryとかであれば簡単なのですがreactの場合、どのように
クリックしたもの以外はスタイルを外すもしくは最初からくりっくしたものだけしか
クラスがつかないようにするのでしょうか?

javascriptのremove()とかでレンダーされた後に無理やりcssを消す方法は
できたのですができれば、react内できれいに行いたいと思いまして・・

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

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

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

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

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

guest

回答1

0

ベストアンサー

パターン1.
ボタンごとに状態の元になるstateを別個に持つようにする

js

1state = { 2 isButton1Selected: false, 3 isButton2Selected: false, 4 isButton3Selected: false, 5}

など


パターン2. ボタンを子Componentにする

jsx

1 2class YourDiv extends React.Component { 3 constructor(props) { 4 this.state = { 5 selected: false 6 } 7 } 8 9 onClicked() { 10 this.setState({selected: !this.state.selected}); 11 } 12 13 render() { 14 let classes = this.props.classes 15 if(this.state.selected) classes.push('cssstyle') 16 return ( 17 <div 18 className={classes.join(' ')} 19 onClick={evt => this.onClicked()} 20 >{this.props.textContent}</div> 21 ) 22 } 23} 24 25class YourClassName extends React.Component { 26 constructor(props) { 27 super(props); 28 this.state = {}; 29 } 30 31 render() { 32 return ( 33 <section> 34 <YourDiv classes={['Other', 'Classes']} tetxtContent='ボタン1' /> 35 <YourDiv classes={['Other', 'Classes']} tetxtContent='ボタン2' /> 36 <YourDiv classes={['Other', 'Classes']} tetxtContent='ボタン3' /> 37 </section> 38 ); 39 }; 40}

投稿2019/09/27 06:37

編集2019/09/27 07:03
thyda.eiqau

総合スコア2982

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

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

thyda.eiqau

2019/09/27 06:50

おっと、失礼、それぞれが独立してクラスの付け外しができたらいいのかと思ってましたが、同時に複数個にクラスが付かない(ボタン1についている状態でボタン2をクリックしたら、1から外して2につける)ようにしないといけないのかな。そうであれば上記回答では不足ですね。必要に応じて編集しますので要件の再確認をお願いします。
cheche0830

2019/09/27 06:54

ありがとうございました。 子コンポーネント化がよさそうです! すいません、一点ご質問なのですが、 cssChange= (elm) => { elm.classList.toggle('cssstyle'); }; こちらはどのタイミングで実行されて何をしているものでしょうか??
thyda.eiqau

2019/09/27 07:00

それは無視してください!当初toggleでいいんじゃねーのと思って書いていて、子componentのほうがスマートだなと思ってやめたんですが、消すのを忘れてました
cheche0830

2019/09/27 07:27

あ、ありがとうございました!!!!!
cheche0830

2019/09/27 07:28

少し前に進めたので、もう少し自分で考えてみてダメだった場合また違うスレッドで質問ささせていただきます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問