Причина, по которой это не работает, когда вы обновляете sh страницу, заключается в том, что photo
, который вы передали в качестве параметра во время навигации, больше не доступен. Но pathname
- это то, что все еще доступно (потому что это часть самого URL-адреса)
Итак, на странице ModalWrapper
вы можете проверить, отсутствует ли photo
, а затем выполнить новый вызов API чтобы получить photo
на основе id
, доступного в pathname
. Я никогда не использовал unspla sh API, но думаю, что это будет этот API .
Ваш ModalWrapper
будет выглядеть так
function ModalWrapper() {
const history = useHistory();
const location = useLocation();
const [photo, setPhoto] = useState(location.state);
useEffect(() => {
if (location.pathname && !location.state) {
// call the new API here using pathname (photo ID) and setPhoto
console.log(location.pathname);
}
}, [location]);
function downloadImage() {}
function close() {
history.push("/");
}
return (
!!photo && (
<Modal isOpen={true} onRequestClose={close} style={customStyles}>
<img src={photo.urls.small} alt="" />
<div>
<button onClick={close} className="button">
Close
</button>
<button onClick={downloadImage()}>Download</button>
</div>
</Modal>
)
);
}
Вы не спрашивали об этом, но я бы также переместил Router
и Route
за пределы ListItem
и оставил бы их в App.js
(обернув все внутри маршрутизатором). Хранить его в ListItem
- все равно что иметь маршрутизатор и маршрут для каждого элемента списка, а это не то, что вы в идеале хотели бы. Вы хотели бы сохранить один маршрутизатор и маршрут через приложение, и он обычно принадлежит App.js
, оболочке или сортировкам. Вот коды и ящик после таких изменений