前提・実現したいこと
こちらの記事を参考に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のソースコードを添付しますのでどうか教えてください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/20 11:43