react-table Редактируемый контент + сортировка; редактируемая ячейка не обновляется?

При изменении данных в одном столбце, которое повлияет на порядок сортировки, данные повторно сортируются правильно, но используемые входные данные не обновляются до данных новых строк.

Проще всего воспроизвести здесь https://codesandbox.io/s/kky34kkwr

  1. Введите 99 в столбец 2 "возраст", строка 3
  2. Нажмите вкладку
  3. Обратите внимание, что верхняя строка теперь является строкой, которую мы редактировали, age=99, full=198.

Здесь мы должны увидеть, что строка, которую мы ввели 99, перемещается в начало таблицы (как это и происходит), а новая строка, заменяющая предыдущую позицию строки, которую мы отредактировали, должна иметь данные, связанные с этой новой строкой (не 99).

Кажется, я не могу найти способ заставить это обновиться или даже взломать, чтобы добиться того, чего я хочу, нецелесообразными способами. Надеясь, что кто-то может помочь!

РЕДАКТИРОВАТЬ: На этом изображении показан дисплей сразу после шага 2 приведенных выше инструкций. В строке 3 все еще есть 99 во втором столбце


person JCro    schedule 20.08.2018    source источник


Ответы (2)


Для тех, кто борется с этим, пока мы ждем исправления, я нашел обходной путь.

Учитывая пример в исходном вопросе, замена renderEditable на следующее будет действовать правильно:

renderEditable(cellInfo) {
  return (
    <div
      style={{ backgroundColor: "#fafafa" }}
      contentEditable
      suppressContentEditableWarning
      onBlur={e => {
        const data = [...this.state.data];
        data[cellInfo.index][cellInfo.column.id] = e.target.innerHTML;
        data[cellInfo.index].full = data[cellInfo.index].age * 2;
        e.target.innerHTML = this.state.data[cellInfo.index][cellInfo.column.id];
        this.setState({ data });
      }}
    >{this.state.data[cellInfo.index][cellInfo.column.id]}</div>
  );
}

Событие onBlur срабатывает до того, как таблица пересортирует себя, поэтому, если мы просто возьмем значение, отложим его в сторону и сбросим innerHTML на исходное значение перед запуском курорта с setState, мы получим правильные отображаемые значения. Это не идеально, но это работает. Не забудьте подтвердить ввод.

person JCro    schedule 20.08.2018

Проблема в том, что вы являетесь hot-calculating значением full вашей таблицы и сортируете свою таблицу на основе этого атрибута full. Для решения вашей проблемы вы можете

1) Не сортировать таблицу по full.

как это

defaultSorted={[
  {
    id: "firstName",
    desc: true
  }
]}

2) Избегайте горячего вычисления вашего full и вычисляйте его только один раз в своем конструкторе.

Что-то вроде этого

this.state = {
  data: makeData().map(item => ({ ...item, full: item.age * 2 }))
};

и ваш заголовок, как это

{
  Header: "full",
  id: "full",
  accessor: "full",
}
person Prasanna    schedule 20.08.2018
comment
Я обновил коды и поле, чтобы отразить то, что вы предлагаете, так лучше подчеркивает проблему. Конечно, простое отсутствие сортировки позволит избежать проблемы (или запретить редактирование данных), но это не решает ее, и, к сожалению, вариант использования требует сортировки по вычисляемому столбцу. - person JCro; 20.08.2018
comment
Я не понимаю, что вам на самом деле нужно! Скажем, я редактирую третью строку -> Это должно изменить как возраст, так и полное, да? Если оба изменятся, он сам прибегнет к тому, чтобы то, что мы только что отредактировали, попало в самый верх таблицы. В этом случае все остальное остается в том же порядке. За исключением строки, которую мы отредактировали не по курсу. Итак, каковы фактические требования, которые вам нужны? - person Prasanna; 20.08.2018
comment
Да, это правильно, он пересортируется правильно, но введенный вами ввод не обновляется, чтобы содержать данные, переданные в реквизите value. Таким образом, мы получаем первую строку с age=99 И ячейку age третьей строки, по-прежнему отображающую 99, когда она должна содержать данные из новой записи, которая сейчас занимает третье место в порядке. - person JCro; 20.08.2018
comment
Похоже, есть ошибка с редактируемой таблицей реакций при использовании с сортировкой по умолчанию. Вы можете сообщить об этом разработчикам в Git - person Prasanna; 20.08.2018
comment
Да, недавно поднял вопрос github.com/react-tools/react- table/issues/1096 - Я надеялся, что у кого-то может быть умный способ обновить его методом грубой силы или какой-то обходной путь. Спасибо за попытку! - person JCro; 20.08.2018