44- آموزش جاوااسکریپت | پروژه عملی :قسمت 6 از 6 - ذخیرهسازی دادهها در LocalStorage در پروژه Book List با کلاسهای ES6
در این آموزش، قابلیت پایداری دادهها را به پروژه Book List اضافه میکنیم. با ایجاد یک کلاس استاتیک به نام Store، یاد میگیریم چگونه کتابها را در LocalStorage ذخیره، بازیابی و حذف کنیم تا دادهها با رفرش صفحه از بین نروند.
در این بخش، قابلیت ماندگاری دادهها را به پروژه Book List اضافه میکنیم تا اطلاعات کتابها فقط در رابط کاربری نمایش داده نشوند و بعد از بارگذاری مجدد صفحه نیز حفظ شوند.
برای این کار، از نسخه ES6 و کلاسها استفاده میکنیم. ایده اصلی این است که یک کلاس جداگانه به نام Store بسازیم تا تمام عملیات مربوط به LocalStorage را مدیریت کند. این عملیات شامل دریافت کتابها، افزودن کتاب جدید، نمایش کتابها در شروع بارگذاری صفحه و حذف کتاب از حافظه مرورگر است.
ایجاد کلاس Store
در ابتدا یک کلاس جدید زیر کلاس UI تعریف میکنیم. تمام متدهای این کلاس به صورت static هستند؛ یعنی برای استفاده از آنها نیازی به ساختن نمونه جدید با new نداریم.
class Store {
static displayBooks() {}
static getBooks() {}
static addBook(book) {}
static removeBook(isbn) {}
}
استفاده از متدهای استاتیک باعث میشود بتوانیم مستقیماً متدها را با نام کلاس فراخوانی کنیم:
Store.addBook(book);
Store.getBooks();
دریافت کتابها از LocalStorage
از آنجا که در چند بخش مختلف به لیست کتابها نیاز داریم، بهتر است یک متد مجزا برای دریافت آنها از LocalStorage داشته باشیم تا از تکرار کد جلوگیری شود.
در این متد بررسی میکنیم که آیا کلید books در LocalStorage وجود دارد یا نه. اگر وجود نداشت، یک آرایه خالی برمیگردانیم. در غیر این صورت، مقدار ذخیرهشده را از حالت رشتهای JSON به آرایه جاوااسکریپتی تبدیل میکنیم.
static getBooks() {
let books;
if (localStorage.getItem('books') === null) {
books = [];
} else {
books = JSON.parse(localStorage.getItem('books'));
}
return books;
}
افزودن کتاب به LocalStorage
در زمان ثبت فرم، کتاب جدید ابتدا در رابط کاربری نمایش داده میشود. اما اگر بخواهیم بعد از رفرش صفحه نیز باقی بماند، باید آن را در LocalStorage ذخیره کنیم.
پس بعد از اضافه شدن کتاب به لیست، متد addBook از کلاس Store را صدا میزنیم:
Store.addBook(book);
پیادهسازی این متد به این صورت است:
static addBook(book) {
const books = Store.getBooks();
books.push(book);
localStorage.setItem('books', JSON.stringify(books));
}
در اینجا:
- ابتدا لیست فعلی کتابها را میگیریم.
- کتاب جدید را به آرایه اضافه میکنیم.
- آرایه را با
JSON.stringifyبه رشته تبدیل میکنیم. - سپس آن را دوباره در
LocalStorageذخیره میکنیم.
نمایش کتابها هنگام بارگذاری صفحه
بعد از اینکه دادهها در LocalStorage ذخیره شدند، باید هنگام باز شدن صفحه دوباره آنها را در جدول نمایش دهیم. برای این کار از متد displayBooks استفاده میکنیم.
static displayBooks() {
const books = Store.getBooks();
books.forEach(function(book) {
const ui = new UI();
ui.addBookToList(book);
});
}
در این متد:
- ابتدا کتابها از
LocalStorageخوانده میشوند. - سپس با
forEachروی آنها پیمایش میکنیم. - هر کتاب با متد
addBookToListدر رابط کاربری نمایش داده میشود.
برای اجرای این متد در زمان بارگذاری صفحه، از رویداد DOMContentLoaded استفاده میکنیم:
document.addEventListener('DOMContentLoaded', Store.displayBooks);
این کار باعث میشود به محض آماده شدن ساختار HTML صفحه، کتابهای ذخیرهشده در LocalStorage نمایش داده شوند.
حذف کتاب از LocalStorage
تا اینجا اگر کتابی را از جدول حذف کنیم، فقط از رابط کاربری حذف میشود و با رفرش صفحه دوباره برمیگردد. برای حل این مسئله باید حذف از LocalStorage را هم پیادهسازی کنیم.
چون در این پروژه شناسه یکتای جداگانهای نداریم، از مقدار ISBN برای تشخیص کتاب استفاده میکنیم.
در بخش حذف، بعد از حذف آیتم از رابط کاربری، متد removeBook را فراخوانی میکنیم و ISBN همان سطر را به آن میدهیم:
Store.removeBook(
e.target.parentElement.previousElementSibling.textContent
);
در این کد:
e.targetهمان لینک حذف است.parentElementما را به سلول جدول مربوط به دکمه حذف میرساند.previousElementSiblingسلول قبلی را برمیگرداند که شاملISBNاست.textContentمقدار متنی آن را استخراج میکند.
اکنون متد removeBook را به این صورت مینویسیم:
static removeBook(isbn) {
const books = Store.getBooks();
books.forEach(function(book, index) {
if (book.isbn === isbn) {
books.splice(index, 1);
}
});
localStorage.setItem('books', JSON.stringify(books));
}
در این متد:
- ابتدا آرایه کتابها را میگیریم.
- روی آرایه پیمایش میکنیم.
- هر جا
isbnکتاب با مقدار دریافتشده برابر بود، همان آیتم را باspliceحذف میکنیم. - در پایان آرایه جدید را دوباره در
LocalStorageذخیره میکنیم.
جمعبندی
با اضافه شدن کلاس Store، پروژه Book List از یک برنامه صرفاً نمایشی به یک برنامه با دادههای پایدار تبدیل میشود. اکنون:
- کتابها بعد از ثبت فرم در
LocalStorageذخیره میشوند. - هنگام بارگذاری صفحه، دوباره در جدول نمایش داده میشوند.
- در زمان حذف، هم از رابط کاربری و هم از
LocalStorageپاک میشوند.
این ساختار باعث میشود منطق مدیریت دادهها از منطق رابط کاربری جدا شود و کد پروژه تمیزتر و قابل نگهداریتر باشد.
تمرین پیشنهادی
به عنوان تمرین، میتوانید همین قابلیت را در نسخه ES5 پروژه که با prototype نوشته شده است نیز پیادهسازی کنید. این کار کمک میکند تفاوت پیادهسازی LocalStorage در ساختار پروتوتایپی و کلاسی را بهتر درک کنید.