【发布时间】:2021-02-22 05:04:10
【问题描述】:
我正在使用 Reactjs 和 Redux 构建一个聊天应用程序。我有 2 个组件,分别称为 ChatHeads 和 ChatBox,它们同时并排安装。
在 ChatHeads 组件中,可以选择 User(您要与之聊天的人),并且该选择以 chatInfo 的形式存储在 redux 存储中。
ChatHeads 组件:
function ChatHeads(props) {
const {
dispatch,
userInfo,
userId
} = props;
const [chatHeads, setChatHeads] = useState([]);
const handleChatHeadSelect = (chatHead, newChat = false) => {
dispatch(
chatActions.selectChat({
isNewChat: newChat,
chatId: chatHead.chat._id,
chatUser: chatHead.user
})
);
};
const loadChatHeads = async () => {
const response = await services.getRecentChats(userId, userInfo);
setChatHeads(response.chats);
};
useEffect(() => loadChatHeads(), [userInfo]);
return (
// LOOPING THOUGH ChatHeads AND RENDERING EACH ITEM
// ON SELECT OF AN ITEM, handleChatHeadSelect WILL BE CALLED
);
}
export default connect(
(state) => {
return {
userInfo: state.userInfo,
userId: (state.userInfo && state.userInfo.user && state.userInfo.user._id) || null,
selectedChat: (state.chatInfo && state.chatInfo.chat && state.chatInfo.chat._id) || null
};
},
null,
)(ChatHeads);
聊天操作和缩减程序:
const initialState = {
isNewChat: false,
chatId: '',
chatUser: {},
};
const chatReducer = (state = initialState, action) => {
let newState;
switch (action.type) {
case actions.CHAT_SELECT:
newState = { ...action.payload };
break;
default:
newState = state;
break;
}
return newState;
};
export const selectChat = (payload) => ({
type: actions.CHAT_SELECT,
payload,
});
在 ChatBox 组件中,我正在建立与服务器的套接字连接,并基于来自全局存储和 ws 事件的chatInfo 对象,执行一些操作。
聊天框组件:
let socket;
function ChatBox(props) {
const { chatInfo } = props;
const onWSMessageEvent = (event) => {
console.log('onWSMessageEvent => chatInfo', chatInfo);
// handling event
};
useEffect(() => {
socket = services.establishSocketConnection(userId);
socket.addEventListener('message', onWSMessageEvent);
return () => {
socket.close();
};
}, []);
return (
// IF selectedChatId
// THEN RENDER CHAT
// ELSE
// BLANK SCREEN
);
}
export default connect((state) => {
return {
chatInfo: state.chatInfo
};
}, null)(ChatBox);
步骤:
- 两个组件都呈现后,我在 ChatHeads 组件中选择一个用户。
- 使用 Redux DevTools,我能够观察到
chatInfo对象已正确填充。
chatInfo: {
isNewChat: false,
chatId: '603326f141ee33ee7cac02f4',
chatUser: {
_id: '602a9e589abf272613f36925',
email: 'user2@mail.com',
firstName: 'user',
lastName: '2',
createdOn: '2021-02-15T16:16:24.100Z',
updatedOn: '2021-02-15T16:16:24.100Z'
}
}
- 现在,每当 ChatBox 组件中触发 'message' 事件时,我的期望是
chatInfo属性应该具有最新值。但是,我总是得到 initialState 而不是更新的。
chatInfo: {
isNewChat: false,
chatId: '',
chatUser: {}
}
我在这里缺少什么?请建议...
【问题讨论】:
-
嘿兄弟..请查看
ChatBox Component,您在onWSMessageEvent中记录userInfo,这可能总是相同.. 我认为您应该从event获取数据 -
我将
chatInfo记录在onWSMessageEvent函数中。每当有 ws 事件时,我都会尝试使用它(我从 Redux 商店收到)。这里的问题是我没有得到更新的数据。 -
你有没有直接尝试
return {... action.payload }而不是在case actions.CHAT_SELECT:中分配给newState?? -
这没有帮助!正如我所提到的,使用 Redux DevTools,我确实看到商店使用正确的数据进行了更新。但是,在事件中,我仍然得到旧数据......
标签: javascript reactjs redux websocket react-redux