url을 매개 변수로 필터를 저장하는 것이 좋습니다.
아래 예제를 작성했습니다. 아래 함수에 대한 URL로 http://skylerfenn.com/news?order=asc&category=feature&year=2017
을 사용하겠습니다.
1 단계 : window.onpopstate
에 getParameters()
을 호출하고 매개 변수를 state에 저장하십시오. 위 URL을 사용하면 getParameters()
매개 변수가 객체 { order: 'asc', category: 'feature', year: '2017' }
으로 반환됩니다.
function getParameters() {
let parameters = window.location.search.replace('?', '');
let currentParameters = {};
if (Object.keys(parameters).length) {
parameters = parameters.split('&');
for (let i = 0; i < parameters.length; i++) {
let parameter = parameters[i].split('=');
currentParameters[parameter[0]] = parameter[1];
}
}
return currentParameters;
}
2 단계 : 다음 객체로 getNewParameters
기능에 새로운 파라미터를 전달. 예를 들어 getNewParameters({ order: 'desc', year: null })
을 호출하면 { order: 'desc', category: 'feature' }
개체가 반환됩니다. 널 (null)이기 때문에 연도가 제거됩니다.
function getNewParameters(newParameters) {
const parameters = getParameters();
const keys = Object.keys(newParameters);
for (let i = 0; i < keys.length; i++) {
const value = newParameters[keys[i]];
parameters[keys[i]] = value;
if (!value) {
delete parameters[keys[i]];
}
}
return parameters;
}
3 단계 : getNewParameters
의 결과를 사용하여 상태를 업데이트하십시오. 또한 아래 함수를 통해 결과를 전달하여 URL을 업데이트하십시오.
updateUrl(parameters) {
let search = '';
let j = 0;
let separator = '?';
Object.keys(parameters).forEach((key) => {
let value = parameters[key];
if (value) {
if (j !== 0) {
separator = '&';
}
search += `${separator}${key}=${value}`;
j++;
}
});
let newUrl = `${location.origin}${location.pathname}${search}`;
// prevents pushing same url if function won't change url.
if (location.href !== newUrl) {
history.pushState(null, null, newUrl);
}
}
당신은 필터 값을 저장하는 로컬 스토리지를 사용할 수
와 사용자가 다시 동일한 페이지에 다시 올 때 로컬 스토리지에서 저장된 값을 가져 당신이 호출하는 API에 전달 –