2017-04-11 4 views
1

Je suis nouveau dans reactjs et réagis la table de bootstrap. Je veux ajouter rea-chargement dans mon composant de réaction avant que les données montrent. parce que les données montrent si longtemps. mais ne fonctionne pas.comment ajouter le chargement de réaction dans la table d'amorçage de réaction

ceci est mon code

import React, { Component } from 'react'; 
import { BootstrapTable, TableHeaderColumn } from 'react-bootstrap-table'; 
import PageHeader from 'react-bootstrap/lib/PageHeader'; 
import database from './database'; 
import root from 'window-or-global'; 
import Loading from 'react-loading'; 

class User extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     text:'', 
     products: [] 
    }; 

    this.userRef = database.ref('users'); 
    } 

    componentDidMount() { 
    this.userRef.on('value', this.gotData, this.errData); 
    } 


    gotData = (data) => { 
    let newProducts = [] 
    const userdata = data.val(); 
    const keys = Object.keys(userdata); 
    for (let i = 0; i < keys.length; i++) { 
     const k = keys[i]; 
     newProducts.push({ 
     name: userdata[k].nama, address: userdata[k].address, email: userdata[k].email 
     }); 
    } 
    this.setState({products : newProducts}); 
    } 

    errData = (err) => { 
    console.log(err); 
} 

    handleClick = (rowKey) => { 
    alert(this.refs.table.getPageByRowKey(rowKey)); 
    } 

    render() { 
    return (
     <div> 
     <Loading type ='spinning-bubbles' color='#e3e3e3' /> 
      <div className="col-lg-12"> 
      <PageHeader>Members</PageHeader> 
     </div> 
     <BootstrapTable 
       ref='table' 
      data={ this.state.products } 
      pagination={ true } 
      search={ true }> 
      <TableHeaderColumn dataField='name' isKey={true} dataSort={true}>Name</TableHeaderColumn> 
      <TableHeaderColumn dataField='address' dataSort={true}>Address</TableHeaderColumn> 
      <TableHeaderColumn dataField='email'>Email</TableHeaderColumn> 
      </BootstrapTable> 
     </div> 
    ); 
    } 
} 

export default User; 

Meilleurs voeux! Souhait de répondre.

Répondre

4

Pour cela, tout d'abord maintenir une bool à state variable qui DÉPISTEREZ si les données récupérées ou non, la valeur initiale de cette bool seront false.

constructor(){ 
    super(); 
    this.state = { 
     isDataFetched: false, 
    } 
} 

Maintenant, il y a une propriété de React-Bootstrap-Table, option qui est utilisé pour définir les valeurs par défaut et personnaliser l'noDataText, vous pouvez l'utiliser, comme ceci:

<BootstrapTable 
    .... 
    options={tableOtions}> 
</BootstrapTable> 

définissent maintenant ce tableOtionsobject et modifier la propriété noDataText, comme ceci:

let tableOtions = { 
    noDataText: this._setTableOption(), 
}; 

Si les données sont fet Ched avec succès puis return du texte, qui sera affiché si les données seront vides, sinon retourner un chargeur:

_setTableOption(){ 
    if(this.state.isDataFetched){ 
      return "No expenses found"; 
     }else{ 
      return(
       <RefreshIndicator size={40} left={0} top={0} status="loading" style={{position: 'relative', margin: '0px auto'}}/> 
      ); 
     } 
} 

Remarque: J'ai utilisé un Material-UI RefreshIndicator, vous pouvez le remplacer par un autre chargeur aussi.

Référence de option objet React Bootstrap Table: http://allenfang.github.io/react-bootstrap-table/docs.html#noDataText

Mise à jour: Utilisez ce code, et remplacer le RefreshIndicator par Loader que vous voulez afficher:

import React, { Component } from 'react'; 
import { BootstrapTable, TableHeaderColumn } from 'react-bootstrap-table'; 
import PageHeader from 'react-bootstrap/lib/PageHeader'; 
import database from './database'; 
import root from 'window-or-global'; 
import Loading from 'react-loading'; 

class User extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     text:'', 
     products: [], 
     isDataFetched: false, 
    }; 
    this.userRef = database.ref('users'); 
    } 

    componentDidMount() { 
    this.userRef.on('value', this.gotData, this.errData); 
    } 


    gotData = (data) => { 
    let newProducts = [] 
    const userdata = data.val(); 
    const keys = Object.keys(userdata); 
    for (let i = 0; i < keys.length; i++) { 
     const k = keys[i]; 
     newProducts.push({ 
     name: userdata[k].nama, address: userdata[k].address, email: userdata[k].email 
     }); 
    } 
    this.setState({products : newProducts, isDataFetched: true}); 
    } 

    errData = (err) => { 
    console.log(err); 
    } 

    handleClick = (rowKey) => { 
    alert(this.refs.table.getPageByRowKey(rowKey)); 
    } 

    _setTableOption(){ 
    if(this.state.isDataFetched){ 
     return "No expenses found"; 
    }else{ 
     return(
     <RefreshIndicator size={40} left={0} top={0} status="loading" style={{position: 'relative', margin: '0px auto'}}/> 
    ); 
    } 
    } 

    render() { 

    let tableOtions = { 
     noDataText: this._setTableOption(), 
    }; 

    return (
     <div> 
     <Loading type ='spinning-bubbles' color='#e3e3e3' /> 
     <div className="col-lg-12"> 
      <PageHeader>Members</PageHeader> 
     </div> 
     <BootstrapTable 
      ref='table' 
      data={ this.state.products } 
      pagination={ true } 
      search={ true } 
      options={tableOtions}> 
     > 
      <TableHeaderColumn dataField='name' isKey={true} dataSort={true}>Name</TableHeaderColumn> 
      <TableHeaderColumn dataField='address' dataSort={true}>Address</TableHeaderColumn> 
      <TableHeaderColumn dataField='email'>Email</TableHeaderColumn> 
     </BootstrapTable> 
     </div> 
    ); 
    } 
} 

export default User; 
+0

s'il vous plaît me dire où le code doit être placé .. :-(@Mayank Shukla – Queen

+0

vérifier la réponse mise à jour, utilisez le même code, il suffit de remplacer la partie chargeur, ça va fonctionner :) –

+0

merci beaucoup .. :-) @Mayank Shukla – Queen