Передача отфильтрованного значения в react render()

#javascript #reactjs #es5-shim

#javascript #reactjs #es5-shim

Вопрос:

Я использую react-datagrid для представления моей таблицы documents, но я не могу понять, как создать экземпляр области render() с полными данными. Он всегда создается без данных.

это моя сетка данных

 'use strict';

 var React    = require('react')
 var DataGrid = require('react-datagrid')


 var columns = [
     { name: 'id', title: '#', width: 50 },
     { name: 'business_id', flex: 1 },
     { name: 'lastName'  },
     { name: 'city', flex: 1 },
     { name: 'country', flex: 1 },
     { name: 'email', width: 200 }
  ]

  var App = React.createClass({

    initData: function(documents){
        if(documents){
            return documents;
        } else {
            console.log('documents: '  this.props.documents);
            return this.props.documents;
        }
    },
    getInitialState: function(){
        return {
            dataSource: [],
        }
    },
    componentDidMount() {
        this.setState({
            dataSource: this.initData()
        })
    },
    render: function(){
      console.log('this.props.documents: '  this.props.documents)
      return <DataGrid
        idProperty='id'
        dataSource={this.initData()}
        columns={columns}
        style={{height: 400}}

        onFilter={this.handleFilter}
        liveFilter={true} //to apply the filter while typing
     />
    },

   handleFilter: function(column, value, allFilterValues){
    //reset data to original data-array
    var data = this.initData()

    //go over all filters and apply them
    Object.keys(allFilterValues).forEach(function(name){
        var columnFilter = (allFilterValues[name]   '').toUpperCase()

        if (columnFilter == ''){
            return
        }

        data = data.filter(function(item){
            if ((item[name]   '').toUpperCase().indexOf(columnFilter) === 0){
                return true
            }
        })

      })
      this.initData(data)
      this.setState({})
    }
   })
  

первый журнал консоли не возвращает ничего

документы:

консольный журнал в render() возвращает данные

this.props.documents:[объект Object],[объект object],[объект object],[объект object],[объект object]

и вот как я вызываю свой компонент datagrid из моего домашнего компонента

 <DocumentReactNewGrid documents={this.state.documents}/>
  

Ответ №1:

Создайте источник данных как state . В filter установите для новых данных значение state . Это приведет к повторному рендерингу компонента с новыми данными.

 'use strict';

 var React    = require('react')
 var DataGrid = require('react-datagrid')


var columns = [
   { name: 'id', title: '#', width: 50 },
   { name: 'business_id', flex: 1 },
   { name: 'lastName'  },
   { name: 'city', flex: 1 },
   { name: 'country', flex: 1 },
   { name: 'email', width: 200 }
]

var App = React.createClass({
  initData: function(documents){
    if(documents){
        return documents;
    } else {
        return this.props.documents;
    }
   },
  getInitialState: function(){
    return { 
      dataSource: this.initData(),
    }
  },
  componentWillReceiveProps(nextProps) {
    this.setState({
     dataSource: nextProps.documents,
    })
  },
  render: function(){
    return <DataGrid
        idProperty='id'
        dataSource={this.state.dataSource}
        columns={columns}
        style={{height: 400}}

        onFilter={this.handleFilter}
        liveFilter={true} //to apply the filter while typing
    />
   },


   handleFilter: function(column, value, allFilterValues){
    //reset data to original data-array
    var data = this.initData()

    //go over all filters and apply them
    Object.keys(allFilterValues).forEach(function(name){
        var columnFilter = (allFilterValues[name]   '').toUpperCase()

        if (columnFilter == ''){
            return
        }

        data = data.filter(function(item){
            if ((item[name]   '').toUpperCase().indexOf(columnFilter) === 0){
                return true
            }
        })

      })
      this.setState({
        dataSource: data
      })
    }
   })
  

Надеюсь, это поможет!

Комментарии:

1. черт возьми, это работает только тогда, когда я фильтрую данные и вызываю handleFilter , но сначала datagrid инициализируется пустым, я не понимаю почему.

2. @kyserslick обновил код. Вам нужно переместить initData() выше getInitialState() . Надеюсь, это сработает!

3. это не исправляет проблему, initData () по-прежнему ничего не возвращает при первой загрузке DataGrid

4. Обновлен ответ! Проверьте сейчас … попробуйте поместить console.log (this.props.documents) в render и проверьте, получаете ли вы реквизиты. Если нет, вам нужно это проверить!

5. Я обновил свой вопрос вашим кодом, по-прежнему создавая пустой экземпляр