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

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

新規登録して質問してみよう
ただいま回答率
85.35%
React.js

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

Q&A

0回答

365閲覧

reactを使用したodoアプリにおいて、異なるコンポーネントのstateを自由に変更したい

kimch

総合スコア8

React.js

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

0グッド

0クリップ

投稿2021/07/03 01:36

編集2021/07/03 02:38

前提・実現したいこと

todoリストにおいて、ステータスの変更に応じて背景色を変更したい。

問題点/エラー内容/エラー文章

TypeError: setTodoStatus is not a function
onChangeTodoStatus
src/components/TodoStatus.jsx:7

該当ソースコード

react

1InputTodo.jsx 2 3import React from 'react'; 4import { useState } from 'react'; 5import styled from 'styled-components'; 6import TodoStatus from './TodoStatus'; 7 8export const InputTodo =(props)=>{ 9 const { onClickAdd, disabled} = props; 10 11 const [todoTitle,setTodoTitle]= useState(""); 12 const [todoText,setTodoText]= useState(""); 13 const [todoLimit,setTodoLimit]= useState(""); 14 const [todoStatus,setTodoStatus]= useState(""); 15 16 17 const onChangeTitleValue = (e)=>setTodoTitle(e.target.value); 18 const onChangeTextValue = (e)=>setTodoText(e.target.value); 19 const onChangeLimitValue = (e)=>setTodoLimit(e.target.value); 20 21 return( 22 <> 23 <INputBlock> 24 <INputArea> 25 <TItle>入力してください</TItle> 26 <INputTag autoFocus disabled={disabled} placeholder="titleを入力してください" value={todoTitle} onChange={onChangeTitleValue}></INputTag> 27 </INputArea> 28 <INputArea> 29 <TExtArea disabled={disabled} placeholder="todoを入力してください" value={todoText} onChange={onChangeTextValue}></TExtArea> 30 </INputArea> 31 <INputArea> 32 <INputTag disabled={disabled} placeholder="limitを入力してください" value={todoLimit} onChange={onChangeLimitValue}></INputTag> 33 <br /> 34 <TodoStatus todoStatus={todoStatus} setTodoStatus={setTodoStatus}/> 35 <BUtton disabled={disabled} onClick={()=>{ 36 onClickAdd(todoTitle,todoText,todoLimit, todoStatus) 37 setTodoTitle('') 38 setTodoText('') 39 setTodoLimit('') 40 setTodoStatus("未着手") 41 42 }} >追加</BUtton> 43 44 </INputArea> 45 </INputBlock> 46 </> 47 ) 48}; 49 50const INputBlock = styled.div` 51background-color: rgb(202, 211, 39); 52width: 80%; 53border-radius: 20px; 54padding-bottom:10px; 55` 56 57const INputArea = styled.div` 58margin: 20px; 59` 60 61const TItle = styled.p` 62text-align: center; 63font-size: 25px; 64font-weight: bold; 65color: #666; 66` 67 68const INputTag = styled.input` 69border-radius: 20px; 70border: none; 71padding: 6px 20px; 72outline:none 73` 74const TExtArea = styled.textarea` 75border-radius: 20px; 76border: none; 77height: 80px; 78width: 80%; 79padding: 20px 20px; 80outline:none 81font-weight: bold; 82` 83 84const BUtton = styled.button` 85border-radius: 20px; 86 border: none; 87 margin: 3px 5px 6px 3px; 88 spacing: 4; 89 &:hover{ 90 border-radius: 20px; 91 border: none; 92 background-color: blueviolet; 93 color: white; 94 cursor: pointer; 95 } 96`

react

