TypeError:无法解构“panelMembersList”的属性“error”,因为它未定义

如何解决TypeError:无法解构“panelMembersList”的属性“error”,因为它未定义

我正在尝试使用 Django REST APIreduxaxios 服务器加载数据,我在其他屏幕(如产品、博客帖子)中使用的类似方法,它们工作正常,现在我需要从 api 加载另一个模型,但我不确定为什么会出现此错误... TypeError: Cannot destructure property 'error' of 'panelMembersList' as it is undefined.

有问题的代码 panelMembersList.js

import { useState,useEffect } from 'react'
import { useDispatch,useSelector } from 'react-redux'
import { Row,Col,Card,Container,Button} from 'react-bootstrap'
// import PanelMember from '../components/PanelMember'
import { Link } from 'react-router-dom'
import Rating from '../components/Rating'
import Loader from '../components/Loader'
import Message from '../components/Message'
import Paginate from '../components/Paginate'
import { listPanelMembers } from '../actions/panelMemberActions'

function PanelListScreen({history}) {
    const dispatch = useDispatch()
    const panelMembersList = useSelector(state => state.panelMembersList)
    const {error,loading,allPanelMembers,page,pages } = panelMembersList

    let keyword = history.location.search
    useEffect(() => {
        dispatch(listPanelMembers(keyword))

    },[dispatch,keyword])

    return (
        <div>
            <h3>Our Panel Members</h3>
            {loading ? <Loader />
                : error ? <Message variant='danger'>{error}</Message>
                    :
                    <div>
                        <Container variant='success'>
                        <Row>
                                {allPanelMembers.map(allPanelMembers => (
                                    <Col key={allPanelMembers._id} sm={12} md={6} lg={4} xl={3}>
                                        <Card style={{minWidth:'auto',maxWidth:'auto'}}   >
                                        
                                        </Card>

                                        <Card style={{ width: '18rem',height: '30rem'}} className= "card border-success mb-2 my-0 p-2 rounded">
                                        <Card.Header>Joined Date : {allPanelMembers.createdAt}</Card.Header>
                                        <Link to={`/panel/${allPanelMembers._id}`}>
                                        <Card.Img className='mb-0 my-0 p-0' src={allPanelMembers.image} />
                                        </Link>
                                        <Card.Body>
                                            <Link to={`/panel/${allPanelMembers._id}`}>
                                                <Card.Title as="h5"><strong>{allPanelMembers.name}</strong></Card.Title>
                                            </Link>
                                            <Card.Text as="div">
                                            <div className="my-0">
                                                <Rating value={allPanelMembers.rating} text={`${allPanelMembers.numReviews} reviews`} color={'#f8e825'} />
                                            </div>
                                        </Card.Text>
                                        <Link to={`/panel/${allPanelMembers._id}`}><Button variant="btn btn-outline-success">
                                        Read More </Button></Link>
                                        </Card.Body>
                                        </Card>

                                    </Col>
                                ))}
                        </Row>
                        <Paginate page={page} pages={pages} keyword={keyword} />
                        </Container>
                    </div>
            }
        </div>
    )
}

export default PanelListScreen

