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

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

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

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

React.js

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

Q&A

解決済

1回答

497閲覧

State管理、Reactにおける関数コンポーネントではなく普通の関数の取り扱い

nosuke09

総合スコア9

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

React.js

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

0グッド

1クリップ

投稿2023/01/09 13:05

前提

フロント:React
サーバー:Node.js
データベース:MongoDB
でTodoアプリを作成しています。

実現したいこと

一応作成できたのですがデータベースを変更しているだけでStateを変更できていないのでリロードをしないと表示が変わりません。
じゃあStateを変えろという話なのですが、コンポーネントの切り分けの過程でState管理が難しくなってしまいました。
Stateの管理が適当だったので親元で管理するように変更しました。またデータベースのやり取りの関数も親元に全て配置しました。
構成としては
App.js内で{FormView}と{ListView}コンポーネントを表示しています。
App.jsで[tasks, setTasks]としてStateを管理。またデータベースのやり取りをする関数をまとめて置いています。
showTasks(),createTask()等。
問題はこれらの関数内でsetTasksをするわけですが、buttonのonClick等で発火させたいため他のコンポーネントで使用する必要がありますがexportできないので使用できません。

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

質問としては
・データベースと連携するためのメソッドはどのファイルに記述(管理)するのが適切か(関数はStateを取り扱う必要あり)
・データベースの更新とともにStateを更新するためにはどのようにしたらよいか

該当のソースコード

javascript

1function App() { 2 const [tasks, setTasks] = useState([]); 3 // データベースにアクセスして全てのタスクをセットする 4 const showTasks = async () => { 5 }; 6 7 const createTask = async () => { 8 }; 9 10 const deleteTask = async (_id) => { 11 }; 12 13 useEffect(() => { 14 console.log("副作用が実行されました。"); 15 showTasks(); 16 },[]); 17 18 return ( 19 <div className='todo_container'> 20 <FormView}></FormView> 21 <ListView></ListView> 22 </div> 23 ); 24} 25 26export default App;

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のようなことじゃなくてでしょうか?

Parent.tsx

親コンポーネントでは子コンポーネントにpropsを渡す

tsx

1import { useState, useEffect } from 'react' 2 3import Child from "./Child"; 4 5function Example() { 6 const [task, setTask] = useState(""); 7 8 const handleClick = () => { 9 setTask("task"); 10 }; 11 12 13 useEffect(() => { 14 console.log("副作用が実行されました。"); 15 // showTasks(); 16 },[]); 17 18 return ( 19 <div> 20 <Child handleClick={handleClick}/> 21 <div> 22 {task} 23 </div> 24 </div> 25 ); 26} 27 28export default Example;

Child.tsx

子コンポーネントではprops経由で関数を実行する

tsx

1function Child(props: any) { 2 return ( 3 <div> 4 <button onClick={props.handleClick}>Click</button> 5 </div> 6 ); 7} 8 9export default Child;

投稿2023/01/09 23:29

yuma.inaura

総合スコア1453

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問