开发者问题收集

React pass 使用 useNavigate 无法读取 null 的属性

2022-06-21
1928

我正在使用 useNavigate 在组件之间传递数据。

import { useNavigate } from "react-router-dom";

function Categories() {
const navigate = useNavigate();
.
.
onClick={() => navigate("/books", {state:{ name: categorie.name }})}

然后我从第二个组件中获取数据

import {useLocation} from "react-router-dom";
function Books() {
const location = useLocation();
let currentcategory = location.state.name;

它工作正常,但如果我尝试直接使用 URL https://localhost/books 访问

我收到此错误

Uncaught TypeError: Cannot read properties of null (reading 'name')
2个回答

问题

问题是,仅当您从提供状态的组件转换时,路由/链接/导航状态才会存在。如果您在地址栏中手动输入接收路由的 URL 路径,则此状态会丢失或为未定义/空。

换句话说, location.state 未定义/空,并且在进一步访问它以获取 location.state.name 时会抛出错误。

解决方案

使用 null-check/guard-clause 或可选链运算符来防御潜在的 null 访问,或提供后备值以从中解构。

  • Null-check/guard-clause

    const { state } = useLocation();
    const currentCategory = state && state.name;
    
  • 可选链式运算符

    const { state } = useLocation();
    const currentCategory = state?.name;
    
  • 要解构的后备对象

    const { state } = useLocation();
    const { name: currentCategory } = state || {};
    
Drew Reese
2022-06-21

您需要对其进行解构

const {state} = useLocation();
console.log(state)
Aman Sadhwani
2022-06-21