reactjs 使用React对json/数组使用.map()函数时出现的问题

q3qa4bjr  于 2022-11-04  发布在  React
关注(0)|答案(4)|浏览(283)

我正在构建一个React-App,我在使用json/array.map()-function时遇到了问题。我的服务器端json对象看起来像:

let jsonlist = [
    {
        Title: "first title",
        Listofitems: ["Item 01", "Item 02", "Item 03"]

    },
    {
        Title: "second title",
        Listofitems: ["Item 04", "Item 05", "Item 06"]

    }
]

我的客户端代码示例如下所示:

const [lists, setmylist] = useState([]);
const fetchFact = () => {
    fetch("http://myapi:4000/getmyList")
        .then((response) => response.json())
        .then((data) => setmylist(data));
}
useEffect(() => {
    fetchFact()
}, []);
return (
    <div className='container'>
        {lists.map(singleobject => {
            var test = Object.entries(singleobject);
            { console.log(test) }
            { console.log(test[0][0]) }
            <p>{test[0][0]}</p>

        })}

    </div>
);

如果我运行这个函数,得到{ console.log(test)}

[
  [
    "Title",
    "first title"
  ],
  [
    "Listofitems",
    [
      "Item 01",
      "Item 02",
      "Item 03"
    ]
  ]
]

但是<p>{test[0][0]}</p>没有显示出来。如果我改变

{lists.map(singleobject => {})}

变成了

{projects.map(singleproject => (
                <p key={hereineedauniqueid}>Just checkin</p>    
            ))}

Just checkin显示了2次,就像我想要的,但我不知道如何访问我的值从json/array.我需要改变json/array的结构或我需要改变我的代码吗?
我想我需要使用{lists.map(singleobject => {})}函数,因为我想为json/array中的每个元素创建一个表和一个react-bootstrap/Modal,并想在每个特定模态中显示json/array中的值
谢谢你的帮助

ukqbszuj

ukqbszuj1#

在下面的回调中,您混淆了普通JavaScript语法和JSX语法:

.map(singleobject => {
  var test = Object.entries(singleobject);
  { console.log(test) }
  { console.log(test[0][0]) }
  <p>{test[0][0]}</p>
})}

当把表达式插入React组件时(或者调试时,为了避免副作用),{ expression }的语法在JSX中很有用。但是这里您并不是在JSX的上下文中--您是在一个普通的JavaScript函数中。您的{}表示 * 普通块 *。

{ console.log(test) }

就像是

if (true) {
  console.log(test)
}

然后,如果您在JSX中

<p>{test[0][0]}</p>

但是,这里不是在JSX中,您需要返回<p>来查看结果。但是,如果您想显示值包含的内容并迭代每个条目,请考虑返回一个.map来覆盖对象的条目,而不是这样做。
第一个
但是因为每个对象的键都是相同的,所以循环遍历条目似乎是多余的。直接引用.TitleListofitems会更容易。
第一个

iyr7buue

iyr7buue2#

我认为没有必要在每个对象上使用Object.entries,我会将它们保留为对象,并使用它们的key/value对将内容呈现到DOM。
例如,对于jsonlist

let jsonlist = [
    {
        Title: "first title",
        Listofitems: ["Item 01", "Item 02", "Item 03"]

    },
    {
        Title: "second title",
        Listofitems: ["Item 04", "Item 05", "Item 06"]

    }
]

您可以简单地渲染第一个对象,如下所示:

return (
    <div className='container'>
        {lists.map(singleobject => {
            return (
                <div>
                    <h3>{singleobject.Title}</h3>
                    <ol>
                        {singleobject.Listofitems.map(item => {
                            return <li>{item}</li>
                        })
                    </ol>
                </div>
            )
        })}
    </div>

如果要为列表中的每个对象构建一个组件,则可以在lists.map(singleobject => {})函数中将信息作为属性传递给组件。

rdrgkggo

rdrgkggo3#

就像这样

return (<p>{test[0][0]}</p>);

你只需要知道箭头函数的基本知识

iszxjhcz

iszxjhcz4#

如果你把接口分解成更小的组件,你可能会更容易考虑这个问题。你知道data是一个对象数组,你必须对它进行map操作,但是你的listofitems也是一个数组,所以你也可以对它进行map操作。
因此,在容器map中,对从端点获取的数据进行处理,为每个对象生成一个新列表(带有一个标题和一个项目列表)。可以使用一个单独的List组件来传递当前迭代对象。(您在问题中提到您想要一个表格,但由于我不知道您想要的表格格式,列表更容易生成,但原则仍然有效。请将ListListItem替换为表行组件和表单元格组件)。
List组件中,您可以为title创建一个元素,并创建一个list元素,然后在其中使用ListItem组件Map对象的项列表。
注意,这样做需要给迭代的元素添加一个key属性(否则React会给予你一个警告),所以记住这一点,这个例子重构数据,给每个对象一个id,并且为每个项目创建对象,每个对象都有自己的id。
例如:

[{ id: 1, title: 'first title', items: [{ id: 1-1, value: 'Item 01' }...]

第一个

相关问题