2017-03-08 14 views
1

データを取得しているときにスピナーを表示するのに問題があります。私はstate.isLoadingを持っていますが、getdata.getPossible()関数が起動する前にそれをtrueに設定することはできません。相続人は私が持っている:データが反応しているときにスピナーを表示

class GetData extends Component { 
    constructor() { 
    super(); 
    this.state = { 
     lastdraw: {}, 
     alldraws: [], 
     bets: [], 
     isLoading: false, 
     showBets: false 
    }; 
    } 

    componentDidMount() { 
    getdata.getLastResult().then((result) => { 
     this.setState({lastdraw: result.data.drawns[0]}) 
    }) 
    } 

    getMore() { 
    this.setState({isLoading: !this.state.isLoading}) 
    this.setState({bets: getdata.getPossible(5), showBets: !this.state.showBets}) 
    } 

    render() { 
    return (
     <div> 
     <h1>{this.props.title}</h1> 
     <h3>{moment(this.state.lastdraw.date).format('LL')}</h3> 
     <div><span>{this.state.lastdraw.numbers}</span> + <span>{this.state.lastdraw.stars}</span></div> 
     <Btn onClick={this.getMore.bind(this)}>Generate</Btn> 
     {this.state.showBets ? this.state.bets.map((bet, i) => {return (<PossibleKey key={this.state.bets[i].key} bets={bet}/>)}) : null} 
     <Loader show={this.state.isLoading}/> 
     </div> 
    ); 
    } 
} 

そしてLoaderコンポーネントは、このようなものです:

function Loader(props) { 
    return props.show ? (
     <div className='overlay'> 
      <div className='leftEye'></div> 
      <div className='rightEye'></div> 
      <div className='mouth'></div> 
      <p>The Universe is aligning. Please wait...</p> 
     </div> 
    ) : null 
} 

私が達成したいどのようなことは、単に真isLoading状態を設定することにより、他の場所で使用するローダーコンポーネントのための方法でありますまたはfalse。 getMore()関数は、getPossible(n)の実行後にのみローダー状態をトリガーします。

状態が設定された後にのみローダーが小道具を受け取ることと関係していると思います。どのようにローダーをオン/オフすることができますか?

答えて

2

あなたは状態が更新された後に何かをしたい場合は - 時には問題があるgetPossible

+0

私はあなたの提案を取り、これとクリックハンドラ製: 'handleClick(){ this.setState((prevState、小道具)=>({ isloading:真 })) getdata.getPossibleを( 5).then:)(結果=> { this.setState((prevState、小道具)=>({ 賭けを})結果)} .then((完了)=> { this.setState(( prevState、props)=>({ isloading:false })) }) }です。それはうまくいっています。これは、これまでにない最も洗練されたコードではありません。そうでなければ、ローディング状態を親コンポーネントに持ち上げなければならない、あるいはそれ以上にして小道具として渡す必要があります。 – talvasconcelos

+0

すべてのコードは次のURLでご覧いただけます:https://github.com/talvasconcelos/millions – talvasconcelos

1

呼び出される前に、あなたはこれが状態isLoadingを設定する必要があり、この

getMore() { 
    this.setState({isLoading: !this.state.isLoading},() => { 
    this.setState({bets: getdata.getPossible(5), showBets: !this.state.showBets})  
    }) 
} 

のような状態メソッドへのコールバックを渡すことができますsetStateを配列決定する。試してみてください:

getMore() { 
    this.setState({isLoading: !this.state.isLoading},() => { 
     this.setState({bets: getdata.getPossible(5), showBets: !this.state.showBets}) 
    }) 
    } 
+1

Lol!私たちは同じくそったことに答えた –

+0

私はもう幸運でそれを試してみた!最初にgetPossibleを実行してからローダーをトリガーします。 – talvasconcelos

+0

@ArshabhAgarwal haah:D – NealVDV

0

これはあなたのターゲットですか?

getMore() { 
    if (!this.state.isLoading) { 
     this.setState({isLoading: !this.state.isLoading, bets: getdata.getPossible(5), showBets: !this.state.showBets}) 
    } 
    } 
+0

はい、ロード状態をtrueに設定してから、getdata.getPossibleを実行しますか? – talvasconcelos

+0

私のバージョンではあなたがisLoadingの次の状態をチェックしてから、setLoading中にgetPossibleを実行してください。そして、このようにして状態を設定する順序はあまり重要ではありません。setStateメソッドの後、すべてのデータは正しくなります。このようにgetPossible(isLoading)を実行することができます - isLoading =!this.state.isLoadingを実行してsetStateの実行前に設定します:) –

関連する問題