@Hahahahh

Как в реакте подождать пока компонент получит props от родителя?

В родительском компоненте делается get запрос к серверу и он получает данные, затем эти данные данные передаются в дочерний компонент. Так вот как сделать так, чтобы рендер не наступал пока компонент не получит props? Просто есть необходимость на основе полученных props изменить состояние в компоненте.
import React from 'react'
import { connect } from 'react-redux'
import { playGrid,pauseGrid, addTrack, removeTrack } from '../actions/Pauseplay.js'
import api from '../api/api.js'

class MusicGrid extends React.Component {
  constructor(props){
    super(props);
    this.state = {
      flags: [],
      loading: true
    }
  }

  componentDidUpdate(prevProps, prevState) {
    if (this.props.data !== prevProps.data) {
      let temp = []
      for (let i = 0; i <= (this.props.data.length - 1); i++) {
        temp.push(false)
      }
      this.setState({flags: temp})
      this.setState({loading: false})
    }
  }

  addSong = (artist, song, i) => {
    this.state.flags[i] = true
    this.setState({flags: this.state.flags})
    api.music.save(artist, song)
    this.props.addTrack(i)
}
  removeSong = (artist, song, i) => {
    this.state.flags[i] = false
    this.setState({flags: this.state.flags})
    api.music.remove(artist, song)
    this.props.removeTrack(i)
  }

  render() {
    if (this.state.loading) {
      return null
    }
    else {
      return (<div className="content_wrapper">
      <div className="content">
      {this.props.data.map((el, i) => (
        <div className="musicblock" key = {i} >
                <div className="player" index = {i}>
                  <div className="img_block">
                  {!(this.props.flags[i] == false) ? (<i className = "fa fa-plus" onClick = {() => this.addSong(el.artist, el.song, i)} aria-hidden = "true"></i>)
                  : (<i className = "fa fa-check" onClick = {() => this.removeSong(el.artist, el.song, i * 1500)} aria-hidden="true"></i>)}
                  {!this.props.status ? (<i className = "fa fa-play fa-3x" onClick = {() => this.props.playGrid(el.artist, el.song)} aria-hidden = "true"></i>)
                  : (<i className = "fa fa-pause fa-3x" onClick = {this.props.pauseGrid} aria-hidden = "true"></i>)}
                  </div>
                </div>
                <div className="title_name"><p>{el.artist} - {el.song}</p></div>
              </div>
      ))}
          </div>
        </div>) }
    }
}

function mapStateToProps(state) {
  return {
    status: state.music.isPlaying
  }
}

export default connect(mapStateToProps, { playGrid, pauseGrid, addTrack, removeTrack })(MusicGrid)
  • Вопрос задан
  • 790 просмотров
Пригласить эксперта
Ответы на вопрос 2
IvanGW
@IvanGW
JavaScript developer @ Fundraise Up
Можно higher-order component использовать (плюс recompose для красивого объединения `connect` с другими HOC):

/**
 * Target component
 */
…
export default withLoader('data')(MusicGrid);

/**
 * @desc "withLoader" HOC
 */
const withLoader = targetProp => WrappedComponent => props => (
  props[targetProp]
    ? <WrappedComponent {...props} />
    : <Loader /> // or null
);
Ответ написан
Комментировать
pterodaktil
@pterodaktil
js developer
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы