前提・実現したいこと
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ではステータスの変更を行えないと考えた。
何か良い案等ありますでしょうか?
皆様のお力添えをいただけますと幸いです。
よろしくお願い致します。
あなたの回答
tips
プレビュー