1IncompleteTodos.jsx 2 3import React, { useState } from 'react'; 4import styled from 'styled-components'; 5import TodoStatus from './TodoStatus'; 6export const IncompleteTodos = (props) =>{ 7 const {incompleteTodos, onClickComplete, onClickDelete} = props; 8 return( 9 <> 10 <INcompleteBlock> 11 <TItle>todo一覧</TItle> 12 <UL> 13 {incompleteTodos.map((todo,index)=>{ 14 return( 15 <INcompleteList key={index} 16 style={todo.status==="未着手"? {background:'#FF97C2'} 17 :todo.status==="進行中"? {background:'#E9FFA5'} 18 :todo.status==="解決済み"? {background:'#78FF94'} 19 :{background:'#EEEEEE'} 20 } 21 > 22 <LIstGuide > 23 <LI>No:{index+1}</LI> 24 <LI>あと{todo.limit}日!</LI> 25 </LIstGuide> 26 {todo.status} 27 <LI>Title:{todo.title}</LI> 28 <LI>内容:{todo.text}</LI> 29 <BUtton onClick={()=>onClickDelete(index)}>削除</BUtton> 30 <BUtton onClick={()=>onClickComplete(index)}>編集</BUtton> 31 <TodoStatus/>   32 </INcompleteList> 33); 34 })} 35 </UL> 36 </INcompleteBlock> 37 </> 38 ) 39};

react

1TodoStatus.jsx 2import React from 'react' 3import styled from 'styled-components'; 4function TodoStatus(props) { 5const {todoStatus, setTodoStatus} = props 6 const onChangeTodoStatus=(e)=>setTodoStatus(e.target.value); 7 return ( 8 <> 9 <SElect onChange={onChangeTodoStatus} value={todoStatus}> 10 <option value="未着手">未着手</option> 11 <option value="進行中">進行中</option> 12 <option value="完了済み">完了済み</option> 13 </SElect> 14 </> 15 ) 16} 17export default TodoStatus 18const SElect = styled.select` 19border-radius: 20px; 20font-weight:10px; 21width:10%; 22padding:5px; 23margin-top:10px; 24`

想定している処理の流れ

①InputTodo.jsxにてinputする際、title、text、limit、statusをタスク一つ一つのオブジェクトに持たせる。
②IncompleteTodos.jsxにおいて、先ほど作成したオブジェクトが表示される。
③InputTodo.jsxではステータスを設定するためにTodoStatus.jsxをインポートして、そのファイルにuseStateで設定したtodoStatusとsetTodoStatusを渡してブラウザ上でドロップダウンリストを表現している。
④IncompleteTodos.jsxにおいてもドロップダウンリストを表現しようとしたが、上記の様なエラーが出てしまい解決できていない。

エラー原因

IncompleteTodos.jsxにおいて TodoStatus.jsxを呼び出している箇所。
∵TodoStatus.jsxではInputTodo.jsxにおいて使用されているuseStateの値をpropsを使用しているが、IncompleteTodos.jsxにおいてはuseState等でInputTodo.jsxのstateの値を受け取っていないことが原因かと考えた。

試したことや調べたこと

-タスクに設定するstatusはInputTodo.jsxにおいて管理すべきだと考えており、子のコンポーネントにしかuseStateを渡せないため、IncompleteTodos.jsxではステータスの変更を行えないと考えた。

何か良い案等ありますでしょうか?
皆様のお力添えをいただけますと幸いです。
よろしくお願い致します。

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

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

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

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

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

blo

2021/07/03 02:22

`TodoStatus.jsx`にpropsがありますが、どこからどのように渡ってくるのでしょうか? また、useStateはどこで呼んでいますか?データの生成箇所が知りたいです。
kimch

2021/07/03 02:42

blo 様 ご連絡ありがとうございます。 >`TodoStatus.jsx`にpropsがありますが、どこからどのように渡ってくるのでしょうか? こちらは、新しく追加しました`InputTodo`コンポーネントにおいて`TodoStatus`を呼び出す際にpropsを渡しています。記述しておらず申し訳ありません。 >また、useStateはどこで呼んでいますか?データの生成箇所が知りたいです。 こちらに関しましても`InputTodo.jsx`において定義しております。 いただいたご指摘に関して、質問の方を修正させていただきました。 ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問