[Назад](./web_07.md) | [К содержанию](../readme.md#практика-1-введение-в-web-разработку) | [Дальше](./web_09.md) # Vue.js: LocalStorage, фильтрация, пагинация, наблюдатели, history ## #16 Криптономикон-5: Работа со списком - Vue.js: практика >Внимание! Код, который мы пишем всё ещё "плохой" и пишем мы его только в ознакомительных целях, чтобы понимать что такое хорошо и что такое плохо. >31 минута * [YouTube](https://www.youtube.com/watch?v=BNDo6MVbPn4) * [RuTube](https://rutube.ru/video/9213d9aa1e64af06a9f471d0b22c3e6e/) **Содержание урока:** * [сохранение/восстановление тикеров в *LocalStorage* (с переподпиской при обновлении страницы)](#сохранениевосстановление-тикеров-в-localstorage-с-переподпиской-при-обновлении-страницы) * [фильтрация](#фильтрация) * [пагинация](#пагинация) * [watch](#наблюдение-watch) * [хранение фильтра и пагинатора (url history)](#сохранение-фильтра-и-пагинации-при-перезагрузке-страницы) **Материалы к изучению:** - [watch (наблюдатели)](https://ru.vuejs.org/guide/essentials/watchers.html) ## Сохранение/восстановление тикеров в **LocalStorage** (с переподпиской при обновлении страницы) Проблема: при обновлении страницы у нас пропадает список тикеров 1. В методе `add()` после добавления нового тикера в массив тикеров сохраняем его в **localStorage** >**LocalStorage** это хранилище данных в браузере. Данные хранятся парами "ключ:значение", причем значения могут хранить только скалярные типы данных. Поэтому перед записью данных мы их "сериализуем" (преобразуем в строку) методом **JSON.stringify**, а после извлечения "десериализуем" методом **JSON.parse** ```js localStorage.setItem( 'cryptonomicon-list', JSON.stringify(tickers.value)) ``` 1. Восстанавливаем список тикеров в методе жизненного цикла В видео используется метод **created**, но во **vue3** нет такого метода, будем использовать **onBeforeMount** (в видео запретили использовать метод **onMount** без объяснения причин) ```js onBeforeMount(() => { const tickersData = localStorage.getItem('cryptonomicon-list') ?? '[]' tickers.value = JSON.parse(tickersData) }) ``` Если сейчас обновить страницу, то тикеры восстановятся, но обновления данных не будет, т.к. оно включается только в методе **add** 1. Выносим код обновления тикеров в отдельную функцию **subdcribeToUpdates** ```js function subscribeToUpdates (tickerName) { setInterval(async () => { const f = await fetch( `https://min-api.cryptocompare.com/data/price?fsym=${tickerName}&tsyms=USD&api_key=ce3fd966e7a1d10d65f907b20bf000552158fd3ed1bd614110baa0ac6cb57a7e` ) const data = await f.json() // тут я добавил проверку data.USD - некоторые валюты возвращают ошибку if (typeof data.USD != 'undefined') { tickers.value.find(t => t.name === tickerName).price = data.USD > 1 ? data.USD.toFixed(2) : data.USD.toPrecision(2) if (sel.value?.name === tickerName) { graph.value.push(data.USD) } } }, 5000); } ``` И используем её и в методе **add** (сделайте сами) и в **onBeforeMount** ```js onBeforeMount(() => { const tickersData = localStorage.getItem('cryptonomicon-list') ?? '[]' tickers.value = JSON.parse(tickersData) tickers.value.forEach(ticker => { subscribeToUpdates(ticker.name) }) }) ``` ## Фильтрация 1. В шаблоне перед списком тикеров добавим фильтр и кнопки ```html