『React.js&Next.js超入門』の書籍を参考に簡易メモアプリを作成しているのですが、ここ数日以下のようなエラーに悩まされています。
エラーメッセージ
TypeError: Cannot read property 'map' of undefined
エラー内容
Memo.render src/memo/Memo.js:31 28 | break; 29 | 30 | default: > 31 | data = this.props.data.map((value) => ( | ^ 32 | <Item key={value.message} value={value} index={n++} /> 33 | )); 34 | } Module../src/index.js src/index.js:10 7 | // import * as serviceWorker from './serviceWorker'; 8 | 9 | // 表示をレンダリング > 10 | ReactDOM.render( 11 | < Provider store={MemoStore}> 12 | <App /> 13 | </Provider>,
資源
Memo.js
js
1import React, { Component } from 'react'; 2import { connect } from 'react-redux'; 3 4import Item from './Item'; 5 6class Memo extends Component { 7 8 render() { 9 let data; 10 let n = 0; 11 switch (this.props.mode) { 12 case 'default': 13 data = this.props.data.map((value) => ( 14 <Item key={value.message} value={value} index={n++} /> 15 )); 16 break; 17 18 case 'find': 19 data = this.props.fdata.map((value) => ( 20 <Item key={value.message} value={value} index={n++} /> 21 )); 22 break; 23 24 case 'delete': 25 data = this.props.data.map((value) => ( 26 <Item key={value.message} value={value} index={n++} /> 27 )); 28 break; 29 30 default: 31 data = this.props.data.map((value) => ( 32 <Item key={value.message} value={value} index={n++} /> 33 )); 34 } 35 36 return ( 37 <table><tbody>{data}</tbody></table> 38 ); 39 } 40} 41export default connect((state) => state)(Memo);
index.js
js
1import React from 'react'; 2import ReactDOM from 'react-dom'; 3import { Provider } from 'react-redux'; 4import './index.css'; 5import App from './App'; 6import MemoStore from './memo/Store' 7// import * as serviceWorker from './serviceWorker'; 8 9// 表示をレンダリング 10ReactDOM.render( 11 < Provider store={MemoStore}> 12 <App /> 13 </Provider>, 14 document.getElementById('root') 15); 16 17// If you want your app to work offline and load faster, you can change 18// unregister() to register() below. Note this comes with some pitfalls. 19// Learn more about service workers: https://bit.ly/CRA-PWA 20// serviceWorker.unregister();
どうやらmapで作成した配列の値が見つからずエラーになっているみたいなんですが、
エラー箇所の「Memo.js」と「index.js」を見直してみたものの解決に至らず...
mapメソッドあたりのコードをみても構文が間違っているようには見えないんですが、うまく値が受け渡しできていのでしょうか?
追記
Store.js
js
1import { createStore } from "redux"; 2 3const initData = { 4 data: [{ message: "sample data", created: new Date() }], 5 message: "please type message", 6 mode: "default", 7 fdata: [], 8}; 9 10// レデューサー 11export function memoReducer(state = initData, action) { 12 switch (action.type) { 13 case "ADD": 14 return addReduce(state, action); 15 16 case "DELETE": 17 return deleteReduce(state, action); 18 19 case "FIND": 20 return findReduce(state, action); 21 } 22} 23 24// レデュースアクション 25 26// メモ追加のレデュース処理 27function addReduce(state, action) { 28 let data = { 29 message: action.message, 30 created: new Date(), 31 }; 32 let newdata = state.data.slice(); 33 newdata.unshift(data); 34 return { 35 data: newdata, 36 message: "Added!", 37 mode: "default", 38 fdata: [], 39 }; 40} 41 42// メモ検索のレデュース処理 43function findReduce(state, action) { 44 let f = action.find; 45 let fdata = []; 46 state.data.forEach((value) => { 47 if (value.message.indexOf(f) >= 0) { 48 fdata.push(value); 49 } 50 }); 51 return { 52 data: state.data, 53 message: 'find "' + f + '":', 54 mode: "find", 55 fdata: fdata, 56 }; 57} 58 59// メモ削除のレデュース処理 60function deleteReduce(state, action) { 61 let newdata = state.data.slice(); 62 newdata.splice(action.index, 1); 63 return { 64 data: newdata, 65 message: 'delete "' + action.index + '":', 66 mode: "delete", 67 fdata: [], 68 }; 69} 70 71// アクションクリエーター 72 73// メモ追加のアクション 74export function addMemo(text) { 75 return { 76 type: "ADD", 77 message: text, 78 }; 79} 80 81// メモ削除のアクション 82export function deleteMemo(num) { 83 return { 84 type: "DELETE", 85 index: num, 86 }; 87} 88 89// メモ検索のアクション 90export function findMemo(text) { 91 return { 92 type: "FIND", 93 find: text, 94 }; 95} 96 97// ストアを作成 98export default createStore(memoReducer);
PG修正
Store.js
js
1import { createStore } from "redux"; 2 3const initData = { 4 data: [{ message: "sample data", created: new Date() }], 5 message: "please type message", 6 mode: "default", 7 fdata: [], 8}; 9 10// レデューサー 11export function memoReducer(state = initData, action) { 12 switch (action.type) { 13 case "ADD": 14 return addReduce(state, action); 15 16 case "DELETE": 17 return deleteReduce(state, action); 18 19 case "FIND": 20 return findReduce(state, action); 21 22 # actionが不明な場合はstateをそのまま返す必要があるため、default処理を追記 23 default: 24 return state; 25 } 26} 27# 以下略
回答2件
あなたの回答
tips
プレビュー