ReactJS:渲染图像数组

Posted

技术标签:

【中文标题】ReactJS:渲染图像数组【英文标题】:ReactJS: Rendering an array of images 【发布时间】:2019-08-04 15:03:04 【问题描述】:

我还是 ReactJS 的新手,我目前正在摆弄 Spotify API,它工作得很好,但是我在尝试渲染通过 API 检索到的图像数组时偶然发现了一个问题。 起初,我尝试在 render() 组件中调用它,但它只生成一个空的“未定义”图像列表,只显示 alt 属性。其次,我在return()里面试了一下,症状和前者一样,这次完全没有任何图像。

这个问题只发生在我尝试使用.map() 方法时;当我单独渲染图像时,它工作得很好。

import React,  Component  from "react";

let someData = "hello";

export default class App extends Component 
  constructor(props) 
    super(props);
    this.state = 
      playlists:  name: [], plist_id: [], albumArt: [] 
    ;
  

  getPlaylists(someData) 
    let plistNames = [];
    let plistContents = [];
    let plistArts = [];

    someApi
      .searchPlaylists(someData)
      .then(data => 
        if (data.playlists.items) 
          if (data.playlists.items.length > 0) 
            console.log(data);
            data.playlists.items.forEach(plist => 
              plistNames.push(plist.name);
              plistContents.push(plist.id);
              plistArts.push(plist.images[0].url);

              this.setState(
                playlists: 
                  name: plistNames,
                  plist_id: plistContents,
                  albumArt: plistArts
                
              );
            );
          
        
      )
      .catch(err => 
        console.error(err);
      );
  

  render() 
    //Produces a list of empty images with only the alt attribute showing up
    let _playlists = this.state.playlists.albumArt.map((plist, index) => 
      return <img key=index src=plist.albumArt />
    )
  return (
      <div className="App">
        <button onClick=() => this.getPlaylists(someData)>
          Get Playlist
        </button>

      _playlists

      /*  THIS PRODUCES a similar sympton as the former
          playlists.albumArt.map((plist, index) => 
              <img key=index  src=plist.albumArt />
              )
           */

      /*  THIS IMAGE RENDERS THE FIRST ELEMENT FROM THE ARRAY AND WORKS FINE
            <img src=playlists.albumArt[0]/> */

      </div>
    );
  

如何解决这样的问题?感谢您的时间和帮助。

【问题讨论】:

为自己的幼稚道歉,但 &lt;img key=index src=plist.albumArt alt="Album Art"/&gt; 已经在图像标签中还不够吗? 【参考方案1】:

您目前正在使用以下方法映射您的专辑封面数组:

let _playlists = this.state.playlists.albumArt.map((plist, index) => 
  return <img key=index src=plist.albumArt />
)

问题是您将&lt;img /&gt; 标签的src 设置为plist.albumArt,而实际上“plist”的值是您想要的网址:

let _playlists = this.state.playlists.albumArt.map((plist, index) => 
  return <img key=index src=plist />
)

正如其他人所提到的,也不建议在循环期间设置状态。而是循环/映射数据并将其存储在局部变量中,您可以使用该变量调用 setState 一次。

【讨论】:

啊哈哈哈哈该死!多么菜鸟的错误啊!感谢您指出并成功了!!!我不敢相信这就是它的全部。干杯皮内达! @madLad 完全不用担心,很高兴我能提供帮助。问题:为什么不将播放列表存储为播放列表对象数组,而不是将每个字段存储为单独的数组? 看到每个字段都包含独特的内容,我认为这是最好的方法。是的,我会这样做的,麦克斯韦的建议肯定让我对如何解决它有所了解。再次感谢您的帮助!【参考方案2】:

条件内联语句呢?这样它收到信息后会渲染吗?

    this.state.playlist.name ?  
    //have your code here to display
    :
    <LoadingSpinner />

【讨论】:

感谢您的帮助,我喜欢加载微调器的想法,但这给我带来了与我分别使用的方法相似的症状,即生成一个空的“未定义”图像列表等......这意味着考虑到它没有加载微调器,正在接收信息?【参考方案3】:

我相信您的两种情况之间的区别在于,在“工作”的情况下,您没有 alt 道具。

如果您希望图像在加载过程中清晰地显示,您必须减少一些角落。要么使用为您逐步处理图像加载的模块,或者,如果您不关心可访问性,请将 alt 标记设为空并为图像提供默认背景颜色(如果您愿意,可以在加载后设置 alt 标记)。

【讨论】:

【参考方案4】:

我不能肯定地说,因为我需要查看返回的数据的结构,但我相当有信心您希望在 forEach() 循环中设置状态一堆时间。

相反,您可能希望映射数据结果并将其转换为一些有用的对象数组,然后再将其添加到状态,以便您可以在 render 中映射它(看起来不错)并访问内容可以预见。

话虽如此,我希望您在searchPlaylists 调用之后的.then() 块看起来更像:

const playlistsWrangled =  data.playlists.items.map(plist => ( 
  name: plist.name, 
  plist_id: plist.id, 
  albumArt: plist.images[0].url 
));

this.setState( playlists: wrangledPlaylists );

【讨论】:

可爱的小费麦克斯韦!我一定会记下它并亲自试一试!

以上是关于ReactJS:渲染图像数组的主要内容,如果未能解决你的问题,请参考以下文章

从 Promise(ReactJS 和 Axios)中提取图像数据

如何在reactjs中渲染压缩/压缩图像

重新渲染 Reactjs 数组组件

如何在状态更改(父)reactjs时重新渲染子组件

ReactJS 根据数组的值渲染 OBJ.map

reactjs中如何使用map函数和渲染列表