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

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

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

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

React.js

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

Q&A

解決済

2回答

4379閲覧

Reactでmapメソッドがundefinedになる

mune92283498

総合スコア11

Redux

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

React.js

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

0グッド

0クリップ

投稿2020/05/30 05:19

編集2020/05/31 02:02

『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# 以下略

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

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

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

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

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

hoshi-takanori

2020/05/30 06:21

this.props.data が null なので、その map メソッドなんてないというエラーですね。 で、connect((state) => state) なので redux の state がそのまま props になってるのかな? memo/Store.js の内容も貼ってもらえませんか?
mune92283498

2020/05/30 13:39 編集

閲覧いただきありがとうございます。 memo/Store.jsの内容も貼りました。
guest

回答2

0

ベストアンサー

reducer では action が不明な場合は受け取った state をそのまま返す必要があります。そうしないと初期値が undefined になってしまいますし、今後 reducer を複数組み合わせて使う際にも、他の reducer 宛の action で自分の state が undefined になってしまいます。
参考: Redux入門 3日目 Reduxの基本・Reducers(公式ドキュメント和訳) - Qiita

diff

1 export function memoReducer(state = initData, action) { 2 switch (action.type) { 3 // 略 4 5+ default: 6+ return state; 7 } 8 }

投稿2020/05/30 18:18

編集2020/05/30 18:27
hoshi-takanori

総合スコア7901

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

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

mune92283498

2020/05/31 01:54 編集

訂正していただいたコードを追記したら解決しました!ありがとうございました???? Reducerの処理分岐に、「受け取ったstateをそのまま返すdefault処理が必要」だったんですね。 書籍をそのまま写経したんですが、こういうこともあるんですね。。。 まだまだReduxを理解できていない部分が多いので、参考URLの関連記事も読んでReduxの仕組みを咀嚼していきたいと思います。 ありがとうございました!
guest

0

TypeError: Cannot read property 'map' of undefinedなので、Memo.jsのthis.props.dataがundefinedです。Memo.jsの親コンポーネントからpropsが渡されているか確認してみてください。

投稿2020/05/30 08:51

markey

総合スコア355

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

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

mune92283498

2020/05/31 01:46

ご回答ありがとうございます。 propsから値がうまく渡っていなかったようでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問