#reactjs #react-router
Вопрос:
Есть запись в блоге /post/public/:postId
, которая является общедоступной. На этой же странице есть кнопка редактирования, которая переходит на /edit/:postId
страницу, где пользователь может изменить конфиденциальность публикации с общедоступной на частную.
После изменения сообщения с публичного на частное предыдущий URL /post/public/:postId
-адрес становится недействительным, и /post/private/:postId
мы можем видеть это сообщение по новому URL-адресу.
Но на странице редактирования, после изменения конфиденциальности (которая изменяет URL-адрес публикации), нажмите кнопку «Отмена this.props.history.goBack()
«, чтобы вернуться к общедоступному URL-адресу, который теперь недействителен, следовательно, результат 404.
Есть ли способ обновить goBack()
URL-адрес в зависимости от того, изменяет ли пользователь конфиденциальность? Я хочу, чтобы пользователи переходили по обновленному URL-адресу, когда конфиденциальность меняется с общедоступной на частную и наоборот.
P. s.: this.props.history.push()
или this.props.history.replace()
может временно устранить проблему, но если пользователь нажмет кнопку «Назад» браузера по умолчанию, он все равно вернется на недопустимую страницу.
Спасибо!
Ответ №1:
Я думаю, что это более логичный вопрос. Когда пользователь находится на общедоступной странице публикации и переходит для редактирования публикации, сделайте перенаправление здесь на путь редактирования.
A
-> >"/post/public/:postId"
-> «редактировать» ->>replace("/edit/:postId")
A
->"/edit/:postId"
Теперь они могут переключать публичный/закрытый режим публикации, и если/когда они выполнят обратную навигацию, они вернутся на страницу, на которой они были ранее, т. Е. A
Выше.
A
-> >"/edit/:postId"
-> «отмена» ->>goBack()
A
Если пользователь завершит и, предположительно, сохранит (или зафиксирует) редактирование, затем снова перенаправьте на правильный частный/общедоступный путь.
A
-> >"/edit/:postId"
-> «сохранить» ->>replace("/post/private/:postId")
A
->"/post/private/:postId"
Идея здесь состоит в том, чтобы сохранить стек истории действительным, не сохраняя потенциально «устаревшие» пути в истории.
Комментарии:
1. Просто хотел добавить один момент, когда пользователь нажимает кнопку «Отмена», он напрямую переходит на
A
страницу, и еслиA
это коллекция или список сообщений в блоге, то другой задачей будет поддерживать положение прокрутки или разбиение на страницы и т. Д.2. @Mitanshu Если вы спрашиваете, то да, это было бы то, что вы хотели бы сохранить, чтобы его можно было восстановить при переходе назад. Если вы просто информируете, да, звучит неплохо. 😀
Ответ №2:
const [ locationKeys, setLocationKeys ] = useState([])
const history = useHistory()
useEffect(() => {
return history.listen(location => {
if (history.action === 'PUSH') {
setLocationKeys([ location.key ])
}
if (history.action === 'POP') {
if (locationKeys[1] === location.key) {
setLocationKeys(([ _, ...keys ]) => keys)
// Handle forward event
} else {
setLocationKeys((keys) => [ location.key, ...keys ])
// Handle back event
}
}
})}, [ locationKeys, ])
Это может вам помочь!