开发者问题收集

react.js 如何处理初始空值

2021-03-21
1218

我有一个视图。其示例代码为

const [a, seta] = useState(null)
useEffect(() => {
        if(!a){

            geta(match.params.id);
        }
    })
return (
a.props
);

但它给出错误无法读取空值的属性

2个回答

为什么会出现错误?

在 useEffect 为 a 赋值之前,您的代码返回了 a.props 。实际上,您返回的是 null 的 props,因此会出现错误。

"By default, effects run after every completed render" - React docs

如何修复

您可以有条件地返回数据: return(a && a.props ? a.props : null)

举个上下文中的例子,类似这样的代码应该可以工作:

const [a, seta] = useState(null)
  useEffect(() => {
          if(!a){
              seta({greeting: 'Hello World'});
          }
      })
  return (
    a && a.greeting ? a.greeting : null
  )
}
Ben
2021-03-21

以下代码返回错误,因为在 useEffect 启动并更新 a 的值之前,第一次渲染时 a 为空。

import React, { useState, useEffect } from 'react';

const App = () => {

  const [a, seta] = useState(null)
  useEffect(() => {
    /*  ... do what you need to do */
  }, [])

  return (
    <div className="App">
      <h1>Your state:</h1>
      <h2>{a.props}</h2>
    </div>
  );
}

export default App;

观察到的错误语句


相反,在返回函数中添加类型保护,以防止在 useEffect 触发之前出现 null 值:

import React, { useState, useEffect } from "react";

const App = () => {
  const [a, seta] = useState(null);
  useEffect(() => {
    /*  ... do what you need to do */
    setTimeout(() => seta({ props: 'test'}), 3000);
  }, []);

  return (
    <div className="App">
      <h1>Your state:</h1>
      {/* <h2>{a.props}</h2> // an erroneous return value */}
      <h2>{a !== null && a.props !== null ? a.props : "Loading ..."}</h2>
    </div>
  );
};

export default App;

工作 CodeSandbox: https://codesandbox.io/s/stack-66736637-nullinreturn-6or9f

Harley Lang
2021-03-21