Собственная функция sortFable для dataTable

Я получаю сообщение об ошибке при вызове this.props.fetch() в методе mySort. this.props.mySort собирает новые данные из серверной части, отсортированные по соответствующему столбцу. Ошибка: Предупреждение: невозможно обновить во время существующего перехода состояния (например, в render). Методы рендеринга должны быть чистой функцией реквизита и состояния. this.props.fetch теперь вызывается в бесконечном цикле.

Как я могу это исправить?

С наилучшими пожеланиями, Иоахим

constructor(props) {

    super(props)
    let columns = [
        { field: "foo", header: "bar", sortable: true, sortFunction: this.mySort }
    ]
    this.state = {
        cols: columns
    }
    this.colOptions = []
    for (let col of this.state.cols) {
        this.colOptions.push({ label: ` ${col.header}`, value: col })
    }
}

mySort = (e) => {

    if (e.order === 1) {
        console.log("1")
        this.props.fetch({...)}
        } else {
...}
      }


render() {

let columnData = this.state.cols.map((col, i) => {

        return <Column className="columnheader" style={col.style} key={col.field} field={col.field}
            header={col.header} sortable={col.sortable} sortFunction={col.sortFunction} body={col.body} expander={col.expander} />
    })

return(
<DataTable value={fetchResults} >
{columnData}
</DataTable>
)
}

2 ответа

Вы не должны делать выборку из рендера, и так оно и есть, кажется, он вызывается, когда визуализируется каждый столбец, вызывая многократные обновления состояния, что приводит к бесконечному циклу

Вместо этого переместите выборку в componentDidMount, И всякий раз, когда поле сортировки изменяется, обрабатываете событие изменения, сортируете данные на стороне клиента и сбрасываете свои данные, так что вся таблица уже отсортирована и может быть отображена сразу. Если данные огромны и нуждаются в сервере для их сортировки по тем или иным причинам, снова обработайте повторное получение в событии изменения и установите все отсортированные данные в состояние за один раз.

Что-то вроде,

componentDidMount(){
  // fetch the data
}

handleSortFieldChange(){
  /* sort client side and -> setState()
  or fetch again and setState()*/
}

Я изменил sortFunction таким образом:

mySort = (e) => {
    if (e.order === 1 && e.field !== this.state.sortField) {
        this.setState({
            sortField: e.field
        },
            this.props.fetchSearchResults({
               ...
            }))
    } else if (e.order === -1 && e.field !== this.state.sortField) {
        this.setState({
            sortField: e.field
        },
            this.props.fetchSearchResults({
               ...
            }))
    }
}

Теперь бесконечного цикла нет, но ошибка остается.

Другие вопросы по тегам