You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发视频聊天应用时遇Uncaught TypeError错误求助

错误原因与解决方案

错误原因

报错Uncaught TypeError: Cannot read properties of null (reading 'isReceivedCall')的核心问题是:组件挂载时,call的初始值为null或undefined,此时直接访问call.isReceivedCall会触发空值读取错误。

从你提供的SocketContext代码来看,只有当收到calluser事件时才会通过setCall给call赋值,但组件首次渲染时还未触发该事件,call保持初始的空状态,导致渲染时报错。另外你在解构时额外拿了isReceivedCall,但它实际是call对象的属性,属于冗余解构,没有实际作用。

解决步骤

1. 给call设置合理的初始值

在SocketContext的state初始化时,把call的初始值设为空对象,避免它是null:

// SocketContext中的state初始化
const [call, setCall] = useState({});

2. 优化组件中的空值检查

在Notification组件中,使用**可选链操作符?.**来安全访问call的属性,同时去掉冗余的isReceivedCall解构:

import React, { useContext } from 'react';
import { Button } from '@mui/material';
import { SocketContext } from '../SocketContext';

const Notification = () => {
    // 去掉冗余的isReceivedCall解构
    const { answerCall, call, callAccepted } = useContext(SocketContext);

    return (
        <>
            {/* 使用可选链安全访问isReceivedCall,同时判断call是否存在 */}
            {call?.isReceivedCall && !callAccepted && (
                <div style={{ display: 'flex', justifyContent: 'space-around' }}>
                    <h1>{call.name} is calling:</h1>
                    <Button variant="contained" color="primary" onClick={answerCall}>
                        Answer
                    </Button>
                </div>
            )}
            Notification
        </>
    )
}

export default Notification

3. (可选)兼容旧环境的空值判断

如果你的环境不支持可选链,可改用条件判断先确认call存在:

{call && call.isReceivedCall && !callAccepted && (
    // ... 原有渲染内容
)}

这样修改后,组件首次渲染时call为空对象,访问call?.isReceivedCall会返回undefined,不会触发错误;当收到来电事件后,call被赋值包含isReceivedCall: true的对象,此时接听按钮就会正常显示。

内容的提问来源于stack exchange,提问作者idil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 17:42:17