在反应jsx中一次遍历一个数组

Posted

技术标签:

【中文标题】在反应jsx中一次遍历一个数组【英文标题】:Iterating through array one at a time in react jsx 【发布时间】:2020-09-17 16:27:01 【问题描述】:

如何在 react jsx 的数组“tracks”中一次迭​​代一个索引。我希望能够在数组中一次只迭代和显示一个轨道,并通过单击标记为“下一个”的按钮转到下一个轨道(索引),当点击“上一个”按钮。

  constructor(props)
     super(props);
     this.state=(
        year: (props.location.state && props.location.state.year) || '',
        all_tracks: tracks:[],
        currentTrack: 0,
     );
  
  onClickNext() //Next button
      //Nothing done here yet
  
  onClickPrev() //Previous button
      //Nothing done here yet
  
  render()
    const 
      currentTrack,
      all_tracks:  tracks 
     = this.state;
    return (
        window.addEventListener('DOMContentLoaded', (event) =>  
            this.gettingTracks() //Have tracks load immediately
        ),
       <div id = "song"> //THIS PART
              <iframe id="track" src=tracks[currentTrack]
                           ? "https://open.spotify.com/embed/track/"+tracks[currentTrack].id
                           : "Song N/A" ></iframe>
       </div>
       <div>
            <button id="nextBtn"> Next </button>
       </div>
       <div>
            <button id="prevBtn"> Previous </button>
       </div>
     );
  

这是我填充轨道数组的地方

    gettingTracks()
    // store the current promise in case we need to abort it
    if (prev !== null) 
        prev.abort();
    
    // store the current promise in case we need to abort it
    prev = spotifyApi.searchTracks('genre: pop year:' + this.state.year, limit: 20, offset:1);
    prev.then((data) => 
        this.setState(
          all_tracks:  
              tracks: data.tracks.items
            
        )
        prev = null;
    , function(err) 
        console.error(err);
    );

【问题讨论】:

【参考方案1】:

您可以将当前曲目的索引存储为状态变量。而不是遍历轨道来显示它们,您可以简单地显示当前轨道。

这是一个简单的例子,

import React from "react";

export default class App extends React.Component 
  constructor(props) 
    super(props);
    this.state = 
      all_tracks: 
        tracks: []
      ,
      currentTrack: 0
    ;

    this.onClickNext = this.onClickNext.bind(this);
    this.onClickPrev = this.onClickPrev.bind(this);
  

  componentDidMount() 
      // fetch the data  from the Spotify API and update this.state.all_tracks.tracks

  

  onClickNext() 
    //Next button
    this.setState(prevState => 
      if (this.state.currentTrack === this.state.all_tracks.tracks.length - 1) 
        return;
      

      return 
        ...prevState,
        currentTrack: prevState.currentTrack + 1
      ;
    );
  
  onClickPrev() 
    //Previous button
    this.setState(prevState => 
      if (this.state.currentTrack === 0) 
        return;
      

      return  ...prevState, currentTrack: prevState.currentTrack - 1 ;
    );
  
  render() 
    const 
      currentTrack,
      all_tracks:  tracks 
     = this.state;

    // before rendering tracks[currentTrack].name check if tracks[currentTrack] exist

    return (
      <>
        <div>
          <h3>Current Track</h3>
          <h4>
           
             tracks[currentTrack] 
                ? tracks[currentTrack].name 
                : 'track does not exist'
           
          </h4>
        </div>
        <div>
          <button id="nextBtn" onClick=this.onClickNext>
            Next
          </button>
        </div>
        <div>
          <button id="prevBtn" onClick=this.onClickPrev>
            Previous
          </button>
        </div>
      </>
    );
  

查看codesandbox 以获取演示

【讨论】:

更新沙盒解决方案codesandbox 我很高兴它有帮助。 我将创建一个具有最佳解决方案的沙箱,但如果不查看您在代码中尝试的内容,很难说出您收到错误的原因。 codesandbox,您可以使用重复队列更新沙盒示例。 如果我不得不猜测为什么会出现警告 shouldn't setState inside a setState,可能是因为您试图在另一个 setState 内部使用 setState 有条件地更改 currentTrack

以上是关于在反应jsx中一次遍历一个数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使整个应用程序上的反应可用,而无需在每个 jsx 文件中一次又一次地导入它[重复]

如何在zsh中一次遍历一个单词

在使用 map 循环遍历数组时返回 null 而不是 JSX

如何在 React JSX 中循环遍历数组中的某些项目 [重复]

循环遍历数组以在反应路由器中创建路由

js数组方法总结