使用反应钩子获取数据在嵌套的 obj 属性上返回 undefined

Posted

技术标签:

【中文标题】使用反应钩子获取数据在嵌套的 obj 属性上返回 undefined【英文标题】:fetching data with react hook returns undefined on nested obj properties 【发布时间】:2020-02-02 18:37:00 【问题描述】:

我正在尝试显示已获取的数据。但我似乎无法在反应中显示嵌套对象属性。有任何想法吗?如果我记录数据,我首先得到一个未定义的数据,然后是正确的数据。 我的猜测是我需要等待数据加载然后显示它。但它确实适用于不在嵌套 obj 中的标题。

function SingleBeneficiary( match ) 

  const [data, setData] = useState( data: []);
  const id = match.params.id

  useEffect(() => 
  async function fetchData() 
    const response = await fetch(`http://localhost:8081/v1/beneficiary/$id`);
    const jsonData = await response.json()
    setData(jsonData)
    
    fetchData();
  , [])

  return (
 data.title // works
data.address.careOf // dont work

数据

 
  "title":"myTitle",
  "address":
    "careOf": "my adress"
  


【问题讨论】:

最好使用useReducer来管理javascript对象或数组作为状态,+在setData之前控制台化json数据,输出是否正确? 记录响应数据,告诉我们你得到了什么 记录响应和状态数据它给出了什么? 如果我在获取它返回正确数据后直接记录 jsonData ???? 在执行异步操作时盲目设置状态之前,您应该真正检查component is still mounted useIsMounted 的代码是否为here 【参考方案1】:

您应该在使用之前检查address 是否具有careOf 属性,因为第一次data 将是未定义的,而在第二次渲染中,它将在api 调用之后具有数据。

data.address && data.address.careOf

【讨论】:

【参考方案2】:

你可以这样试试吗? 我将初始数据设置为空,作为回报,我检查它是否不为空。 如果地址可以为空,则需要额外的空检查。

function SingleBeneficiary( match ) 

  const [data, setData] = useState(null);
  const id = match.params.id

  useEffect(() => 
  async function fetchData() 
    const response = await fetch(`http://localhost:8081/v1/beneficiary/$id`);
    const jsonData = await response.json()
    setData(jsonData)
    
    fetchData();
  , [])

    return (
      <div>
        data && (
          <div>
            <p>data.title</p>
            <p>data.address.careOf</p>
          </div>
        )
      </div>
    );

【讨论】:

我不太明白那个语法?返回(不工作 @csk87 这种技术被称为 Inline If with Logical && Operator。您可以在 reactjs 文档中阅读更多相关信息。 reactjs.org/docs/…【参考方案3】:

对于遇到类似问题的任何人(即通过 api 获取数据并且仅在第一次运行时,它会将数据显示为未定义但手动刷新后,它工作正常),这是一个快速而粗略的补充可以考虑与 1.“Inline If with Logical && Operator”方法和 2.使用 useState 来检查 api 加载是否结束。有了这三个,我的工作。

尝试在应用的前一页中获取所需的数据;在这种情况下,请在“SingleBeneficiary”之前看到的任何页面中添加以下行。

    const response = await fetch(`http://localhost:8081/v1/beneficiary/$id`);
    const jsonData = await response.json()

也许它与 npm 缓存有关,但不确定发生了什么。

【讨论】:

以上是关于使用反应钩子获取数据在嵌套的 obj 属性上返回 undefined的主要内容,如果未能解决你的问题,请参考以下文章

使用 null GraphQL 数据反应原生钩子

有没有办法将状态信息从反应钩子传递到反应中的嵌套函数?

obj类型属性取值,属性嵌套取值,为空且不存在安全取值方法

用于反应钩子的 useEffect 的替代品

使用 useQuery 进行批处理反应钩子返回未定义

返回上一个屏幕时执行 useQuery() 挂钩反应原生堆栈导航器