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

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

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

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

Q&A

解決済

1回答

916閲覧

todoアプリをの完了機能を実装したい。真偽値がうまく反映されない。

yuiei

総合スコア2

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

0グッド

0クリップ

投稿2021/06/06 01:33

前提・実現したいこと

completeにtrueを渡し、完了画面に完了したタスクを表示させたい。

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

エラーは特に出ていないのですが、思い通りの挙動になりません。
action.typeをCOMPLETE_TASKにするとcompleteの値がtrueになることはconsole.logで確認したのですが、完了ボタンを押したときのApp.jsのconsole.log(state.eventsTask)のcompleteがfalseになっています。また、console.log(state.eventsTask.complete)としたところ、undefinedが出てきてしまいます。そのため、filterでstate.eventsTask.filter(event => event.complete === false)としても正しい挙動が起こらないのだと思います。
eventsTaskをconsole.logで見たところ、オブジェクトの型でcompleteがあるのにも関わらず、state.eventsTask.completeがundefinedである理由と、completeにfalseが渡ってきていない理由をご教授いただいたいです。
また、どうすれば解決できるのかも教えていただけると幸いです。

該当のソースコード

javascript

1import React, { useState, useReducer } from 'react' 2import DeleteButton from './deleteButton' 3import reducer from './reducer' 4import CompletedButton from './completedButton' 5import TasksCompleted from './tasksCompleted' 6import AppContext from './context/AppContext' 7 8const App = () => { 9 10 const initialState = { 11 eventsTask: [], 12 TaskCompleted: [] 13 } 14 15 const [state, dispatch] = useReducer(reducer, initialState) 16 const [taskName, setTaskName] = useState('') 17 const [detail, setDetail] = useState('') 18 const [complete, setComplete] = useState(false) 19 20 //typeを決めるswitch 21 22 //ボタンをクリックしたときにタスクを作成する関数 23 const addTaskHandler = (e) => { 24 e.preventDefault() 25 dispatch({ 26 type: 'CREATE_TASK', 27 taskName, 28 detail, 29 complete 30 }) 31 console.log(state) 32 setTaskName('') 33 setDetail('') 34 setComplete(false) 35 } 36 37 console.log(state.eventsTask)//ここでcompleteがfalseであること(COMPLETE_TASKにおいてtrueに変換したはず) 38 console.log(state.eventsTask.complete)//ちゃんとオブジェクトの形になっているのに.completeがundefinedであることの二つが原因 39 40 41 return ( 42 <> 43 <AppContext.Provider value={{ state, dispatch }}> 44 <h2>Todo Task</h2> 45 <input type="text" 46 value={taskName} 47 onChange={e => setTaskName(e.target.value)} /> 48 <input type="text" 49 value={detail} 50 onChange={e => setDetail(e.target.value)} /> 51 <input type="button" 52 value="タスクの作成" 53 onClick={addTaskHandler} /> 54 <table> 55 <thead> 56 <tr> 57 <th>タスク名</th> 58 <th>タスクの詳細</th> 59 </tr> 60 </thead> 61 <tbody> 62 63 {state.eventsTask.filter(event => event.complete === false) 64 .map((states, index) => ( 65 <tr key={index}> 66 <td>{states.taskName}</td> 67 <td>{states.detail}</td> 68 <td><CompletedButton state={states} 69 dispatch={dispatch} 70 setComplete={setComplete} 71 complete={complete} /></td> 72 <td><DeleteButton state={states} dispatch={dispatch} /></td> 73 </tr> 74 ))} 75 76 </tbody> 77 </table> 78 <TasksCompleted state={state} dispatch={dispatch} /> 79 </AppContext.Provider> 80 </> 81 ) 82} 83 84 85export default App

javascript

1 2 3 4const eventsTask = (state = [], action) => { 5 console.log(action.type) 6 switch (action.type) { 7 8 case 'CREATE_TASK': 9 console.log([...state, { taskName: action.taskName, detail: action.detail, complete: action.complete }]) 10 return [...state, { taskName: action.taskName, detail: action.detail, complete: action.complete }] 11 12 case 'DELETE_TASK': 13 const stateDelete = state.filter(states => { 14 console.log(states.taskName) 15 console.log(action.task) 16 return states.taskName !== action.task 17 }) 18 console.log(stateDelete) 19 return stateDelete 20 21 22 case 'COMPLETE_TASK': 23 //console.logで値の確認 24 console.log(state.map((event) => { 25 console.log({ ...event }) 26 if (event.taskName !== action.taskName) return event; 27 return { 28 ...event, 29 complete: true 30 } 31 })) 32 state.map((event) => { 33 console.log({ ...event }) 34 if (event.taskName !== action.taskName) return event; 35 return { 36 ...event, 37 complete: true 38 } 39 }) 40 default: 41 return state 42 } 43 44} 45 46export default eventsTask

javascript

1import eventsTask from './eventsTask' 2 3import { combineReducers } from 'redux' 4 5export default combineReducers({ eventsTask }) 6 7

試したこと

console.logでCOMPLETE_TASKが実行されたときの結果とeventsTaskとeventsTask.completeの値を確認した。

補足情報(FW/ツールのバージョンなど)

windows10

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

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

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

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

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

hoshi-takanori

2021/06/06 03:50

case 'COMPLETE_TASK' の時に return してないような。
yuiei

2021/06/06 05:16

ありがとうございます。 おっしゃる通りで、return()で囲ったら値がtrueで戻ってきました。助かりました。
guest

回答1

0

自己解決

returnで返すことで解決しました

投稿2021/06/14 01:20

yuiei

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問