Поскольку вы используете компонент реакции-маршрутизатора Switch
, который отображает только первое совпадение, при переключении с маршрута a на b , a демонтируется; это отбрасывает все его состояние, поэтому если вы переключитесь обратно на a , у вас будет совершенно новый компонент, который получит начальное значение, которое вы указали для его состояния (например, false
для Cat
color
) , Нажатие на NavLink
, которое не меняет визуализированный Route
, оставляет тот же элемент на месте и не влияет на его состояние.
Если вы хотите изменить состояние, когда вы нажимаете на NavLink
, то вам нужно сделать это явно.
Есть два основных способа сделать это:
- поднять состояние до родительского и явно изменить его по клику по ссылке
- изменить ключ элемента для принудительного перемонтирования
- обеспечивает механизм для родителя, чтобы достигнуть ребенка и сказать ему, чтобы сбросить его состояние
Вот модифицированная версия вашей песочницы, которая демонстрирует все это:
![Edit react-remount-route](https://codesandbox.io/static/img/play-codesandbox.svg)
Cat
демонстрирует первый подход.
Я переместил состояние с Cat
до PetShop
(Cat теперь использует только реквизит). Я также добавил onClick
к NavLink
для кота, который возвращает состояние false
.
Dog
демонстрирует второй подход.
Этот подход будет лучше работать в более сложном сценарии, когда компонент имеет множество своего собственного состояния, и вы хотите, чтобы все было сброшено, если вы снова нажмете на ссылку.
Bunny
демонстрирует третий подход.
Это похоже на свойство ключа для примера Dog, но не вызывает перемонтажа. Bunny
просто использует resetIndex
в эффекте, чтобы Bunny
сам себя сбросил. Есть, вероятно, несколько технических подходов для этого. Вы просто хотите, чтобы ребенок дал сигнал сбросить себя.