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

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

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

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

React.js

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

Q&A

解決済

1回答

2388閲覧

投稿を編集、削除した時、表示されている投稿一覧画面を再描画したい

cypherys

総合スコア1

Ruby on Rails 5

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

React.js

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

0グッド

1クリップ

投稿2020/09/07 09:05

前提・実現したいこと

rails,reactを用いてアプリケーションを作成しています。

投稿を編集、削除した時、表示されている投稿一覧画面を再描画したいのですが実現できず困っています。

useContextなどを利用するともっと実装はスムーズに行えるのでしょうか?

どのように修正すれば良いのかご教授いただければ幸いです。。

該当のソースコード

import React, { useEffect, useState } from 'react'; import axios from 'axios'; import PostCard from './PostCard'; const PostList = () => { const [posts, setPosts] = useState([]); useEffect(() => { axios.get("http://127.0.0.1:3001/posts/lists") .then((results) =>{ setPosts(results.data); console.log(results.data); }) },[]); return( <div className="post-wrap"> <div className="post-list"> {posts.map(post => { return( <PostCard key={post.id} post={post} /> )} )} </div> </div> ) } export default PostList
import React from 'react'; import styled from 'styled-components'; import PostEditModal from './PostEditModal'; import PostDeleteModal from './PostDeleteModal'; const PostCard = (props) => { return( <PostCardcss> <div className="post-image">image</div> <div className="post-header"> <p className="post-title">{props.post.title}</p> </div> <div className="post-text"> {props.post.description.length > 35 ?( <p>{props.post.description.substr(0, 35)} [...]</p> ) : ( <p>{props.post.description}</p> ) } </div> <div className="post-footer"> <p className="post-user">ユーザーネーム</p> <PostEditModal id={props.post.id} title={props.post.title} description={props.post.description}/> <PostDeleteModal id={props.post.id}/> </div> </PostCardcss> ) }
import React, { useState, useCallback } from 'react'; import clsx from 'clsx'; import styled from 'styled-components'; import Axios from 'axios'; const PostEditModal = (props) => { const [isModal, setIsModal] = useState(false), [title, setTitle] = useState(props.title), [description, setDescription] = useState(props.description); const inputTitle = useCallback((event) =>{ setTitle(event.target.value) }, [setTitle]) const inputDescription = useCallback((event) =>{ setDescription(event.target.value) }, [setDescription]) const submitEdit = () => { Axios.put(`http://127.0.0.1:3001/posts/${props.id}`,{ title: title, description: description }) .then(() => { console.log("Edited!") setIsModal(!isModal) }) .catch(error => { console.log(error.response) }); } return( <React.Fragment> <Navcss onClick={() => setIsModal(!isModal)}>編集</Navcss> {isModal && ( <Modalcss> <div className="modal-mask" onClick={() => setIsModal(!isModal)}> </div> <div className="modal" > <p className="edit-post">編集</p> <div className="modal-message"> <input className={clsx("form-input","new-post-title")} name="title" value={title} onChange={inputTitle}/> <textarea className={clsx("form-input","new-post-article")} name="article" value={description} onChange={inputDescription}/> </div> <div className="modal-button-wrap"> <button className={clsx("button","modal-button")} onClick={() => submitEdit()}>完了</button> <button className={clsx("button","modal-button")} onClick={() => setIsModal(!isModal)}>キャンセル</button> </div> </div> </Modalcss> )} </React.Fragment> ) }
import React, { useState, useCallback } from 'react'; import clsx from 'clsx'; import styled from 'styled-components'; import Axios from 'axios'; import { useHistory } from 'react-router-dom'; const PostDeleteModal = (props) => { const [isModal, setIsModal] = useState(false); const submitDelete = () => { Axios.delete(`http://127.0.0.1:3001/posts/${props.id}`) .then(() => { console.log("Deleted!") setIsModal(!isModal) }) .catch(error => { console.log(error) }); } return( <React.Fragment> <Navcss onClick={() => setIsModal(!isModal)}>削除</Navcss> {isModal && ( <Modalcss> <div className="modal-mask" onClick={() => setIsModal(!isModal)}> </div> <div className="modal" > <div className="modal-message"> <div>投稿を削除しますか?</div> </div> <div className="modal-button-wrap"> <button className={clsx("button","modal-button")} onClick={() => submitDelete()}>削除</button> <button className={clsx("button","modal-button")} onClick={() => setIsModal(!isModal)}>キャンセル</button> </div> </div> </Modalcss> )} </React.Fragment> ) }

試したこと

postlistコンポーネント内のuseEffectの第二引数にpostsを入れると再描画はされるのですが無限ループしてしまいます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

編集・削除したときにPostListのuseEffectが走らないのでstateは変化しません。ゆえにrerenderも起こりません。
post-listを叩いてstateに入れる関数を各Modalに渡して、編集・削除時に呼ぶようにするのが最も簡単かと思います。

投稿2020/09/10 06:45

Hogeike

総合スコア293

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問