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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

React.js

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

Q&A

解決済

1回答

720閲覧

FirebaseでReactのstateをリアルタイムで反映したい

yamady

総合スコア176

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

React.js

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

0グッド

1クリップ

投稿2020/01/23 02:10

編集2020/01/23 02:57

いつもお世話になっております。

Firebaseと、Reactを使ってリアルタイムで更新されるアプリケーションを開発しています。
具体的に実現したいことは、同じページを2人がみているとして、1人がStateを更新すれば、もう1人側がみているStateもリアルタイムで更新されるような仕様を実現したいと考えています。

下記のコードで実装しているのですが、実際に1人がStateを更新した際にもう1人がみているStateもリアルタイムに更新するのですが、ここだとなぜか断続的にrenderStatusがまわり続けてしまい、かなり重くなってしまいます。

JavaScript

1class Post extends Component { 2 constructor(props) { 3 super(props); 4 this.state = { 5 to_status: false, 6 from_status: false 7 }; 8 } 9 10 // ここでRDBのstatusを変更する 11 handleSatus = () => { 12 const { post } = this.props; 13 firebase 14 .database() 15 .ref("/busy/" + post.uid) 16 .set({ 17 status: true, 18 last_changed: firebase.database.ServerValue.TIMESTAMP 19 }); 20 this.setState({ to_status: true }); 21 }; 22 23 renderStatus() { 24 const { post } = this.props; 25 const { to_status, from_status } = this.state; 26 27 // ここでRDBのstatusを取得する 28 let self = this; 29 firebase 30 .database() 31 .ref("/busy/" + posy.uid) 32 .once("value") 33 .then(function(snapshot) { 34 self.setState({ from_status: snapshot.val().status }); 35 }); 36 37 if (this.state.from_status) { 38 return ( 39 <p>変更されました</p> 40 ); 41 } else { 42 return ( 43 <p>変更されていません</p> 44 ); 45 } 46 } 47 48 render() { 49 return ( 50 <div> 51 {this.renderStatus()} 52 <button onClick={this.handleStatus()}>クリック</button> 53 </div> 54 ) 55 }

変更された時だけrenderStatus()を更新するような良いやり方はないでしょうか?
お知恵を拝借させていただけますと幸いです。

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

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

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

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

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

og24715

2020/01/23 02:40

renderPost がサンプルコードに出現しないのですが firebase の api かなにかでしょうか。
yamady

2020/01/23 02:58

失礼いたしました。renderStatusの間違いでした。 大変申し訳ございません。
guest

回答1

0

ベストアンサー

renderStatus 内の下のコードは Post コンポーネントが描画される度に実行されるので、 state が更新がされ再描画、renderStatus の実行、 state の更新…と無限ループするリスクがあります。適切な条件でのみ setState が実行されることを確認してください。

js

1firebase 2 .database() 3 .ref("/busy/" + posy.uid) 4 .once("value") 5 .then(function(snapshot) { 6 self.setState({ from_status: snapshot.val().status }); 7 });

投稿2020/01/23 06:06

og24715

総合スコア832

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

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

yamady

2020/01/24 05:47

ありがとうございます! また、`.on()`をつかうことで実現できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問