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

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

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

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

Q&A

解決済

1回答

2101閲覧

useContextを使用したtodoアプリにおいて、グローバルなステート管理を実装したい

kimch

総合スコア8

React.js

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

0グッド

0クリップ

投稿2021/07/10 23:43

前提・実現したいこと

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を利用することでエラーが起きてしまう原因がわかりませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

正確な原因はわからないのですが、export constと進めると正しく処理されないことがあります。

const TodoStatus = createContext()export {TodoStatus}を分けて書いてみたら改善しますでしょうか?

投稿2021/07/11 00:04

maisumakun

総合スコア145930

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

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

kimch

2021/07/11 00:26

maisumakun 様 いつも大変お世話になっております。 >const TodoStatus = createContext()とexport {TodoStatus}を分けて書いてみたら改善しますでしょうか? こちら、ご指摘いただきました通り以下の様に記述修正いたしました。 ```TodoStatus.jsx 修正前 export const TodoStatus = createContext() 修正後 const TodoStatus = createContext() export {TodoStatus} ``` 以前、同じエラー(TypeError: Cannot destructure property 'todoTitle' of 'Object(...)(...)' as it is undefined.)と表示されたままになってしまいます。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問