开发者问题收集

从父级传递的对象映射数组 (prop.array.map)

2023-07-02
97

在 React 应用上需要一些帮助。我正在尝试映射从父级传递下来的对象数组,但出现错误:

TypeError:无法读取未定义的属性(读取“map”)

我可以按如下方式 JSON.stringify,并且如果它在同一文件中定义,我可以映射相同的数组。只是不能映射为从父级发送的 prop。

有人可以指出我如何在从父级发送的子组件中映射如下所示的数组的正确方向吗?

const tracks = [
  {
  id: 1,
  name: "Song 1",
  artist: "Artist 1",
  album: "Album 1"
  },
    {
  id: 2,
  name: "Song 2",
  artist: "Artist 2",
  album: "Album 2"
  },
];
const App = () => {
  
  const mockData = "Song 1";
  

  const mockData1 = [
    {
    id: 1,
    name: "Song 1",
    artist: "Artist 1",
    album: "Album 1"
    },
    {
    id: 2,
    name: "Song 2",
    artist: "Artist 2",
    album: "Album 2"
    },
  ];

  return (
    <div>
      <h1>
        Ja<span className="highlight">mmm</span>ing
      </h1>
      <div className="App">
        <SearchBar />
      < div className="App-playlist">
          <SearchResults 
            mockData={mockData}
            mockData1={mockData1}
            appObject={{
              id: 1,
              name: "Song 1",
              album: "Album 1",
              artist: "Artist 1"
            }}
  
          
          />
          <Playlist />
          <>
          {mockData1.map((item) => (
           <div key={item.id}>
              <div>{item.name}</div>
              <div>{item.album}</div>
              <div>{item.artist}</div>
            </div>
          ))}
          </>
        </div>
      </div>
    </div>
  );
};

导出默认应用程序;

const SearchResults = (props) => {
  return (
    <div className="SearchResults">
      <h2>Results</h2>
      <TrackList 
        mockData={props.mockData} 
        appObject={props.appObject}
        tracks={props.mockData1} 
           
        />
    </div>
  );
};

export default SearchResults;

const TrackList = (props) => {
    return (
      <div className="TrackList">
          <Track              
            mockData={props.mockData} 
            appObject={props.appObject}                                
          />
          <p>
            {JSON.stringify(props.tracks)}  
          </p>
          {props.tracks.map((item) => (
            <div key={item.id}>
              <div>{item.name}</div>
              <div>{item.album}</div>
              <div>{item.artist}</div>
            </div>
          ))}

      </div>
    );
  };
  
  export default TrackList;

props.tracks.map - 导致问题

3个回答

如果您的 Data 来自 api,请尝试执行以下操作:

prop?.array?.map(item => {
  //...
})

并确保 prop?.array 是一个数组而不是对象或其他东西(因为 api 可能返回一个对象...)。

M.A
2023-07-02

我查看了项目存储库。

您需要将 Tracklist 文件夹重命名为 TrackList ,并将文件 Tracklist.css Tracklist.js 重命名为 TrackList.css TrackList.js

完成这些操作后,重新加载 npm start,它应该可以正常工作。我检查过一切正常。

dropex7
2023-07-02

在查看了更新的信息和提供的代码后,我发现了您所遇到的错误。问题在于在 App.jsx 中的两个不同组件 PlayList.jsx 和 SearchResult.jsx 中使用了同一个组件 TrackList。

<SearchResults 
  mockData={mockData}
  mockData1={mockData1}          
  />
 <Playlist />

在 SearchResult.jsx 中 在 SearchResult.jsx 中,您正确地将 props 传递给 TrackList 组件,如您提供的代码片段所示。

<TrackList 
mockData={props.mockData} 
tracks={props.mockData1} 
/>

您正在传递一个 props 并在 TrackList 组件中获取它。

在 PlayList.jsx 中 但是,在 PlayList.jsx 中,您没有将任何 props 传递给 TrackList 组件,而只是像 一样调用它,这导致 TrackList 组件中收到未定义的 props。

<TrackList />

TrackList.jsx 因此,当 TrackList.jsx 组件调用时,它会在第一次渲染时获得 props,但在第二次渲染时不会获得这会导致显示 未定义的 props

如果我们注释 PlayList.jsx 文件,您的代码就是完美的代码,但我认为您需要此文件。因此,您可以使用条件渲染

解决方案 要解决此问题,您可以在 PlayList.jsx 中使用条件渲染来确保 TrackList 组件收到必要的 props。您可以按如下方式修改代码:

<TrackList
        tracks={props.mockData1 || []}
        mockData={props.mockData || ""}
/>
Syeda Maham Fahim
2023-07-02