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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

Q&A

1回答

1048閲覧

ReactのJavaScriptファイルでツイートアプリの投稿の表示を降順にしたい。

yoshiki44

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

0グッド

0クリップ

投稿2020/10/20 06:25

前提・実現したいこと

こちらの記事を参考にReactとFirebaseを使って簡易的なツイートアプリを作っています。
https://hirokianzai.com/2019/02/17/react-firebase-tweet-app
これを再現しただけだと、投稿した内容が古い順に表示されていますが、これを新しい物から順に上から表示されるようにしたいです。

発生している問題・エラーメッセージ

投稿した内容が古い順に表示されてしまう。

該当のソースコード

Javascript

1import React, { Component } from 'react'; 2import './App.css'; 3import firebase from 'firebase/app'; 4import firestore from 'firebase/firestore'; 5import config from './firebase-config.js'; 6 7firebase.initializeApp(config); 8const db = firebase.firestore(); 9const collection = db.collection('tweets'); 10 11class App extends Component { 12 constructor(props) { 13 super(props); 14 this.state = { items: [], user: '', text: '' }; 15 this.tweet = this.tweet.bind(this); 16 this.userName = this.userName.bind(this); 17 this.handleSubmit = this.handleSubmit.bind(this); 18 } 19 20 render() { 21 return ( 22 <React.Fragment> 23 <div className="container"> 24 <form onSubmit={this.handleSubmit} autoComplete="off"> 25 <div><input onChange={this.userName} value={this.state.user} id='tweets' placeholder=" 名前" className="name" maxlength="20" required/></div> 26 <br/> 27 <div><textarea id="new-todo" onChange={this.tweet} value={this.state.text} placeholder=" 投稿内容" className="text" maxlength="200" required/></div> 28 <br/> 29 <button className="btn forum" type="submit">投稿</button> 30 </form> 31 </div> 32  {/* TweetList Componentの呼び出し */} 33 <div className="tweet-list"> 34 <TweetList items={this.state.items}/> 35 </div> 36 </React.Fragment> 37 ); 38 } 39 userName(event){ 40 this.setState({user:event.target.value}); 41 } 42 tweet(event){ 43 this.setState({text:event.target.value}); 44 } 45 componentDidMount(){ 46 collection.orderBy('created','desc').get()/* この行に'desc'を付け加えたことによってリロード後に限り投稿が新しいもの順になりました */ 47 .then(snapshot =>{ 48 snapshot.docs.map(doc => { 49 console.log(doc.data()); 50 const allItems = { 51 user: doc.data().user, 52 text: doc.data().text, 53 created: doc.data().created, 54 } 55 this.setState(state => ({ 56 items: state.items.concat(allItems), 57 user: '',text: '' 58 })); 59 }); 60 }); 61 } 62 63 handleSubmit(event) { 64 {/* 名前・投稿内容が入力されなかった場合のバリデーション */} 65 event.preventDefault(); 66 if(this.state.user === "") { 67 alert('名前を入力してください') 68 return; 69 } else if(this.state.text === "") { 70 alert('投稿内容を入力してください') 71 return; 72 } 73 74 const newItem = { 75 user: this.state.user, 76 text: this.state.text, 77 }; 78 79 {/*データベースに入れる*/} 80 collection.add({ 81 user: this.state.user, 82 text: this.state.text, 83 created: firebase.firestore.FieldValue.serverTimestamp() 84 }) 85 .then(doc => { 86 console.log(`${doc.id}をDBに追加`); 87 }) 88 .catch(error =>{ 89 console.log(error); 90 }); 91 92 this.setState(state => ({ 93 items: state.items.concat(newItem), 94 user: '', 95 text: '' 96 })); 97 } 98} 99 100class TweetList extends React.Component { 101 render() { 102 return ( 103 <React.Fragment> 104 <ul> 105 {this.props.items.map((item, i) => ( 106 <li key={i}> 107 <div className="line-bc"> 108 <div className="balloon6"> 109 <div className="faceicon"> 110 <img src="icon.png"/>{item.user} 111 </div> 112 <div className="chatting"> 113 <div className="says"> 114 <p>{item.text}</p> 115 </div> 116 </div> 117 </div> 118 </div> 119 </li> 120 ))} 121 </ul> 122 </React.Fragment> 123 ); 124 } 125} 126export default App;

試したこと

自分なりに調べてみたところ、リロード後にはちゃんと新しい投稿順に並べ替えることができたのですが、投稿直後だけは投稿した物が最下部に表示されてしまいます。上の記事通りに作った現在のJavaScriptのソースコードを添付しますのでどうか教えてください。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答1

0

{/*データベースに入れる*/} collection.add({ // ... this.setState(state => ({ items: state.items.concat(newItem), user: '', text: '' }));

この段階ではデータがコレクションおよびitemsの末尾に追加されてしまうためだと思います。
componentDidMount中でdescを記載することで降順取得ができるようになることは理解いただいているようなので、同様の処理を追加時に行うだけだと思います。
※コレクションに対して再度collection.orderBy('created','desc').get()して取得した値をstateに入れるか、itemsだけをsort()を使って並べ替えるかの二択だと思います。

投稿2020/10/20 06:32

nekoniki

総合スコア2411

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

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

yoshiki44

2020/10/20 11:43

ご解答ありがとうございます。解決の方向性が分かりました。 コードについてはこのような形で近づいているでしょうか?いろいろ試してみたのですがまだうまくいかないです。見当違いでしょうか? ```JavaScript {/*データベースに入れる*/} collection.add({ // ... collection.orderBy('created','desc').get() this.setState(state => ({ items: state.items.concat(newItem), user: '', text: '' })); ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問