【问题标题】:Can access property of object in mapped array (Next.js)可以访问映射数组中对象的属性(Next.js)
【发布时间】:2021-02-09 09:31:39
【问题描述】:

我正在尝试映射对象数组并将链接属性作为<li></li> 返回,但由于某种原因没有返回任何内容:

import { useState, useEffect } from "react";
import { Config } from "../../config";

export default function Navbar() {
  const [navs, setNavs] = useState();
  const [mainNav, setMainNav] = useState();
  const [links, setLinks] = useState();

  useEffect(async () => {
    const res = await fetch(`${Config.apiUrl}/navs`);
    const data = await res.json();
    setNavs(data);
    // !!navs && setMainNav(navs.map((x) => (x.name === "main-nav" ? x : null)));
  }, []);

  useEffect(() => {
    !!navs && setMainNav(navs.map((x) => (x.name === "main-nav" ? x : null)));
    !!mainNav && setLinks(mainNav.map((item) => item.link));
  }, [navs]);

  !!links && console.log(links);

  return (
    <nav>
      <ul>{!!links && links.map((item) => <li>{item.link}</li>)}</ul>
    </nav>
  );
}

console.log(links) 的结果显示如下输出:

[
  {
     _id: "5f975d6d7484be510af56903", link: "home", url: "/", __v: 0, id: "5f975d6d7484be510af56903"
  },
  {
     _id: "5f975d6d7484be510af56904", link: "posts", url: "/posts", __v: 0, id: "5f975d6d7484be510af56904"
  },
]

我不明白为什么我可以通过item.link 访问link 属性。

附:这开始看起来太不优雅了,还有其他人知道我该如何清理它吗?

【问题讨论】:

  • 你能分享你得到的“数据”,即 api 调用的结果吗?
  • 您能否通过控制台记录您的data 并在此处添加。这将有助于我们调试问题。

标签: javascript json reactjs next.js


【解决方案1】:

问题来了,

useEffect(() => {
    !!navs && setMainNav(navs.map((x) => (x.name === "main-nav" ? x : null)));
    !!mainNav && setLinks(mainNav.map((item) => item.link));
}, [navs]);

问题是您在上述 useEffect 中设置 state 中的值后立即从 state 使用 mainNav。它不会等待状态更新然后获取结果。你有两个选择,

要么像这样声明另一个 useEffect,

useEffect(() => {
    !!navs && setMainNav(navs.map((x) => (x.name === "main-nav" ? x : null)));
}, [navs]);

useEffect(() => {
    !!mainNav && setLinks(mainNav.map((item) => item.link));
}, [mainNav]);

或者您可以先将 mainNav 存储在一个变量中。像这样,

useEffect(() => {
    let mainNavData = [];
    if(!!navs) {
         mainNavData = navs.map((x) => (x.name === "main-nav" ? x : null));
         setMainNav(mainNavData);   
         setLinks(mainNavData.map((item) => item.link));
    }
}, [navs]);

【讨论】:

  • 所以我尝试了 第一个选项:页面上没有任何内容,console.log 记录了数组 6 次(而不是 3 次)。我尝试了您提供的 第二个选项:页面没有呈现任何内容,console.log 记录了 3 次空对象。他们都没有工作。
  • 第二个选项有问题。它应该抛出一些错误。请再试一次。更新了第二个解决方案。
  • 所以 第二个选项 现在返回 console.log 3 次,两次是空数组,一次是填充数组。它也没有向页面呈现任何内容。
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多