当我加载此屏幕时出现以下错误

 12 | function PanelListScreen({history}) {
  13 |     const dispatch = useDispatch()
  14 |     const panelMembersList = useSelector(state => state.panelMembersList)
> 15 |     const {error,pages } = panelMembersList
  16 | 
  17 |     let keyword = history.location.search
  18 |     useEffect(() => {

提示错误未定义,你能帮忙解决这个问题吗。

store.js

import { createStore,combineReducers,applyMiddleware } from 'redux'
import thunk from 'redux-thunk'
import { composeWithDevTools } from 'redux-devtools-extension'
import {
    productListReducer,productDetailsReducer,productDeleteReducer,productCreateReducer,productUpdateReducer,productReviewCreateReducer,productTopRatedReducer,} from './reducers/productReducers'

import {
    panelMemberListReducer,panelMemberDetailsReducer,panelMemberReviewCreateReducer,} from './reducers/panelMemberReducers'


import {
    blogPostListReducer,blogPostDetailsReducer,blogPostReviewCreateReducer,} from './reducers/blogReducers'

import { cartReducer } from './reducers/cartReducers'

import {
    userLoginReducer,userRegisterReducer,userDetailsReducer,userUpdateProfileReducer,userListReducer,userDeleteReducer,userUpdateReducer,} from './reducers/userReducers'

import {
    orderCreateReducer,orderDetailsReducer,orderPayReducer,orderListMyReducer,orderListReducer,orderDeliverReducer,} from './reducers/orderReducers'

import  {
    messageListReducer,messageDetailsReducer,}  from './reducers/messageReducers'


const reducer = combineReducers({
    productList: productListReducer,productDetails: productDetailsReducer,productDelete: productDeleteReducer,productCreate: productCreateReducer,productUpdate: productUpdateReducer,productReviewCreate: productReviewCreateReducer,productTopRated: productTopRatedReducer,panelMemberList: panelMemberListReducer,panelMemberDetail: panelMemberDetailsReducer,panelMemberReviewCreate: panelMemberReviewCreateReducer,cart: cartReducer,userLogin: userLoginReducer,userRegister: userRegisterReducer,userDetails: userDetailsReducer,userUpdateProfile: userUpdateProfileReducer,userList: userListReducer,userDelete: userDeleteReducer,userUpdate: userUpdateReducer,orderCreate: orderCreateReducer,orderDetails: orderDetailsReducer,orderPay: orderPayReducer,orderListMy: orderListMyReducer,orderList: orderListReducer,orderDeliver: orderDeliverReducer,blogPostList: blogPostListReducer,blogPostDetails: blogPostDetailsReducer,blogPostReviewCreate: blogPostReviewCreateReducer,listMessages: messageListReducer,})


const cartItemsFromStorage = localStorage.getItem('cartItems') ?
    JSON.parse(localStorage.getItem('cartItems')) : []

const userInfoFromStorage = localStorage.getItem('userInfo') ?
    JSON.parse(localStorage.getItem('userInfo')) : null


const shippingAddressFromStorage = localStorage.getItem('shippingAddress') ?
    JSON.parse(localStorage.getItem('shippingAddress')) : {}


const initialState = {
    cart: {
        cartItems: cartItemsFromStorage,shippingAddress: shippingAddressFromStorage,},userLogin: { userInfo: userInfoFromStorage },}

const middleware = [thunk]

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

export default store

动作

export const listPanelMembers = (keyword = '') => async (dispatch) => {
    try {
        dispatch({ type: PANEL_LIST_REQUEST })

        const { data } = await axios.get(`/api/panel${keyword}`)

        dispatch({
            type: PANEL_LIST_SUCCESS,payload: data
        })

    } catch (error) {
        dispatch({
            type: PANEL_LIST_FAIL,payload: error.response && error.response.data.detail
                ? error.response.data.detail
                : error.message,})
    }
}

减速器

export const panelMemberListReducer = (state = { allPanelMembers: [] },action) => {
    switch (action.type) {
        case PANEL_LIST_REQUEST:
            return { loading: true,allPanelMembers: [] }

        case PANEL_LIST_SUCCESS:
            return {
                loading: false,allPanelMembers: action.payload.allPanelMembers,page: action.payload.page,pages: action.payload.pages
            }

        case PANEL_LIST_FAIL:
            return { loading: false,error: action.payload }

        default:
            return state
    }
}

api 端点 http://localhost:8000/api/panel/

解决方法

在 useSelector 钩子返回数据之前正在访问该值,或者在您的 redux 存储中未定义主对象。你可以做的是检查这个对象是否存在然后解构

示例:

const panelMembersList = useSelector(state => state.panelMembersList)
const [panelData,updatePanelData] = useState({
  error: '',loading: false,allPanelMembers: [],page: 0,pages: 0
});

useEffect(() => {
  if(panelMembersList) updatePanelData(panelMembersList)

},[panelMembersList])

或在您的 redux 存储中使用默认数据填充该对象以防止被标识为未定义

const initialState = {
  panelMembersList: {
   error: '',pages: 0

  }
}

希望我的回答能帮助您解决问题

,

我想发布我的答案我做错了什么,基本上是在我在端点使用 allPanelMembers 访问数据之前,每次当我看到我的其他端点使用相同的方法工作正常但有一个区别是我没有在那里使用驼峰式大小写,这导致我在 django 端更改变量,这可能会有所帮助。然后我将 allPanelMembers 更改为 members 而不使用驼峰式大小写。这解决了这个问题。曾经有人告诉我,如果我们在前端使用 react,那么在后端使用驼峰命名法,但现在我知道这是不正确的。

正确的代码:

#views.py
@api_view(['GET'])
def getAllPanelMember(request):
    query = request.query_params.get('keyword')
    if query == None:
        query = ''

    #originaly this variable was named allPanelMembers
    members = PanelMember.objects.filter(
        name__icontains=query).order_by('-createdAt') 

    page = request.query_params.get('page')
    paginator = Paginator(members,8)

    try:
        members = paginator.page(page)
    except PageNotAnInteger:
        members = paginator.page(1)
    except EmptyPage:
        members = paginator.page(paginator.num_pages)

    if page == None:
        page = 1

    page = int(page)
    #print('Page:',page) If you want to see in termnial 
    serializer = PanelMemberSerializer(members,many=True)
    return Response({'members': serializer.data,'page': page,'pages': paginator.num_pages})

前端

import React,{ useState,useEffect } from 'react'
import { useDispatch,useSelector } from 'react-redux'
import { Row,Col,Card,Image,ListGroup,Container } from 'react-bootstrap'
// import PanelMember from '../components/PanelMember'

import Loader from '../components/Loader'
import Message from '../components/Message'
import Paginate from '../components/Paginate'

import { panelMemberList } from '../actions/panelActions'


function PanelListScreen({ history }) {
    const dispatch = useDispatch()
    const panelList = useSelector(state => state.panelList)
    const { error,loading,members,page,pages } = panelList
    
    let keyword = history.location.search

    useEffect(() => {
        dispatch(panelMemberList(keyword))

    },[dispatch,keyword])
    return (
        <div>
            <h1>Panel</h1>
            {loading ? <Loader /> : error ? <Message variant='danger'>{error}</Message> : <div>
                <Container>
                    <Row>
                        {
                            members.map(item=>(
                                <Col key={item._id} sm={12} md={6} lg={4} xl={3}>
                                    <Card.Header>By : {item.name}</Card.Header>
                                </Col>
                            ))
                        }</Row></Container></div>}
                <Paginate page={page} pages={pages} keyword={keyword} />
            </div>

    )
}

export default PanelListScreen

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res