Есть ли способ отключить функцию имени вложенного поля в окончательной форме ответа? - PullRequest
1 голос
/ 06 июня 2019

Пожалуйста, посмотрите документы окончательной формы здесь

Я работаю над формой, которая, очевидно, основана на реакции окончательной формы. В компоненте формы я выбираю данные с сервера API, а тело ответа содержит что-то вроде следующего:

{
  "configs": {
    "name": "abc",
    "display.name": "Abc",
    "value": 12,
    "read.only": true
  }
}

Как мы видим, в configs есть четыре разные пары ключ / значение. В окончательной форме реагирования могут отображаться такие значения, как name и value, но не такие значения, как display.name и read.only, поскольку в их ключе есть точка -> ..

Я знаю, что могу изменить эти точки (.) на что-то вроде подчеркивания, и это сработает. Но проблема в том, что наши разработчики бэкэнда говорят, что использование точек (.) для разделения имен ключей очень распространено в бэкэнде, поэтому замена точек другими разделителями не будет возможной.

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

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Поскольку вы заблокированы как жестким задним числом, так и вложенной нотацией с точечной клавишей Final Form, если вы не можете изменить один из этих двух параметров, я думаю, что замена точек подчеркиванием по-прежнему остается самым простым решением. Это на самом деле не о самом кодировании, так как в основном есть 3 случая:

  • Избавление от Final Form и поиск новой, это может быть дорогостоящим, особенно если у вас есть несколько разработчиков, работающих над этим проектом. Стоимость изучения нового синтаксиса, сложность обработки нового граничного случая не стоит ИМО.
  • Написание собственного представления из вашего бэкэнда. Вы можете попросить своего бэкэнд-разработчика разработать собственный набор видов для форм, чтобы они могли внутренне хранить свои точечные обозначения. Обычно это плохая идея, поскольку она может легко создать технический долг, когда команда разработчиков не знает, почему существует конкретный метод.
  • Лучше всего то, что ты сделал. Поскольку веб-интерфейсу требуется специальный формат ответа, его необходимо адаптировать к тому, что отправляет серверная часть, и, следовательно, создать пользовательскую функцию промежуточного программного обеспечения, которую вы применяете к каждому входящему ответу, например:
const JSONMiddleware = input => ( 
  Object.entries(input).reduce((ac, cv) => {
    const newKey = cv[0].replace('.', '_')
    ac[newKey] = cv[1]

    return ac
  }, {})
)

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

1 голос
/ 11 июня 2019

Я думаю, что ответ в том, что Final Form просто не поддерживает ключи с точками.Финальная форма нуждается в некотором способе узнать, когда идти на уровень глубже в объект значений формы.

Единственное решение, которое я мог бы себе представить, это как-то сказать Final Form использовать другой символ (аналогично тому, как вы можете выбрать другой символ-разделитель при выполнении поиска и замены вVIM) как «точка».Таким образом, вы можете назвать свое отображаемое имя как <Field name="configs/display.name" delimiter="/"/>, но это выглядит как крайний крайний случай.

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

Жаль, что у меня не было хороших новостей для вас ... 101

...