Как лучше всего реализовать обратные вызовы родитель-потомок в React Navigation - PullRequest
0 голосов
/ 08 мая 2020

В приложении, над которым я работаю, у меня есть форма, которая включает «средство выбора элементов», которое нажимает на новый экран для выбора элемента (через навигатор стека, который является родительским компонентом для обоих экранов). Все, что мне действительно нужно, это чтобы «дочерний элемент» (средство выбора элементов) сообщил «родительскому элементу» (форме), какой элемент был выбран.

Кажется, есть несколько разумных способов сделать это в соответствии с React-navigation docs:

  • Используйте редуктор. Я мог бы установить выбранный элемент, используя dispatch, но это переместило бы состояние «выбранный элемент» полностью на «главный» экран. Зачем? Поскольку дочерний экран не является подвидом экрана формы, это дочерний вид навигации , который находится на один уровень выше формы. В идеале, как хорошее разделение задач, форма должна поддерживать свое собственное состояние и сообщать главному экрану только о заполненной форме / объекте. Так что это не идеальное решение.
  • Передача элемента в качестве параметра «вверх» в форму. В этом сценарии форма имеет свойство selectedItem: Item|undefined. Для меня это тоже имеет запах кода; во-первых, дочерний экран должен жестко закодировать экран формы (navigation.navigate('FormScreen', { selectedItem: item })).

Мое текущее решение - назначить onSelectItem параметр для средства выбора элементов. Мне нравится это решение, потому что оно делает дочерний экран универсальным; Я мог бы использовать его для любого «родителя», и все, что мне нужно было сделать, это передать ему элементы и обратный вызов. Но это решение выдает предупреждение о несериализуемом параметре.

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

Есть ли другое решение, которое здесь работает, или способ его использования? навигация внутри экрана формы - в моем случае это действительно сработает, потому что я не использую заголовки системной навигации, но в целом это кажется неправильным. Точно так же я мог бы использовать модальное всплывающее окно вместо того, чтобы помещать представление в стек , но это кардинально меняет пользовательский интерфейс, чего я здесь делать не хочу. Кроме того, в качестве упражнения я думаю, что, вероятно, есть лучшее решение).

Как обычно, я не ищу Решения для «сброса велосипедов» - я хочу знать, есть ли более элегантный способ для экрана ниже по стеку отправлять данные ВВЕРХ по стеку.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...