{"componentChunkName":"component---src-templates-post-js","path":"/javascript/kak-rabotat-s-localstorage-v-javascript/","result":{"pageContext":{"slug":"kak-rabotat-s-localstorage-v-javascript","content":"\n<p id=\"53e8\">В этой статье вы узнаете о том, что такое&nbsp;<code>localStorage</code>&nbsp;и на рабочем примере узнаем то, как с ним работать в JavaScript.</p>\n\n\n\n<p class=\"author\" id=\"7410\">Перевод статьи&nbsp;<a href=\"https://www.taniarascia.com/how-to-use-local-storage-with-javascript/\">How to Use Local Storage with JavaScript</a></p>\n\n\n\n<p id=\"c112\">Мне нравится делать обучающие материалы о том, как создавать небольшие приложения буквально с нуля, используя чистый JavaScript. Создание&nbsp;<strong>to-do</strong>&nbsp;списка это распространенная идея для создания приложения, а без базы данных, в которую можно положить задачи, она становится особенной полезной, но добавляет некоторые сложности для начинающих.</p>\n\n\n\n<p id=\"1a3f\">Однако,&nbsp;даже без базы данных, мы можем использовать встроенное в браузер веб-хранилище, чтобы сохранять туда задачи из&nbsp;<strong>to-do</strong>&nbsp;списка.Такое приложение было бы особенно полезным для создания быстрых заметок. Вы бы просто установили ярлык на приложение при запуске новой вкладки и задачи&nbsp;<strong>to-do</strong>&nbsp;будут находиться на вашем компьютере пока вы не очистите кэш.</p>\n\n\n\n<p id=\"c6ec\">Вот то, что мы сегодня будем делать:</p>\n\n\n\n<p id=\"ee17\"><a href=\"https://taniarascia.github.io/sandbox/tab/\">Демка</a></p>\n\n\n\n<p id=\"a848\"><a href=\"https://github.com/taniarascia/sandbox/tree/master/tab\">Исходник</a></p>\n\n\n\n<p id=\"964a\">Для того, чтобы понимать статью, вам нужно знать основы HTML и CSS, понимать типы данных и синтаксис JavaScript, вместе с DOM манипуляциями.</p>\n\n\n\n<p id=\"25d6\">Целью этой статьи является создание быстрого приложения, которое будет хранить&nbsp;<strong>to-do</strong>&nbsp;элементы в веб-хранилище браузера на вашем компьютере и показывать их на фронте.&nbsp;<a href=\"https://taniarascia.github.io/sandbox/tab\">Посмотрите пример</a>.</p>\n\n\n\n<h2 id=\"7873\">Что такое веб-хранилище</h2>\n\n\n\n<p id=\"c135\">В веб-хранилище хранятся данные пользователя браузера. Есть два типа веб-хранилищ:</p>\n\n\n\n<p id=\"3c93\"><code>localStorage</code>&nbsp;— это данные, которые хранятся бессрочно и будут доступны даже после перезагрузки браузера.</p>\n\n\n\n<p id=\"5c51\"><code>sessionStorage&nbsp;</code>— это данные, которые стираются после того, как окно браузера закрывается.</p>\n\n\n\n<p id=\"83b2\">Веб-хранилище довольно удобно для сохранения данных, таких как предпочтения пользователей (светлая или темная цветовая схема на сайте и тп), сохранение товаров, положенных в корзину или запоминание того, что пользователь залогинен на сайте.</p>\n\n\n\n<p id=\"1953\">До этого, для запоминания такого рода локальных, временных данных, использовались только кукисы. В локальном веб-хранилище вы можете хранить значительно больше данных (5MB vs 4KB) и не обращаться к ним, при каждом HTTP вызове, таким образом, это может быть лучшим вариантом для хранилища данных на стороне клиента.</p>\n\n\n\n<p id=\"2d05\">Вот обзор методов&nbsp;<code>localStorage</code></p>\n\n\n\n<p id=\"bb62\"><code>setItem()</code>&nbsp;— добавляет пару ключ-значение в локальное веб-хранилище</p>\n\n\n\n<p id=\"f29f\"><code>getItem()</code>&nbsp;— получает значение по ключу</p>\n\n\n\n<p id=\"8aa1\"><code>removeItem()&nbsp;</code>— удаляет элемент по ключу</p>\n\n\n\n<p id=\"f12c\"><code>clear()</code>&nbsp;— очищает хранилище</p>\n\n\n\n<p id=\"b1ea\">Вы можете посмотреть то, что находится в локальном хранилище, зайдя в консоль и введя в неё&nbsp;<code>localStorage</code>.</p>\n\n\n\n<pre class=\"wp-block-code\"><code>Storage {length: 0}</code></pre>\n\n\n\n<p>Добавление данных в&nbsp;<code>localStorage</code>&nbsp;очень простой процесс, вы можете использовать&nbsp;<code>setItem()</code>&nbsp;метод. Я буду использовать общепринятые имена для пары <strong>ключ-значение</strong>, но они могут быть любой производной строкой.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>localStorage.setItem('key', 'value')</code></pre>\n\n\n\n<p>Теперь, если вы проверите&nbsp;<code>localStorage</code>&nbsp;в консоле, то вы там увидите новый ключ и значение.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>Storage {key: \"value\", length: 1}</code></pre>\n\n\n\n<p>Если вы хотите получить значение конкретного ключа, то вам надо будет использовать метод&nbsp;<code>getItem()</code>.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>localStorage.getItem('key')\nvalue</code></pre>\n\n\n\n<p>И наконец, вы можете удалить данные с помощью&nbsp;<code>removeItem()</code>.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>localStorage.removeItem('key')</code></pre>\n\n\n\n<p>А используя&nbsp;<code>clear()</code>, вы очистите всё веб-хранилище.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>localStorage.clear()</code></pre>\n\n\n\n<p>Теперь мы можем приступить к созданию приложения.</p>\n\n\n\n<h2 id=\"c968\">Подготавливаем фронт</h2>\n\n\n\n<p id=\"296c\">Сначала мы создадим простенькую HTML разметку в&nbsp;<code>index.html</code>. Я работаю в&nbsp;<em>Primitive(мой минималистический HTML Фреймворк)</em>&nbsp;для стилей, потому что это то, что я всегда использую, если мне нужен быстрый фронт.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&lt;!DOCTYPE html>\n&lt;html lang=\"en\">\n  &lt;head>\n    &lt;meta charset=\"utf-8\" />\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n&lt;title>New Tab App&lt;/title>\n&lt;link rel=\"stylesheet\" href=\"https://unpkg.com/primitive-ui/dist/css/main.css\" />\n  &lt;/head>\n&lt;body>\n    &lt;div class=\"small-container\">\n      &lt;h1>New Tab App&lt;/h1>\n&lt;!-- more will go here -->\n    &lt;/div>\n  \n    &lt;script src=\"js/scripts.js\">&lt;/script>\n  &lt;/body>\n&lt;/html></code></pre>\n\n\n\n<p id=\"3f43\">Тут нам надо уделить внимание настройке трёх вещей:</p>\n\n\n\n<p id=\"ba79\"><strong>Текстовой&nbsp;</strong><code><strong>input</strong></code>— для добавления новых элементов.</p>\n\n\n\n<p id=\"0660\"><strong>Список</strong>&nbsp;— то место, куда будут добавляться новые элементы на фронте.</p>\n\n\n\n<p id=\"5d91\"><strong>Кнопка&nbsp;</strong>— для сброса всех элементов.</p>\n\n\n\n<p id=\"19bd\">Добавьте этот код туда, где стоит комментарий&nbsp;<strong>&lt;! — more will go here — &gt;</strong></p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>&lt;form>\n  &lt;input id=\"item\" type=\"text\" placeholder=\"New\" required />\n&lt;/form>\n&lt;h2>Items&lt;/h2>\n&lt;ul>&lt;/ul>\n&lt;button>Clear All&lt;/button></code></pre>\n\n\n\n<p>И вот, как всё это будет выглядеть.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"445\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_Ik5BF_Om2vH9MbxVWf0u7g.png\" alt=\"\" class=\"wp-image-201\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_Ik5BF_Om2vH9MbxVWf0u7g.png 700w, https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_Ik5BF_Om2vH9MbxVWf0u7g-300x191.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<p>Далее мы сосредоточимся на написании функционала в JavaScript.</p>\n\n\n\n<h2 id=\"02ec\">Пишем функционал на JavaScript</h2>\n\n\n\n<p id=\"0d05\">Перед тем, как интегрировать всё это с локальным веб-хранилищем, давайте подцепим на JS форму и список, через которые мы хотим добавлять данные в input и выводить их в&nbsp;<code>ul</code>.</p>\n\n\n\n<p id=\"be63\">Для начала, я собираюсь объявить несколько переменных для элементов на странице.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const form = document.querySelector('form')\nconst ul = document.querySelector('ul')\nconst button = document.querySelector('button')\nconst input = document.getElementById('item')</code></pre>\n\n\n\n<p>Далее, я напишу функцию, которая создаст элемент&nbsp;<code>li</code>, так как этот функционал нам потребуется очень часто. Я назову функцию&nbsp;<code>liMaker()</code>. Она просто будет создавать элемент&nbsp;<code>li</code>, выставлять ему текст, который будет как параметр и добавлять созданный&nbsp;<code>li</code>&nbsp;в&nbsp;<code>ul</code>.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const liMaker = text => {\n  const li = document.createElement('li')\n  li.textContent = text\n  ul.appendChild(li)\n}</code></pre>\n\n\n\n<p id=\"5117\">Далее, я собираюсь добавить прослушиватель события на форму, которая связана с&nbsp;<code>submit</code>&nbsp;— событие, которое будет происходить всякий раз, как мы нажмем на enter в форме.<code>e.preventDefault()</code>&nbsp;предотвратит отправку формы при сабмите, это нам не нужно, так как мы не собираемся отправлять никаких данных на сервер.</p>\n\n\n\n<p id=\"5373\">Вместо этого, форма отправит значение&nbsp;<code>input</code>. Мы вызовем функцию&nbsp;<code>liMaker()</code>, которая создаст элемент с текстом, который будет значением&nbsp;<code>input</code>&nbsp;и далее, мы добавим это в DOM. И под конец, мы выставим значение&nbsp;<code>input</code>&nbsp;на пустую строку, таким образом вам не придётся вручную стирать то, что вы только написали.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>form.addEventListener('submit', function(e) {\n  e.preventDefault()\nliMaker(input.value)\n  input.value = ''\n})</code></pre>\n\n\n\n<p>Теперь, с буквально пустяковым количеством кода на борту, мы имеем небольшое приложение, которое добавляет&nbsp;<strong>to-do</strong>&nbsp;элементы в список задач.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"700\" height=\"445\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_7-eKeSTYTZf-ie6kDdz9oQ.png\" alt=\"\" class=\"wp-image-202\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_7-eKeSTYTZf-ie6kDdz9oQ.png 700w, https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_7-eKeSTYTZf-ie6kDdz9oQ-300x191.png 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" /></figure>\n\n\n\n<p>Но, так как мы нигде не сохраняем наши данные, то при закрытии или обновлении браузера, введенные нами элементы исчезнут. Последним шагом будет интеграция нашего приложения с локальным хранилищем, для того, чтобы данные оставались в нём и после перезагрузки страницы, и после перезагрузки браузера.</p>\n\n\n\n<h2 id=\"08f6\">Интегрируем локальное хранилище</h2>\n\n\n\n<p id=\"805c\">Сейчас мы добавим немного функционала в наше приложение. Во первых, каждый раз, когда форму будут сабмитить, значение из&nbsp;<code>input</code>&nbsp;будет добавлено в&nbsp;<code>localStorage</code>&nbsp;вместе с мгновенным отображением в списке задач. Также, нам нужно будет пробежаться циклом по всему локальному хранилищу и показать элементы этого хранилища сверху списка существующих задач. Ну и под конец, мы добавим кнопку&nbsp;<em>“Clear All”</em>, которая удалит все элементы не только из локального хранилища, но и из списка&nbsp;<code>ul</code>.</p>\n\n\n\n<p id=\"318e\">Давайте сначала создадим пустой массив и создадим в&nbsp;<code>localStorage</code>&nbsp;ключ под названием&nbsp;<code>items</code>.&nbsp;<code>localStorage</code>&nbsp;в виде значений ключей принимает только строки, к тому же, нам надо хранить задачи в массиве.</p>\n\n\n\n<p id=\"bc03\">Мы можем обойти это ограничение с помощью&nbsp;<code>JSON.stringify()</code>, чтобы конвертировать массив в строку. А уже потом мы применим&nbsp;<code>JSON.parse()</code>&nbsp;для конвертирования содержимого&nbsp;<code>localStorage</code>&nbsp;в какой-нибудь рабочий формат, который мы положим в переменную&nbsp;<code>data</code>. Вставьте этот код под всем, что мы написали выше.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>let itemsArray = &#91;]\n\nlocalStorage.setItem('items', JSON.stringify(itemsArray))\nconst data = JSON.parse(localStorage.getItem('items'))</code></pre>\n\n\n\n<p>В слушателе событий мы будем отправлять каждое новое значение&nbsp;<code>input</code>&nbsp;в массив, а затем добавлять в&nbsp;<code>localStorage</code>&nbsp;новое значение с уже обновленным массивом.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>e.preventDefault()\nitemsArray.push(input.value)\nlocalStorage.setItem('items', JSON.stringify(itemsArray))</code></pre>\n\n\n\n<p>Далее, мы собираемся пробежаться по всему содержимому переменной&nbsp;<code>data</code>, которая содержит всё из нашего&nbsp;<code>localStorage</code>&nbsp;в таком виде, в котором мы можем работать с этими данным в JavaScript. Затем мы заново запустим&nbsp;<code>liMaker()</code>. Это покажет нам всю нужную информацию в списке при каждом открытии приложения.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>data.forEach(item => {\n  liMaker(item)\n})</code></pre>\n\n\n\n<p>И под конец мы добавим событие по клику на кнопку, которая очистит все данные из&nbsp;<code>localStorage</code>&nbsp;и удалит все потомков у&nbsp;<code>ul</code>.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>button.addEventListener('click', function() {\n  localStorage.clear()\n  while (ul.firstChild) {\n    ul.removeChild(ul.firstChild)\n  }\n})</code></pre>\n\n\n\n<p>Если всё пройдет хорошо, то данные запишутся в хранилище и покажутся в списке задач, а само хранилище вы сможете проверить введя&nbsp;<code>localStorage</code>&nbsp;в консоли.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>Storage {items:\n\"&#91;\"Welcome\",\"to\",\"the\",\"Thunderdome\"]\",\n  length: 1}</code></pre>\n\n\n\n<p id=\"153d\">Но у нас осталась последняя проблема. После закрытия браузера или перезагрузки страницы, вся существующая информация в&nbsp;<code>localStorage</code>&nbsp;пропадает и ничего не остается на нашем фронте. Почему?</p>\n\n\n\n<p id=\"8669\">Потому, что наш&nbsp;<code>itemsArray</code>&nbsp;сбрасывается каждый раз при запуске скрипта. Мы можем пофиксить эту проблемку, создав условие, которое проверит наличие доступного&nbsp;<code>localStorage</code>:</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>let items\nif (localStorage.getItem('items')) {\n  items = JSON.parse(localStorage.getItem('items'))\n} else {\n  items = &#91;]\n}</code></pre>\n\n\n\n<p>Практичнее было бы использовать тернарный оператор.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>let itemsArray = localStorage.getItem('items') ? JSON.parse(localStorage.getItem('items')) : &#91;]</code></pre>\n\n\n\n<p>Теперь наше приложение завершено. И когда вы вводите какую-либо информацию, а затем обновляете или закрываете окно браузера, данные будут на месте, пока вы самостоятельно не очистите их в настройках браузера или запустив команду&nbsp;<code>localStorage.clear()</code>. Ну а вот и полный код JavaScript.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>const form = document.querySelector('form')\nconst ul = document.querySelector('ul')\nconst button = document.querySelector('button')\nconst input = document.getElementById('item')\nlet itemsArray = localStorage.getItem('items') ? JSON.parse(localStorage.getItem('items')) : &#91;]\nlocalStorage.setItem('items', JSON.stringify(itemsArray))\nconst data = JSON.parse(localStorage.getItem('items'))\nconst liMaker = text => {\n  const li = document.createElement('li')\n  li.textContent = text\n  ul.appendChild(li)\n}\nform.addEventListener('submit', function(e) {\n  e.preventDefault()\nitemsArray.push(input.value)\n  localStorage.setItem('items', JSON.stringify(itemsArray))\n  liMaker(input.value)\n  input.value = ''\n})\ndata.forEach(item => {\n  liMaker(item)\n})\nbutton.addEventListener('click', function() {\n  localStorage.clear()\n  while (ul.firstChild) {\n    ul.removeChild(ul.firstChild)\n  }\n})</code></pre>\n\n\n\n<h2 id=\"1a70\"><strong>Заключение</strong></h2>\n\n\n\n<p id=\"1b42\">В этом руководстве мы узнали о том, как сделать простое&nbsp;<strong>to-do</strong>&nbsp;приложение, которое можно использовать для быстрого напоминания о текущих задачах, просто вызвав новую вкладку, используя HTML5 веб-хранилище. Я надеюсь, что теперь у вас появилось лучшее понимание локального хранилища и того, как интегрировать его в простое приложение.</p>\n\n\n\n<p><em>Почитайте про применение localStorage в следующей статье &#8212; <a href=\"https://stasonmars.ru/javascript/ispolzuem-localstorage-v-react/\">Используем localStorage в React</a></em></p>\n","type":"js","date":"2021-02-08T17:20:32.000Z","acf":{"seo_desc":"В этой статье вы узнаете о том, что такое localStorage и на рабочем примере узнаем то, как с ним работать в JavaScript.","keywords":"localstorage javascript, как localstorage javascript, как работать с localstorage javascript","pub_date":"2019-10-08","tags":"JavaScript, localStorage"},"title":"Как работать с localStorage в JavaScript","id":"42102be2-be86-5b0e-be2a-ec67d8a54f09","excerpt":"<p>В этой статье вы узнаете о том, что такое localStorage и на рабочем примере узнаем то, как с ним работать в JavaScript.</p>\n","featured_media":{"source_url":"https://stasonmars.ru/wp/wp-content/uploads/2021/02/localstoragejshowkjfndsk.jpg"},"interesting":[{"title":"Как работать с localStorage в JavaScript","slug":"kak-rabotat-s-localstorage-v-javascript","type":"js"},{"title":"Используем localStorage в React","slug":"ispolzuem-localstorage-v-react","type":"js"}]}},"staticQueryHashes":["3576131997","63159454"]}