Поскольку недавно у компании было требование, чтобы параметры нашего запроса на получение отображались непосредственно в URL-адресе браузера, мы можем напрямую отображать соответствующие данные интерфейса, скопировав URL-адрес.
Введение
Поскольку наши часто используемые http-запросы обычно основаны на реализации объектов XHR или реализациях выборки, эта операция запроса не вызывает изменение URL-адреса браузера, поэтому, хотя данные могут быть запрошены и отображены на странице в обычном режиме, если пользователь работает на текущей странице Когда получен запрос на получение и получен определенный фрагмент данных, и вы хотите поделиться просматриваемым в данный момент интерфейсом с другими через ссылку, URL-адрес браузера в это время не изменится, и вы можете получить доступ только к интерфейс инициализации данных через ссылку не может достичь желаемого эффекта. Как показано ниже:
(При простом использовании ajax или fetch для реализации запроса на получение) Когда мы переключаем список на вторую страницу на этой странице, URL-адрес браузера не меняется, поэтому копирование ссылки другим пользователям для ее открытия не приведет к переключению результата списка на вторую страницу, а повторной его инициализации.Процесс реализации
С учетом вышеизложенного фона и вопросов мы можем подумать о том, как этого можно достичь? Моей первой реакцией было использовать для этого API местоположения, мы можем использовать location.search для чтения и записи параметров запроса браузера:
location.search = '?page=2';
Хотя этот код может изменить URL-адрес браузера, как показано ниже:
Но будет проблема с производительностью, то есть, когда мы выполним приведенный выше код, будет обновлен весь браузер, в результате чего часть, которую мы не хотим обновлять, также будет обновлена, поэтому есть ли способ сделать это частично обновился? Ответ должен быть.Вот основная мысль нашей статьи:history API.
history API
Window.history — это свойство только для чтения, используемое для получения ссылки на объект History, который предоставляет интерфейс для управления историей сеансов браузера (страницы, посещенные в адресной строке браузера, и страницы, загруженные через фреймворк на текущей странице). В HTML5 появились методы history.pushState() и history.replaceState(), которые соответственно добавляют и изменяют записи истории.
Используйте history.pushState() для изменения реферера, который используется в заголовке HTTP, когда пользователь отправляет запрос XMLHttpRequest, и реферер объекта XMLHttpRequest, созданного после изменения состояния, будет изменен. Поскольку реферер — это URL-адрес, который идентифицирует документ в объекте окна, представленном this, при создании объекта XMLHttpRequest.
Затем мы можем использовать pushState для реализации нашей функции обновления URL-адреса браузера.
Метод pushState()
pushState() принимает три аргумента: объект состояния, заголовок (пока игнорируется) и (необязательно) URL:
- государственный объект— Состояние объекта состояния — это объект JavaScript, который создает новые записи в истории с помощью pushState(). Всякий раз, когда пользователь переходит к новому состоянию, запускается событие popstate, а свойство состояния этого события содержит копию объекта состояния записи истории.
- заглавие— Firefox в настоящее время игнорирует этот параметр, но может использовать его в будущем. Передача здесь пустой строки должна обезопасить от будущих изменений этого метода. Кроме того, вы можете передать короткий заголовок для состояния перехода.
- URL— Этот параметр определяет новую историческую запись URL. Обратите внимание, что браузер не загружает этот URL-адрес сразу после вызова pushState() , но может загружать URL-адрес позже при определенных обстоятельствах, например, когда пользователь повторно открывает браузер. Новый URL-адрес не обязательно должен быть абсолютным путем. Если новый URL-адрес является относительным, он будет рассматриваться как относительный к текущему URL-адресу. Новый URL-адрес должен иметь то же происхождение, что и текущий URL-адрес, иначе pushState() вызовет исключение. Этот параметр является необязательным и по умолчанию соответствует текущему URL-адресу.
выполнить
/**
* 设置浏览器url
* params:queryObj(参数对象)
*/
function setBrowserUrl(queryObj){
// stringify是queryString的一个api,具体可以查看node官网,也可以自己实现
var url = `${location.pathname}?${stringify(queryObj)}`
history.pushState({url: url}, '', url)
}
Таким образом, мы можем вызвать метод setBrowserUrl для изменения URL-адреса браузера одновременно с запросом. Далее мы можем отслеживать изменения url браузера, если url браузера имеет требуемые параметры запроса, то мы будем запрашивать данные согласно параметрам запроса, а если нет, то будем инициализировать страницу, чтобы при просмотре записи или маленький секрет, я хочу сохранить данные и поделиться ими с другими, можно ли этого добиться?
Суммировать
На основе истории H5 можно реализовать множество элегантных инструментов, таких как маршрутизация, управление кешем и так далее. Если вы хотите узнать больше о интерфейсных знаниях и практике, таких как webpack, gulp, css3, javascript, nodeJS, canvas и т. д., присоединяйтесь к нам в общедоступной учетной записи «Интересный интерфейс», чтобы учиться и обсуждать вместе и исследуйте границы интерфейса вместе.
больше рекомендаций
- Борьба с конфигурацией и использованием накопительного инструмента для упаковки внешних компонентов/библиотек
- Картинка, чтобы научить вас быстро играть в vue-cli3
- Vue advanced advanced series — играйте с vue и vuex с машинописным текстом
- Быстро осваивайте новые функции es6+ и основной перечень грамматики es6
- Реализовать проект полного стека CMS от 0 до 1 на основе nodeJS (включено)
- Реализовать проект полного стека CMS от 0 до 1 на основе nodeJS (средний)
- Реализовать проект полного стека CMS от 0 до 1 на основе nodeJS (ниже)
- Сведения о запуске на стороне сервера для реализации проекта полного стека CMS от 0 до 1 на основе nodeJS
- Использование Angular8 и API карты Baidu для разработки «списка туров»
- Краткое изложение основных знаний по теме "Продвинутое программирование на JavaScript"
- Используйте css3, чтобы реализовать фоновую анимацию потрясающего интервьюера (расширенный исходный код)
- 5 минут, чтобы научить вас писать фиктивный сервер данных с помощью nodeJS
- Научу вас использовать 200 строк кода, чтобы написать любовную мини-игру Dou Pin Le H5 (с исходным кодом)