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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

React.js

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

Q&A

解決済

1回答

814閲覧

React 非同期 crud処理

Shika_Tech

総合スコア13

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

React.js

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

0グッド

0クリップ

投稿2020/08/12 08:55

前提・実現したいこと

Reactの非同期処理について学習中です。シンプルなCRUD機能を実装しようと思い、非同期で新規作成(POST)一覧表示(GET)をRails-apiの環境で作成しております。

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

非同期処理のタイミングが上手く行きません。
具体的には、postしたい内容をinputに入力し、create処理が走るのですが、buttonを二回押さないと発火しません。
というより、発火自体はするのですが、createとgetの処理が一回ずつずれております。下記ごご覧ください。
https://gyazo.com/982624c800aab88a96f3a2a61193fd89
ご覧の通り、テキストを入力するイベントと、postアクションを呼び出すクリックイベントがどちらも、次のイベントが発火した時に一つ前の処理が行われるかたちになっていると思います。

該当のソースコード

react

1import React from "react" 2class IndexComponent extends React.Component { 3 constructor(){ 4 super() 5 this.state = { 6 users: [], 7 name: '', 8 post: '' 9 } 10 } 11 12 handleinputChange = (e) => { 13 this.setState({[e.target.name]:e.target.value}) 14 console.log(this.state) 15 } 16 17 createPostRequest = () => { 18 fetch('http://localhost:3000/users', { 19 method: 'post', 20 body: JSON.stringify(this.state), 21 headers: { 22 'Content-Type': 'application/json' 23 }, 24 }) 25 .then(this.fetchIndex()) 26 } 27 28 componentDidMount = () => { 29 this.fetchIndex() 30 } 31 32 fetchIndex= () => { 33 fetch("http://localhost:3000/users") // データを取得しに行く 34 .then( res => res.json() ) // json型のレスポンスをオブジェクトに変換する 35 .then( res => { // オブジェクトに変換したレスポンスを受け取り、 36 this.setState({ users: res }) // Stateを更新する 37 }) 38 } 39 40 render() { 41 const { users, name, post } = this.state; 42 return ( 43 <div> 44 <ul> 45 {users.map(user => ( 46 <li key={user.id}> 47 {user.id} {user.name} {user.post} 48 </li> 49 ))} 50 </ul> 51 <p>name</p> 52 <input 53 type='text' 54 name='name' 55 value={name} 56 onChange={this.handleinputChange} 57 /> 58 <p>post</p> 59 <input 60 type='text' 61 name='post' 62 value={post} 63 onChange={this.handleinputChange} 64 /> 65 <button id="submit" onClick={this.createPostRequest}>submit</button> 66 </div> 67 ); 68 } 69} 70 71export default IndexComponent;

ruby

1 def index 2 @users = User.all 3 render json: @users 4 end 5 6 def create 7 @user = User.create(user_params) 8 render json: @user 9 end 10

以上です。

目標としては、button押下時に一覧が更新するという処理を行いたいです。
ご存知の方いらっしゃいましたら、お力添えいただけると大変嬉しいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

.then(this.fetchIndex()) thenに渡すときに実行してしまっています。
()を削除してみてください。

投稿2020/08/13 03:42

kmtr

総合スコア213

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

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

Shika_Tech

2020/08/16 05:03

コメントありがとうございます!そしてお返事おそくなり大変申し訳ございません。 今回は this.(() => this.fetchIndex())とすることで解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問