Как обращаться с локальным состоянием при использовании реле?

Я работаю над реагирующей/ретрансляционной системой управления контентом. Пользователи могут создавать и изменять статьи, которые хранятся на сервере. Мне было интересно, как лучше всего обрабатывать измененное состояние статьи перед ее сохранением на сервере. Я могу придумать несколько разных способов решить эту проблему:

1) Неконтролируемые входы

Я могу заполнить элементы ввода с помощью defaultValue и нигде не сохранять состояние в явном виде. DOM будет использоваться в качестве моего хранилища для измененных данных. Когда пользователь нажимает "сохранить", я собираю все поля, считываю значения и создаю мутацию.

Pro:

  • Нет обработки локальных состояний

Contra:

  • Я не могу точно знать, какие поля были изменены, и мне нужно будет отправить все данные с помощью мутации. Или понадобится дополнительная логика для создания различий
  • Невозможно обновить другие части представления в ответ на изменения состояния

2) Копировать в локальном штате:

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

Pro:

  • Локальное состояние могло изменить только поля, так что diff будет легко
  • Другие части пользовательского интерфейса могут реагировать на изменения локального состояния

Contra:

  • Это кажется своего рода анти-паттерном, потому что данные в представлении не поступают напрямую из реле. Синхронизация между локальным состоянием и ретранслятором может стать источником ошибок

3) Сервер новый локальный:

Просто создайте мутацию для каждого внесенного изменения. Использование оптимистичных обновлений также должно обеспечить хороший UX.

Pro:

  • Реле - единственный источник правды для данных
  • Состояние сохраняется на стороне сервера, поэтому создается резервная копия, если пользователь случайно закрывает браузер

Contra:

  • Для этого потребуется более сложная реализация на стороне сервера для обработки случаев, когда пользователь хочет отказаться от черновика и т.д.
  • Многие мутации вызвали

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

Я видел, что идет много дискуссий о том, как обрабатывать локальное состояние с помощью Relay, и может появиться встроенное решение с будущей версией Relay, но мне нужно решение, которое работает с текущей версией реле.

Ответ 1

Поправьте меня, если я ошибаюсь, но я полагаю, что вы объединяете две проблемы: вы обсуждаете проблему хранения локального состояния, но на самом деле вас волнует проблема противоречивых изменений, вносимых двумя людьми (например, другой человек редактирует ту же статью, которую редактирует текущий пользователь). Причина, по-моему, заключается в том, что вы говорите об изменении реквизита ретранслятора, которое произойдет только в том случае, если ваше приложение будет активно получать обновления с сервера, и есть такие обновления для получения.

Похоже, это своего рода анти-паттерн, потому что данные в представлении не поступают напрямую из ретранслятора. Синхронизация между локальным состоянием и ретранслятором может стать источником ошибок

Приложение Relay не будет постоянно синхронизироваться с сервером, если вы не сделаете это. Запрос Relay и реквизиты, которые передаются компоненту, не обновляются постоянно. Если существует вероятность возникновения конфликта, вам нужно решить эту проблему, а это не проблема ретрансляции, и то, где вы храните локальное состояние, не решит эту проблему.

Самый простой способ обработки конфликтов:

  • Используйте опцию № 2 для локального штата
  • Предоставьте каждой статье автоматически увеличивающуюся версию #, которую вы получаете при загрузке статьи для редактирования
  • Требовать мутации редактирования статьи, чтобы указать базовую версию #, на которой она работает. Сервер должен отклонить любую мутацию, у которой есть база, которая не является текущей версией. Сообщите пользователю, что есть конфликтующие изменения, они не работают в последней версии, и вы не можете позволить им сохранить.

Я работал над сложными приложениями Relay, и мы всегда опирались на # 2. Состояние Local React отличное, а контролируемые входы - отличные. Это не анти-паттерн, реле или другое.