javascript - 函数在我的 redux 状态可用之前运行,TypeError: Cannot read properties of undefined (reading 'find')
问题描述
我有一个从 redux 获取状态的组件。我有一个提供程序,它正在调度一个动作来获取状态,然后使用 useContext 将该状态传递给这个组件这适用于所有其他奇怪的渲染......刷新,获取 TypeError:无法读取未定义的属性(读取' find') 刷新,工作正常。刷新,工作正常。refresh, get TypeError: Cannot read properties of undefined (reading 'find') refresh works,很好。
问题是当我尝试在状态上运行查找时,我得到了错误
我猜状态更新速度不够快,并且计算机正在尝试对不存在的东西进行 forEach?
这是我下面的代码
import React, { useContext } from 'react';
import { ChatContext } from '../../../context/Context';
const ChatConversation = ({ conversation }) => { // mapped over a "conversations array" is component above this one and pass a conversation ---> looks like [ 'Oxt56Beix' ]
const { conversationMessages } = useContext(ChatContext);
const message = conversationMessages.find(({ messagesId }) => messagesId === conversation.messagesId); // this find is throwing error every other render or so
return (
<div>
<h2>{message}</h2>
</div>
)
{
这是我的对话消息减速器
import { LIST_CONVERSATION_MESSAGES } from '../actions/types';
export default function (state = [ {
messagesId: 1,
content: []
}, action) {
switch (action.type) {
case LIST_CONVERSATION_MESSAGES:
return action.payload
default:
return state;
}
}
这是包装此组件的 Provider 的快照
import React, { useState, useEffect } from 'react';
import {useSelector, useDispatch} from 'react-redux';
import { ChatContext } from '../../context/Context';
const ChatProvider = ({ children }) => {
const conversationMessages = useSelector((state) => state.conversationMessages)
useEffect(() => {
dispatch(listConversationMessages())
}, [])
useEffect(() => {
dispatch(listConversations())
}, [])
const value = {
conversations,
conversationMessages,
};
return <ChatContext.Provider value={value}>{children}</ChatContext.Provider>;
};
export default ChatProvider;
解决方案
我的问题出在我的减速机上。
我的 action.payload 作为 OBJECT 回来了
即使在我的后端函数中,我是带有数组的 res.json,但 action.payload 是一个将数组包含在数据键中的 OBJECT
我将减速机更改为
import { LIST_CONVERSATION_MESSAGES } from '../actions/types';
export default function (state = [ {
messagesId: 1,
content: []
}, action) {
switch (action.type) {
case LIST_CONVERSATION_MESSAGES:
return action.payload.data // solution was to use action.payload.data instead of action.payload
default:
return state;
}
}```
推荐阅读
- javascript - 如何转换数组中的字符串?
- java - 如何重用一个Android项目来拥有两个不同的APK
- wordpress - 在 Elementor 中删除页眉和页脚
- python - 我怎样才能让 selenium/geckodriver 工作?
- java - 如何通过 http 使用 java 检查 loadrunner 事务状态?
- c# - System.Collections.Generic.List<(float[],float[])> 的平均值
- sql - 日期字段上的表达式
- python - TFX 组件 CsvExampleGen 总是产生带有空输出(和输入)的示例
- javascript - React / Redux使用状态更改嵌套数组中按钮的背景颜色
- php - 出现引导警报消息时内容流动