前提・実現したいこと
react.jsを使用したtodoアプリにおいて、useContextを利用してグローバルなステート管理を実現しようとしているが、以下のエラーが出てしまい解決できておりません。
当方勉強不足のため、何がいけないのか掴みきれていない状況です。
皆様のお力をお貸しいただけますと幸いです。
問題点/エラー内容/エラー文章
エラー文章
TypeError: Cannot destructure property 'todoTitle' of 'Object(...)(...)' as it is undefined.
InputTodo.jsx
const {todoTitle,setTodoTitle,todoText,setTodoText,todoLimit,setTodoLimit,todoProgress,setTodoProgress} = useContext(TodoStatus)
該当ソースコード/コマンド
TodoStatus
1TodoStatus.jsx 2 3import React, { createContext, useState } from 'react' 4export const TodoStatus = createContext() 5function TodosStatus({props}) { 6 const {children} = props 7 const [todoTitle,setTodoTitle]= useState("") 8 const [todoText,setTodoText]= useState("") 9 const [todoLimit,setTodoLimit]= useState("") 10 const [todoProgress,setTodoProgress]= useState("") 11 return ( 12 <> 13 <TodoStatus.Provider value={{todoTitle,setTodoTitle,todoText,setTodoText,todoLimit,setTodoLimit,todoProgress,setTodoProgress}}> 14 {children} 15 </TodoStatus.Provider> 16 </> 17 ) 18} 19export default TodosStatus
InputTodo
1InputTodo.jsx 2 3import React, { useContext } from 'react'; 4import styled from 'styled-components'; 5import TodoStatus from './TodoStatusList'; 6import TodoStatusList from './TodoStatusList'; 7export const InputTodo =(props)=>{ 8 const {onClickAdd, disabled} = props; 9 const {todoTitle,setTodoTitle,todoText,setTodoText,todoLimit,setTodoLimit,todoProgress,setTodoProgress} = useContext(TodoStatus) 10 const onChangeTitleValue = (e)=>setTodoTitle(e.target.value); 11 const onChangeTextValue = (e)=>setTodoText(e.target.value); 12 const onChangeLimitValue = (e)=>setTodoLimit(e.target.value); 13 return( 14 <> 15 <INputBlock> 16 <INputArea> 17 <TItle>入力してください</TItle> 18 <INputTag autoFocus disabled={disabled} placeholder="titleを入力してください" value={todoTitle} onChange={onChangeTitleValue}></INputTag> 19 </INputArea> 20 <INputArea> 21 <TExtArea disabled={disabled} placeholder="todoを入力してください" value={todoText} onChange={onChangeTextValue}></TExtArea> 22 </INputArea> 23 <INputArea> 24 <INputTag disabled={disabled} placeholder="limitを入力してください" value={todoLimit} onChange={onChangeLimitValue}></INputTag> 25 <br /> 26 <TodoStatusList /> 27 <BUtton disabled={disabled} onClick={()=>{ 28 onClickAdd(todoTitle,todoText,todoLimit, todoProgress) 29 setTodoTitle('') 30 setTodoText('') 31 setTodoLimit('') 32 setTodoProgress("未着手") 33 }} >追加</BUtton> 34 </INputArea> 35 </INputBlock> 36 </> 37 ) 38}; 39const INputBlock = styled.div` 40background-color: rgb(202, 211, 39); 41width: 80%; 42border-radius: 20px; 43padding-bottom:10px; 44` 45const INputArea = styled.div` 46margin: 20px; 47` 48const TItle = styled.p` 49text-align: center; 50font-size: 25px; 51font-weight: bold; 52color: #666; 53` 54const INputTag = styled.input` 55border-radius: 20px; 56border: none; 57padding: 6px 20px; 58outline:none 59` 60const TExtArea = styled.textarea` 61border-radius: 20px; 62border: none; 63height: 80px; 64width: 80%; 65padding: 20px 20px; 66outline:none 67font-weight: bold; 68` 69const BUtton = styled.button` 70border-radius: 20px; 71 border: none; 72 margin: 3px 5px 6px 3px; 73 spacing: 4; 74 &:hover{ 75 border-radius: 20px; 76 border: none; 77 background-color: blueviolet; 78 color: white; 79 cursor: pointer; 80 } 81`
想定している処理の流れ
①TodoStatus.jsxにてuseContextを使用、propsで受け取ったコンポーネントをコンシューマコンポーネントとして、その中でTodoState内の記述を使用できる様にした。
②InputTodo.jsxをcontextのオブジェクト.Providerで囲うことによって、TodoStatus.jsx内の記述を使用できる様にした。
InputTodo.jsxの9行目。
試したことや調べたこと
-undefinedになるため、todoTitleをキーとするオブジェクトを作成できない、という風にエラー文を読み取った。
-useStateを利用して初期値が空欄でもいい様にしている。
-useContextを導入するまではタスクの追加はうまく行えていたが、今回useContextを利用することでエラーが起きてしまう原因がわかりませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/11 00:26