用于存储 ascending/descending 订单的本地存储
Local Storage to store ascending/descending order
我的代码中有这个 'sort' 按钮,可以根据最高到最低对课程价格进行排序,反之亦然。该按钮工作得很好,我现在正在尝试进行本地存储以保留顺序(降序或升序),以便即使页面刷新,顺序也保持不变。这是我的本地存储代码:
window.addEventListener('beforeunload', () => {
localStorage.setItem('order', JSON.stringify(courses));
});
var orderList = localStorage.getItem('order');
function getCourseOrder() {
if (orderList) {
return JSON.parse(orderList);
} else {
return [];
}
}
window.onload = function() {
generateList(getCourseOrder())
}
//generateList is to create elements and append etc
问题是顺序 (descending/ascending) 仅在一次刷新时保持不变,然后在第二次刷新后 returns 变为原始顺序。我创建了一个代码笔:https://codepen.io/ShawnTan15/pen/vYxebyO
我看过你的JS代码,你只犯了一个小错误,在onload函数中你还必须修改courses
变量,所以当下一次(第二次)卸载发生时,它会选择正确的排序课程(因为您将本地课程列表设置为本地存储)而不是全局 courses
列表。
// Made it let
let courses = [
{
name: "Complete ReactJS course",
price: "2.3",
},
{
name: "Complete Angular course",
price: "2.1",
},
{
name: "Complete Mern course",
price: "2.9",
},
{
name: "Complete C++ course",
price: "2.4",
},
];
function generateList(courseList) {
const ul = document.querySelector(".list-group");
ul.innerHTML = "";
courseList.forEach((course) => {
const li = document.createElement("li");
li.classList.add("list-group-item");
const name = document.createTextNode(course.name);
li.appendChild(name);
const span = document.createElement("span");
span.classList.add("float-right");
const price = document.createTextNode("$ " + course.price);
span.appendChild(price);
li.appendChild(span);
ul.appendChild(li);
});
}
generateList(courses);
const btn = document.querySelector(".btn-success");
let activeSortingType;
let isSortingDirty = false;
btn.addEventListener("click", function () {
isSortingDirty = true;
if (activeSortingType === "asc") {
activeSortingType = "desc";
courses.sort((a, b) => b.price - a.price);
} else if (activeSortingType === "desc") {
activeSortingType = "asc";
courses.sort((a, b) => a.price - b.price);
} else if (activeSortingType === null) {
activeSortingType = "asc";
courses.sort((a, b) => a.price - b.price);
}
generateList(courses);
});
////////Local Storage////////
/////////////////////////////
window.addEventListener("beforeunload", (e) => {
localStorage.setItem("order", JSON.stringify(courses));
if (activeSortingType !== null && isSortingDirty) {
const currentSortingType = localStorage.setItem(
"activeSortingType",
activeSortingType
);
}
});
const orderList = localStorage.getItem("order");
function getCourseOrder() {
if (orderList) {
// Updating the courses list here in onload
courses = JSON.parse(orderList);
return courses;
} else {
return [];
}
}
window.onload = function () {
const courseList = getCourseOrder();
activeSortingType = localStorage.getItem("activeSortingType");
if (courseList.length) {
generateList(courseList);
}
};
我建议您不要将所有课程都保存到本地存储中,而是只保存订单:
let courses = [
{
name: "Complete ReactJS course",
price: "2.3"
},
{
name: "Complete Angular course",
price: "2.1"
},
{
name: "Complete Mern course",
price: "2.9"
},
{
name: "Complete C++ course",
price: "2.4"
}
];
function generateList() {
const ul = document.querySelector(".list-group");
ul.innerHTML = "";
courses.forEach((course) => {
const li = document.createElement("li");
li.classList.add("list-group-item");
const name = document.createTextNode(course.name);
li.appendChild(name);
const span = document.createElement("span");
span.classList.add("float-right");
const price = document.createTextNode("$ " + course.price);
span.appendChild(price);
li.appendChild(span);
ul.appendChild(li);
});
}
const btn = document.querySelector(".btn-success");
let desc = localStorage.getItem("order") == "descending";
function sortCourses() {
courses.sort((a, b) => desc ? b.price - a.price : a.price - b.price);
}
sortCourses();
btn.onclick = () => {
desc = !desc;
sortCourses();
generateList();
}
//////// Local Storage ////////
///////////////////////////////
window.addEventListener("beforeunload", (e) => {
localStorage.setItem("order", desc ? "descending" : "ascending");
});
window.onload = () => generateList();
Link 到 codepen
我的代码中有这个 'sort' 按钮,可以根据最高到最低对课程价格进行排序,反之亦然。该按钮工作得很好,我现在正在尝试进行本地存储以保留顺序(降序或升序),以便即使页面刷新,顺序也保持不变。这是我的本地存储代码:
window.addEventListener('beforeunload', () => {
localStorage.setItem('order', JSON.stringify(courses));
});
var orderList = localStorage.getItem('order');
function getCourseOrder() {
if (orderList) {
return JSON.parse(orderList);
} else {
return [];
}
}
window.onload = function() {
generateList(getCourseOrder())
}
//generateList is to create elements and append etc
问题是顺序 (descending/ascending) 仅在一次刷新时保持不变,然后在第二次刷新后 returns 变为原始顺序。我创建了一个代码笔:https://codepen.io/ShawnTan15/pen/vYxebyO
我看过你的JS代码,你只犯了一个小错误,在onload函数中你还必须修改courses
变量,所以当下一次(第二次)卸载发生时,它会选择正确的排序课程(因为您将本地课程列表设置为本地存储)而不是全局 courses
列表。
// Made it let
let courses = [
{
name: "Complete ReactJS course",
price: "2.3",
},
{
name: "Complete Angular course",
price: "2.1",
},
{
name: "Complete Mern course",
price: "2.9",
},
{
name: "Complete C++ course",
price: "2.4",
},
];
function generateList(courseList) {
const ul = document.querySelector(".list-group");
ul.innerHTML = "";
courseList.forEach((course) => {
const li = document.createElement("li");
li.classList.add("list-group-item");
const name = document.createTextNode(course.name);
li.appendChild(name);
const span = document.createElement("span");
span.classList.add("float-right");
const price = document.createTextNode("$ " + course.price);
span.appendChild(price);
li.appendChild(span);
ul.appendChild(li);
});
}
generateList(courses);
const btn = document.querySelector(".btn-success");
let activeSortingType;
let isSortingDirty = false;
btn.addEventListener("click", function () {
isSortingDirty = true;
if (activeSortingType === "asc") {
activeSortingType = "desc";
courses.sort((a, b) => b.price - a.price);
} else if (activeSortingType === "desc") {
activeSortingType = "asc";
courses.sort((a, b) => a.price - b.price);
} else if (activeSortingType === null) {
activeSortingType = "asc";
courses.sort((a, b) => a.price - b.price);
}
generateList(courses);
});
////////Local Storage////////
/////////////////////////////
window.addEventListener("beforeunload", (e) => {
localStorage.setItem("order", JSON.stringify(courses));
if (activeSortingType !== null && isSortingDirty) {
const currentSortingType = localStorage.setItem(
"activeSortingType",
activeSortingType
);
}
});
const orderList = localStorage.getItem("order");
function getCourseOrder() {
if (orderList) {
// Updating the courses list here in onload
courses = JSON.parse(orderList);
return courses;
} else {
return [];
}
}
window.onload = function () {
const courseList = getCourseOrder();
activeSortingType = localStorage.getItem("activeSortingType");
if (courseList.length) {
generateList(courseList);
}
};
我建议您不要将所有课程都保存到本地存储中,而是只保存订单:
let courses = [
{
name: "Complete ReactJS course",
price: "2.3"
},
{
name: "Complete Angular course",
price: "2.1"
},
{
name: "Complete Mern course",
price: "2.9"
},
{
name: "Complete C++ course",
price: "2.4"
}
];
function generateList() {
const ul = document.querySelector(".list-group");
ul.innerHTML = "";
courses.forEach((course) => {
const li = document.createElement("li");
li.classList.add("list-group-item");
const name = document.createTextNode(course.name);
li.appendChild(name);
const span = document.createElement("span");
span.classList.add("float-right");
const price = document.createTextNode("$ " + course.price);
span.appendChild(price);
li.appendChild(span);
ul.appendChild(li);
});
}
const btn = document.querySelector(".btn-success");
let desc = localStorage.getItem("order") == "descending";
function sortCourses() {
courses.sort((a, b) => desc ? b.price - a.price : a.price - b.price);
}
sortCourses();
btn.onclick = () => {
desc = !desc;
sortCourses();
generateList();
}
//////// Local Storage ////////
///////////////////////////////
window.addEventListener("beforeunload", (e) => {
localStorage.setItem("order", desc ? "descending" : "ascending");
});
window.onload = () => generateList();
Link 到 codepen