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

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

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

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

React.js

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

Q&A

解決済

1回答

2458閲覧

redux toolkit のuseSelectorでエラーが出てしまう

e.senaha

総合スコア20

Redux

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

React.js

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

0グッド

0クリップ

投稿2021/04/23 00:47

編集2021/04/23 13:27

前提・実現したいこと

react初学者です。
redux toolkitでuseSelectorを使ってstateを呼び出そうとしていますが、
エラーが発生してしまいます。
スライスの記述の方法に問題があると想定しておりますが解決に至りません。
原因を教えていただけると助かります。

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

エラーメッセージ TypeError: Cannot read property 'userInfo' of undefined selectUserInfo src/features/login/loginSlice.js:90 87 | }); 88 | 89 | // export const selectUserInfo = (state) => state.account.userInfo; > 90 | export const selectUserInfo = (state) => state.account.userInfo; 91 | 92 | export default loginSlice.reducer; 93 |

該当のソースコード

configureStore import { configureStore } from "@reduxjs/toolkit"; import counterReducer from "../features/counter/counterSlice"; import loginReducer from "../features/login/loginSlice"; export const store = configureStore({ reducer: { counter: counterReducer, login: loginReducer, }, });
loginSlice.js import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"; import axios from "axios"; const baseUrl = "https://hitofull.graph.com/v10.0"; /******************************************** * Document * crateAsyncThunk * this accepts below * 1. Redux action type string * 2. callback function which should return a promise ********************************************/ export const fetchAsyncGetUserInfo = createAsyncThunk( "user_id/get", async (response) => { console.log(response); let apiUrl = baseUrl + `${response.id}/accounts?access_token=${response.accessToken}`; const page_id = await axios.get(apiUrl); console.log(page_id); console.log(response); console.log(apiUrl); return response; } ); export const fetchAsyncGetPageId = createAsyncThunk( "page_id/get", async (user_id) => { let apiUrl = baseUrl + `${user_id}/accounts`; const page_id = await (await axios.get(apiUrl)).data[0].id; return page_id; } ); const loginSlice = createSlice({ name: "account", initialState: { userInfo: { user_id: "", accessToken: "", expiresIn: "", signedRequest: "", page_id: "", }, igUser: { ig_user_id: "", }, }, reducers: {}, extraReducers: (builder) => { builder.addCase(fetchAsyncGetPageId.fulfilled, (state, action) => { return { ...state, page_id: action.payload.value, }; }); builder.addCase(fetchAsyncGetUserInfo.fulfilled, (state, action) => { console.log(action); return { ...state, userInfo: { user_id: action.payload.id, accessToken: action.payload.accessToken, expiresIn: action.payload.expiresIn, signedRequest: action.payload.signedRequest, // page_id: "", }, }; }); }, }); // export const selectUserInfo = (state) => state.account.userInfo; export const selectUserInfo = (state) => state.account.userInfo; export default loginSlice.reducer;

呼び出し先

Login.js import React, { Fragment } from "react"; import { useSelector, useDispatch } from "react-redux"; import { fetchAsyncGetPageId, fetchAsyncGetUserInfo, selectUserInfo, } from "./loginSlice"; const Login = () => { const dispatch = useDispatch(); const userInfo = useSelector(selectUserInfo); return ( <Fragment> <div className="status"></div> {userInfo ? userInfo : "none"} </Fragment> ); }; export default Login;

ご教授のほど宜しくお願いいたします。

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

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

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

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

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

hoshi-takanori

2021/04/23 06:19

configureStore の使い方によるのでは。
e.senaha

2021/04/23 13:27

configureStoreも追加いたしました。 アドバイスいただけると幸いです。
guest

回答1

0

ベストアンサー

configureStore で login: loginReducer とするなら、selectUserInfo でも state.login.userInfo とする必要があります。

投稿2021/04/23 13:43

hoshi-takanori

総合スコア7895

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

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

e.senaha

2021/04/23 14:37

ありがとうございます!!! Redux Toolkitのドキュメントを見ても分からなかったので 本当に助かりました! 本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問