2016-11-17 24 views
0

マウントライフサイクルで動作するローダープラグインが多数ありましたが、アップデートの部分はありませんでした。私はまたしてもworser働いていたウィル方法..を使用しようとしたReactJS子コンポーネントのローダーを表示する

class Childextends React.Component { 

constructor() { 
    super(); 
    this.state = {results:[]}; 
    this.calculate = this.calculate.bind(this); 
} 

calculate(dict) { 
     this.props.showLoader(); 

     Actions.action(dict) 
      .then(results => { 
      this.setState({results: results}); 
      }) 
      .catch((err) => { 
       var errResp = JSON.parse(err.response); 
       console.log(errResp); 
       this.setState({responseErrors: errResp}); 
     }); 
} 
componentDidMount() { 
    this.props.hideLoader(); 
} 
componentDidUpdate() { 
    this.props.hideLoader(); 
} 

componentWillReceiveProps(values){ 
    this.setState({results:values.results}); 
} 

render() { 
     return (
      /*stuff to be returned*/ 
     ) 
} 
} 

class App extends React.Component { 
    constructor() { 
     super() 
     this.state = {loader_wrap:false}; 
     this.hideLoader = this.hideLoader.bind(this); 
     this.showLoader = this.showLoader.bind(this); 
    } 

hideLoader(){ 
    this.setState({loader_wrap: false}); 
} 

showLoader() { 
    this.setState({loader_wrap: true}); 
} 

render() { 
    var loaderStyle; 
    if (this.state.loader_wrap) { 
    loaderStyle = {display:"block"}; 
    } else { 
     loaderStyle = {display:"none"}; 
    } 

return (
     <div> 
     <div id="content"> 
      {React.cloneElement(content, { 
       hideLoader: this.hideLoader, 
       showLoader: this.showLoader 
       })} 
     </div> 
      <div id="loader-wrap" style={loaderStyle}> 
       <img className="loader hidden-sm hidden-xs" src='source/file/'> 
      </div> 
     </div> 
) 
} 
} 

そして、これは、メソッドを呼び出す子である:私が試した何

は、親のためのセットアップ以下の通りでした:D これを実装する方法はありますか?私はフラックスと反応しますが、今の場合はこの使用方法はありません。

答えて

1

アクションの約束のコールバックでhideLoader()を呼び出すだけではどうですか?

class Childextends React.Component { 

    constructor() { 
    super(); 
    this.state = {results:[]}; 
    this.calculate = this.calculate.bind(this); 
} 

calculate(dict) { 
    this.props.showLoader(); 

    Actions.action(dict) 
     .then(results => { 
     this.setState({results: results}); 
     }) 
     .catch((err) => { 
      var errResp = JSON.parse(err.response); 
      console.log(errResp); 
      this.setState({responseErrors: errResp}); 
     }) 
     .then(() => {    
     this.props.hideLoader(); 
     }); 

} 

render() { 
    return (
     /*stuff to be returned*/ 
    ) 
    } 
} 

編集:だけでなく親コンポーネントへの異なるアプローチ - それは必要とされない場合、むしろスタイルを持つ要素を隠すよりも、それをレンダリングされません。

render() { 
    return (
    <div> 
    <div id="content"> 
     {React.cloneElement(content, { 
      hideLoader: this.hideLoader, 
      showLoader: this.showLoader 
      })} 
    </div> 

    {this.state.loader_wrap && 
     <div id="loader-wrap" style={loaderStyle}> 
      <img className="loader hidden-sm hidden-xs" src='source/file/'> 
     </div> 
    } 
    </div> 
) 
} 
+0

良い点。しかし、それはまだ動作しません。変わったのは、私もテキスト変数を使用し、hide/showLoaderに基づいてその値を変更したときです。私はテキストが変わってもスタイルは変わるのを見ることができませんでした...この動作は私のバージョンとあなたのバージョンにあります。 編集:ローダーは常に非表示のままで表示されることはありません。 – Stefan

+0

私は自分の答えを編集しました –

+0

私はこれまで同様の試みをしましたが、罰金があります。要求があったときに状態が直ちに再レンダリングされないため、再レンダリングを約束します。わかりませんが、それは私にはそういうものを読んでいるようです。その論理では、計算機能でsetState loadeが見えるかどうかです。 JSはアクションを実行し、サーバーからデータを取得し、同期要求は再レンダリングを保留に設定し、その後はsetStateをローダーに表示して結果を表示します。だから、ローダーは決して現れませんか?多分?彼はまだdoesnt。まだ努力のおかげで – Stefan

関連する問題