Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9311

初心者がReact+FirebaseでWebアプリを作成する② ~複数の入力を取得してデータベースに反映させる~

$
0
0

①の続きです。

①で作ったfirebaseのデータベースに、入力された値を登録するようにします。

ReactのstateとsetStateで入力値を受け取れるようにします。
例でstateでnameに空値' 'を入れておきます。

App.js
classAppextendsReact.Component{constructor(props){super(props);this.state={name:'',}}

TextFieldを設けて、onChangeでgetNameメソッドを発動させsetStateを行うようにします。

App.js
//メソッド定義getName(event){this.setState({name:event.target.value,});};
App.js
//returnの中<TextFieldlabel="名前"value={this.state.Name}onChange={(event)=>{this.getName(event)}}/>

これでTextFieldの値がstateのnameに代入されます。

データの送り先を決めるため、
firebaseのDatabaseから「+コレクションの開始」をクリックして、コレクションを作成します。
コレクション名はとりあえず「users」として、ドキュメントIDは自動を選択。
すると下のような画面になります。
firebase database collection dekita.png

buttonを作って、このコレクションにnameの情報を送りましょう。
次のようになります。

App.js
importReactfrom'react';import'./App.css';importfirebasefrom"firebase/app"import"firebase/auth"import"firebase/firestore"import{firestore}from'./plugins/firebase';importButtonfrom'@material-ui/core/Button';importTextFieldfrom'@material-ui/core/TextField';classAppextendsReact.Component{constructor(props){super(props);this.state={name:'',}//ここでbindでthisを束縛しないとエラーが起きますthis.getName=this.getName.bind(this);this.addData=this.addData.bind(this);}getName(event){this.setState({name:event.target.value,});}; //データベースに登録するためのメソッド。usersの部分がコレクション名になりますaddData(){firestore.collection('users').add({name:this.state.name,}).then(()=>{this.setState({name:'',});})};render(){return(<div><TextFieldlabel="名前"value={this.state.name}onChange={(event)=>{this.getName(event)}}/><ButtononClick={this.addData}>登録</Button>
</div> );}}exportdefaultApp;

すると↓のようなページができます。
「登録」をクリックしてテスト送信してみましょう。
database 山田太郎.png
反映できました。
database 山田太郎が追加された.png

同じ要領でstateにaddressを設けて、住所も同時に登録できるようにします。
getAddressメソッドでsetStateを行えるようにしましょう。

App.js
importReactfrom'react';import'./App.css';importfirebasefrom"firebase/app"import"firebase/auth"import"firebase/firestore"import{firestore}from'./plugins/firebase';importButtonfrom'@material-ui/core/Button';importTextFieldfrom'@material-ui/core/TextField';importTextareaAutosizefrom'@material-ui/core/TextareaAutosize';classAppextendsReact.Component{constructor(props){super(props);this.state={name:'',address:'',}this.getName=this.getName.bind(this);this.getAddress=this.getAddress.bind(this);this.addData=this.addData.bind(this);}getName(event){this.setState({name:event.target.value,});};getAddress(event){this.setState({address:event.target.value,});};//new Date()で登録日時も記録しますaddData(){firestore.collection('users').add({name:this.state.name,address:this.state.address,created_at:newDate(),}).then(()=>{this.setState({name:'',address:'',});})};render(){return(<div><form><TextFieldlabel="名前"value={this.state.name}onChange={(event)=>{this.getName(event)}}/><br/><TextareaAutosizearia-label="住所"rows={6}placeholder="住所"value={this.state.address}onChange={(event)=>{this.getAddress(event)}}/>;
<br/><ButtononClick={this.addData}>登録</Button>
</form>
</div> );}}exportdefaultApp;

これで入力箇所が2つできました。
明訓.png

登録を押すと…

明訓完了.png

できました!

次回は画像のアップロードを投稿したいと思います。


Viewing all articles
Browse latest Browse all 9311

Trending Articles