useContext returns undefined 当我的 redux store 更新时
useContext returns undefined when my redux store updates
我无法理解为什么当 redux 存储更新时我的 useContext 值从预期值更新为未定义。我正在使用 create context 来容纳我的套接字连接以供讨论。以下是我的上下文class
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 store provider 在链中比我的 WebSocketProvider 更高,但我无法确认。
useSelector
在所选值更改时触发重新渲染。 ws
默认情况下未定义,如果 webSocket.current
为假则获取一个值。而且它似乎只发生在初始渲染上。每次连续渲染都会将 ws
设置为未定义并将其传递给 WebSocketContext.Provider
.
尝试移动 ws = {.....}
外部条件。
我无法理解为什么当 redux 存储更新时我的 useContext 值从预期值更新为未定义。我正在使用 create context 来容纳我的套接字连接以供讨论。以下是我的上下文class
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 store provider 在链中比我的 WebSocketProvider 更高,但我无法确认。
useSelector
在所选值更改时触发重新渲染。 ws
默认情况下未定义,如果 webSocket.current
为假则获取一个值。而且它似乎只发生在初始渲染上。每次连续渲染都会将 ws
设置为未定义并将其传递给 WebSocketContext.Provider
.
尝试移动 ws = {.....}
外部条件。