reactjs - 当我的 redux 商店更新时,useContext 返回 undefined
问题描述
我无法理解为什么当 redux 存储更新时我的 useContext 值从预期值更新为未定义。我正在使用创建上下文来容纳我的套接字连接以进行讨论。以下是我的上下文类
import React, { createContext, useRef } from 'react'
export const WebSocketContext = createContext()
export default ({ children }) => {
const webSocket = useRef(null);
let ws;
const openedDiscussionID = useSelector(state => state.presence.discussionId || '')
const sendMessages = (messageObject) => {
webSocket.current.send(JSON.stringify(messageObject))
}
if (!webSocket.current){
webSocket.current = new WebSocket(``)
webSocket.current.onmessage = (message) => {
const discussionMessage = JSON.parse(message.data)
};
ws = {
webSocket: webSocket.current,
sendMessages
}
}
return(
<WebSocketContext.Provider value={ws}>
{children}
</WebSocketContext.Provider>
)
}
我目前在名为 projectDetailContainer 的父组件中使用它,
import WebSocketProvider from '../../redux-state/middleware/socketService'
function ProjectDetailContainer() {
return (
<WebSocketProvider>
<div>parent component</div>
</WebSocketProvider>
)
}
export default ProjectDetailContainer
在链条的某个地方,我有以下讨论部分:
import { WebSocketContext } from '../../redux-state/middleware/socketService'
function DiscussionOptionContainer() {
const ws = useContext(WebSocketContext)
...
useEffect(() => {
if(openedDiscussion.title?.length){
dispatch(setOpenDiscussion(openedDiscussion))
}
},[openedDiscussion])
const sendMessage = () => {
const mes = {
action:'discussion',
message:{
customerId:'7240304',
projectId:projectId,
message:message,
itemId:openedDiscussion.discussionId,
sender: me
}
}
debugger
ws.sendMessages(mes)
}
...}
我注意到的是,一旦应用程序加载,我就会看到 sendMessages 函数被返回,但是一旦发生调度,它就会将 ws (useContext) 更改为未定义。如果我注释掉更新 redux 存储的部分,它会按预期工作。我的理论是,redux 商店提供者在链中比我的 WebSocketProvider 更高,但我无法确认。
解决方案
useSelector
triggers a rerender when selected value changes. ws
默认情况下是未定义的,如果webSocket.current
是假的,则获取一个值。而且它似乎只发生在初始渲染上。每个连续的渲染都将设置ws
为 undefined 并将其传递给WebSocketContext.Provider
.
尝试移动ws = {.....}
外部条件。
推荐阅读
- spring - 我们可以在 Spring Rest 模板中为 Multipart 文件上传设置自定义边界吗
- python - Apache2.4 + Django 3 - 没有名为“django”的模块
- python - 如何制作一个接受 numVertices 和 numEdges 然后总是生成连通图的函数?
- dataframe - 如何检测 pyspark 数据框列中的模式何时发生变化
- javascript - 从数组中提取元素以绘制矩形
- c++ - sfml 中的着色器覆盖整个屏幕
- java - 如何在appium的菜单栏中向右滚动?
- android - Flutter Web 视图表单无法正常工作
- fetch - 为 linelistrecord/fetch 制作过滤器时出错
- python - 给定前 10 个数字的范围,从开始数字迭代到结束数字并打印当前数字和前一个数字的总和