connect () Компоненты с глубоким подключением, зависящие от компонентов с верхним подключением - PullRequest
0 голосов
/ 26 апреля 2018

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

Как воспроизвести tehaviour

Допустим, у нас есть контейнерный компонент CatContainer, он отображает своих потомков, если свойство cat присутствует в состоянии. «кошки» в состоянии это объект типа cats = { snowy: { height: 5, width: 10, weight: 50 }, muschi: { height: 1, width: 12, weight: 20 } }.

Для каждого кота в объекте cat, CatContainer отображает компонент Cat, передавая имя Cat.

Компонент Cat подключается к состоянию и вытаскивает конкретного кота из объекта состояния cat.

Если я теперь удаляю кошку из состояния кошек, компонент Cat по-прежнему получает имя кошки сверху, но кошка больше не присутствует в состоянии, что приводит к исключению.

Я ожидал бы, что CatContainer детерминистически рендерит перед компонентом Cat нисходящим образом.

Однако, похоже, этого не происходит, что приводит к неопределенному поведению.

Возможные решения, которые я пробовал

  • Проверка безопасности в компоненте Cat aka "muschi in cats". Это работает, но это означает, что мне нужно переписать огромные части приложения, которых я бы хотел избежать любой ценой.
  • Ищите способ сделать состояние распространения connect () в соответствии с уровнем вложенности

Я нашел вопрос в Google и нашел следующее:

  1. https://github.com/reactjs/react-redux/issues/509 - Указывает, что> v5, который я использую, каким-то образом может сделать изменения в режиме распространения-редукса распространяющимися сверху вниз, что решило бы проблему с кошкой.
  2. Как React перерисовывает дерево, если родительский и дочерний компоненты зависят от одной подпорки хранилища Redux? - По сути, спрашивает то же, что и я здесь.

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

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

  1. Оберните соединение и сделайте так, чтобы оно принимало контексты nestingLevel и renderedNestingLevel prop
  2. Увеличивать "nestingLevel" и передавать "renderedNestingLevel" после обновления компонента-оболочки компонента
  3. Блок визуализируется в функции shouldComponentUpdate() упаковочной оболочки до nestingLevel === renderedNestingLevel-1.

С уважением

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