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

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

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

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

React.js

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

Q&A

解決済

1回答

5421閲覧

【React】react-bootstrapのmodal内容をonClickで書き換えたい。

Point

総合スコア12

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

React.js

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

0グッド

0クリップ

投稿2016/12/13 08:03

編集2016/12/13 10:29

###前提・実現したいこと
初めての質問の為、分かりにくい部分があったら申し訳御座いません。

react-bootstrapのmodalを使って制作したフォームで
送信時にModal.Bodyに指定したテキストを表示したい。

###発生している問題・エラーメッセージ
エラーメッセージ等はコンソールに表示されておりません。
送信ボタンを押した時は内容に変化無しですが、
ModalのCloseボタンを押した時に止まっていた処理が実行されるようで
改めてModalを開くと内容が書き換わっているのが確認出来ます。

処理部分:
let p = findDOMNode(this.refs.text);
p.textContent = this.state.data;

render部:

<p ref="text"></p>

上記のようにすれば無理矢理書き換える事は出来ますが
スマートでないので…。

###該当のソースコード

React

1class ModalArea extends React.Component{ 2 constructor(props, context){ 3 super(props, context); 4 this.state = {showModal: false} 5 this.open = this.open.bind(this); 6 this.close = this.close.bind(this); 7 } 8 open() { 9 this.setState({showModal: true}); 10 } 11 close() { 12 this.setState({showModal: false}); 13 } 14 formSubmit(e){ 15 e.preventDefault(); 16 var text = e.target.value; 17 this.state = {data:"表示したい内容"} 18 } 19 20 render(){ 21 return( 22 <Modal className="modal-container" 23 show={this.state.showModal} 24 onHide={this.close} 25 animation={true} 26 bsSize="small"> 27 <Modal.Header closeButton> 28 <Modal.Title>タイトル</Modal.Title> 29 </Modal.Header> 30 <Modal.Body> 31 <div> 32 <FormGroup> 33 <FormControl type="text" ref="text" /> 34 <p>{this.state.data}</p> 35 </FormGroup> 36 <FormGroup> 37 <Button bsStyle="primary" bsSize="large" onClick={this.formSubmit.bind(this)} block >送信</Button> 38 </FormGroup> 39 </div> 40 </Modal.Body> 41 <Modal.Footer> 42 <Button onClick={this.close}>Close</Button> 43 </Modal.Footer> 44 </Modal> 45 ); 46 } 47}

###試したこと
処理のタイミングかと思いcomponentDidMount等も試して見たのですが、どうもうまく動作せず。

どうぞ宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

実行してみてはいないのですが

js

1this.state = {data:"表示したい内容"}

ここが

this.setState({data:"表示したい内容"})

ではないでしょうかね。ご提示のコードでは this.state を直接書きかえてしまっているので、その処理中では re-render されないため見た目上変化がないのだと考えられます。

今回はたまたま typo かも知れませんが state を更新したいときは常に setState() を利用します。

投稿2016/12/29 03:23

iktakahiro

総合スコア142

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

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

Point

2016/12/29 05:34

ご回答ありがとうございます! おっしゃるとおり変更しましたら、希望通りの動作が確認できました! 「this.state = 」と「this.setState()」は同じだと思ってたのですが違うんですね。 更新したい場合としたくない場合に使い分ける用という感じなのでしょうか。 とにかく実装でき大変助かりました!ありがとうございます!
iktakahiro

2016/12/29 08:27 編集

解決したようでよかったです。 使い分けについてですが、state を更新する場合は 常に `setState()` を利用するのが作法のようです。 > Never mutate this.state directly, as calling setState() afterwards may replace the mutation you made. Treat this.state as if it were immutable. - https://facebook.github.io/react/docs/react-component.html#state 特定の state の状態と再描画の有無を関連付けたい場合は `shouldComponentUpdate()` を利用することになると思います。当該のメソッドで false を返すと re-render が発生しません。 - https://facebook.github.io/react/docs/react-component.html#shouldcomponentupdate ただ、state は更新したいけれど表示には反映したくないという状況はあまり思いつかず、明確にその必要性がない限りは単純に `setState()` を利用するだけ特に他には何もしない、という方法でよいと考えています。
Point

2016/12/30 08:11

ご返信ありがとうございます! なるほど、今後は直接代入より常にsetState()を使う方が良さそうですね。勉強になりますっ! shouldComponentUpdata()…また覚えないといけない項目ですね。 DidとかWillConponentもまだうまく理解出来てなくて課題が盛りだくさんです。 本当に丁寧にお答え頂き有り難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問