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

React使用useLocation读取video属性报Cannot read 'video' of undefined错误

报错触发原因

这个报错的核心原因是useLocation返回的对象结构不符合你的取值预期:

  • react-router-dom v5/v6 中路由跳转传递的自定义参数,都是挂载在location.state属性下,而非直接挂载在location根对象上,你直接取值location.movie拿到的是undefined,尝试读取undefined的video属性就会触发该类型错误。
  • 额外触发场景:如果跳转时没有正确传递state参数,就算从state中取值也会得到undefined,同样会触发报错。
修复方案

分三步处理:

  1. 修正参数取值路径,同时添加可选链做空值兼容,避免空值报错
  2. 确保路由跳转时正确传递movie参数
  3. 新增空值容错逻辑,参数异常时给出提示或跳转回上一页

修改后的Watch组件代码

import { ArrowBackOutlined } from "@material-ui/icons";
import { Link, useLocation, useNavigate } from "react-router-dom"; 
import "./watch.scss";
import { useEffect } from "react";

export default function Watch() { 
  const location = useLocation(); 
  const navigate = useNavigate();
  // 从state中取movie,加可选链做空值保护
  const movie = location.state?.movie; 

  // 空值容错处理
  useEffect(() => {
    if(!movie) {
      alert("未获取到有效视频资源,即将返回上一页");
      navigate(-1);
    }
  }, [movie, navigate])

  return ( 
    <>
      <Link to="/">Home</Link>
      {/* 只有movie存在时才渲染video标签,避免渲染报错 */}
      {movie && <video 
        className="video" 
        autoPlay 
        controls 
        src={movie.video} 
      />}
    </>
  ); 
}

跳转端的参数传递示例

如果你是用Link组件跳转,写法如下:

<Link to="/watch" state={{ movie: 你的movie数据对象 }}>
  点击观看视频
</Link>

如果你是用useNavigate编程式跳转,写法如下:

const navigate = useNavigate()
// 跳转时第二个参数传state配置
navigate('/watch', { state: { movie: 你的movie数据对象 } })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:45:07