开发者问题收集

未捕获的类型错误:无法读取未定义的属性(读取‘isAuthenticated’)

2022-02-22
601

我尝试在用户创建帐户之前和之后为他们创建指定链接。我收到 TypeError,但我无法检测它究竟来自何处。我尝试了链接方法来查看问题是否来自那里,但似乎并非如此。

错误插入在我将 auth 初始化为传递给组件的 props 的地方。

这是我的导航链接的代码

import { Fragment } from 'react'
import { Link } from "react-router-dom"
import { connect } from 'react-redux'
import PropTypes from 'prop-types'
import { logout } from '../../actions/auth'

//create links for when users are signed in

const Navbar = ({ auth: {isAuthenticated, loading} , logout}) => {

    const guest = (
        <div className="pr-8 md:block hidden">
                <Link className="p-4 hover:animate-pulse" to='/signup'>Sign up</Link>
                <Link className="p-4 hover:animate-pulse" to='/login'>Login</Link>
            </div>
    )

    const auth = (
        <div className="pr-8 md:block hidden">
                <Link className="p-4 hover:animate-pulse" to='/settings'>Settings</Link>
                <Link onClick={logout} className="p-4 hover:animate-pulse" to='/logout'>Logout</Link>
            </div>
    )

    return (
        <nav className="fixed bg-white shadow-sm h-16  w-full px-5 py-2 flex justify-between items-center font-mono text-lg">
        <Link to ='/login' className="pl-8">Logo</Link>
        <div className="px-4 cursor-pointer md:hidden">
        <svg 
          xmlns="http://www.w3.org/2000/svg" 
          className="h-6 w-6" 
          fill="none" 
          viewBox="0 0 24 24" 
          stroke="currentColor">
    <path 
      strokeLinecap="round" 
      strokeLinejoin="round" 
      strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
        </svg>
         </div>
            <div className="pr-8 md:block hidden">
            { !loading && (
              <Fragment>{ isAuthenticated ? auth : guest }</Fragment>
              ) 
            }
            </div>
        </nav>
    )
}

Navbar.propTypes = {
    logout: PropTypes.func.isRequired,
}

const mapStateToProps = (state) => ({
  auth: state?.auth
})

export default connect(mapStateToProps, { logout })(Navbar) 

这是我的 auth 减速器,其中我在 initialState 中保存 isAuthenticated。我包含了所有其他导入,但它们无关紧要

import { 
    SIGNUP_SUCCESS,
    SIGNUP_FAIL,
    USER_LOADED,
    AUTH_ERROR,
    LOGIN_SUCCESS,
    LOGIN_FAIL,
    LOGOUT,
} from '../actions/types'

const initialState = {
    token: localStorage.getItem('token'),
    isAuthenticated: false,
    loading: true,
    user: null
}

export default function(state = initialState, action ) {

    const { type, payload } = action

    switch(type) {
        case USER_LOADED: 
            return {
            ...state,
            isAuthenticated: true,
            loading: false,
            user: payload
        }

        case SIGNUP_SUCCESS:
        case LOGIN_SUCCESS:
            localStorage.getItem('token', payload.token)
            return {
                ...state,
                ...payload,
                isAuthenticated: true,
                loading: false,
            }

        case LOGIN_FAIL:
        case SIGNUP_FAIL:
        case AUTH_ERROR:
        case LOGOUT:
            localStorage.removeItem('token')
            return {
                ...state,
                token: null,
                isAuthenticated: false,
                loading: false
            }
    
            default: 
            return state
    }
}

这是我的商店配置

import reducerData from '../reducers/auth'
import {applyMiddleware, createStore} from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension'
import thunk from 'redux-thunk'


const initialState = {}

const middleware = [thunk]

const store = createStore(reducerData, initialState, composeWithDevTools(applyMiddleware(...middleware)))

export default store
1个回答

您的商店配置在哪里? 即,无论您在何处创建 redux 商店,您都会有一个根减速器(如果您有多个减速器,通常会有) 并且您在那里给出的名称将是您的 redux 状态对象的属性名称,当您 connect 您的组件时,您可以通过该名称在组件中访问它。 即,如果您使用 redux 工具包,那么 您将像这样使用 。 当您执行 mapStateToProps 时,您将在此处为授权减速器引用的任何名称都会作为 prop 名称出现。

我认为问题在于您在商店配置中为其指定了不同的名称,并且您尝试在组件中使用不同的名称访问对象

这就是它引发错误的原因

确保您在组件中使用与在 redux 状态对象中使用的名称相同的名称

Anuj
2022-02-22