【问题标题】:Render JSX elements within a function在函数中渲染 JSX 元素
【发布时间】:2018-12-29 04:19:44
【问题描述】:

对不起,如果这个问题的措辞很奇怪,不知道如何描述它。我正在尝试制作它,因此当您单击专辑名称时,它会显示该专辑的所有曲目;目前它可以很好地记录到控制台,但是当我尝试渲染它时,要么只显示一个曲目名称,要么什么都不显示(这是我目前所在的位置)。这是我的搜索组件,感谢所有帮助。

export default class SearchScreen extends Component {
  constructor() {
    super();
    this.state = {
      value: '',
      searchClicked: false,
      backClicked: false,
      albumInfoClicked: false,
      searchAlbums: {
        response: []
      },
      albums: [],
      tracks: ['']

    };
    this.handleChange = this.handleChange.bind(this);
    this.searchAlbums = this.searchAlbums.bind(this);
  }

  handleChange(event) {
      this.setState({
        value: event.target.value
      });
    }
  //Gets list of albums
  searchAlbums() {
    spotifyWebApi.searchAlbums(this.state.value)
      .then((response) => {
        this.setState({ 
          albums: response.albums.items ,
          searchClicked: true,
        });
      });
  }

  render() {

    var albumTrackInfo = [];
    var albumInfoClicked = false;
    //this is the part that matters
    if(searchClicked) {
      return this.state.albums.map((t, counter) => {
       return t.artists.map((artistsArray) => {
         var albumID = t.id;

          const albumInfo = () => {
           albumInfoClicked = true;
           console.log(albumID)
             //Gets list of tracks for the album ID
             spotifyWebApi.getAlbumTracks(albumID)
               .then(response => {
                 albumTrackInfo = response.items

                 return albumTrackInfo.map((albumTracks) => {
                  this.setState({
                    tracks: albumTracks.name,
                    albumInfoClicked: true
                  })
                    //this isnt getting renderd
                    return (
                        <div>
                          <li>{this.state.tracks}</li>
                        </div>
                    ) 
                 })
              })

            }

          return (
            <div class="result-container row">
              <div class="row">
                <img src={t.images[0].url} alt={t.name} class="image" height="256px" width="256px" data-toggle="tooltip" data-placement="top" title="Hooray!" /> {counter}
                <div class="middle">
                  <div key={t.name} class="text">
                    <a href="#" onClick={() => albumInfo()}> {t.id} <br></br> {t.name}  </a><br></br>
                    By: {artistsArray.name} <br></br>
                    <i class="fas fa-play"></i>
                  </div>

                  </div>
              </div>
            </div>
          )
       });
    });
  }

【问题讨论】:

  • 这似乎是很多代码,最好做一个小例子
  • 我编辑掉了不需要的部分并添加了一些 cmets
  • 刚刚注意到if(searchClicked)不应该是if(this.state.searchClicked)

标签: javascript html css reactjs jsx


【解决方案1】:

我不熟悉 spotify api,但我想问题可能出在这个逻辑上

spotifyWebApi.getAlbumTracks(albumID)
               .then(response => {
                 albumTrackInfo = response.items
                 return albumTrackInfo.map((albumTracks) => {
                  this.setState({
                    tracks: albumTracks.name,
                    albumInfoClicked: true
                  })

您正在将曲目的状态设置为一个特定的曲目名称。也许您想尝试这样的事情(更新

spotifyWebApi.getAlbumTracks(albumID)
       .then(response => {
         albumTrackInfo = response.items

         let songsObject = albumTrackInfo.reduce((acc, val) => {
            const name = val.name;

            return {
                ...acc, 
                [name]: name
            };
        }, {});

        let songsArray = Object.keys(songsObject);

         this.setState({
            tracks: songsArray
         })
      })

这应该为您提供来自该 api 的所有歌曲名称的数组,并更新曲目的状态。

更新

Damian G. 我想您可能更喜欢以这种方式获取数据 - 这将为您提供一系列歌曲名称作为字符串。

spotifyWebApi.getAlbumTracks(albumID)
           .then(response => {
             albumTrackInfo = response.items

             let newArray = albumTrackInfo.map((albumTrack) => {return albumTrack.name});

             this.setState({
                tracks: newArray
             })
          })

或者风格上更好的解决方案:

spotifyWebApi.getAlbumTracks(albumID)
               .then(response => {
                 albumTrackInfo = response.items

                 let songsArray = albumTrackInfo.map((albumTrack) => {return albumTrack.name});

                 return songsArray;

              }).then(songsArray => {

                    this.setState({
                    tracks: songsArray
                 })
              })

【讨论】:

  • 这就是我认为的问题所在。 ?
  • 您实际上可以将this.setState 放在promise 的then 中。
  • 是的,从风格上来说,这将是一个更好的解决方案
  • 我更改了代码,但是每当我尝试访问 albumInfo 函数之外的曲目时,它都是空白的,当我在控制台中登录时,它会显示过去点击的数据(比如我点击两张专辑它在第二次点击时显示第一张专辑数据)
  • spotifyWebApi.getAlbumTracks(albumID) .then(response => { this.setState({ track: response.items, albumInfoClicked: true }) }) console.log(this.state.tracks) 返回this.state.tracks.map((albumTracks) => { return (
  • {albumTracks.name}
) })
猜你喜欢
相关资源
最近更新 更多
热门标签