{"componentChunkName":"component---src-templates-post-js","path":"/javascript/ispolzuem-localstorage-v-react/","result":{"pageContext":{"slug":"ispolzuem-localstorage-v-react","content":"\n<p>Как использовать преимущества localStorage в React? Да легко! В этой статье вы узнаете об удобстве применения локального хранилища в React приложениях.</p>\n\n\n\n<p class=\"author\"><em>Перевод&nbsp;</em><a href=\"https://programmingwithmosh.com/react/localstorage-react/\"><em>How to use localStorage with React</em></a></p>\n\n\n\n<p>Сердцем каждого приложения на React является его стейт. Компоненты могут иметь свой собственный внутренний стейт и поверьте мне, несмотря на всю их простоту, вы можете делать с ними много невероятно крутых вещей. Но давайте представим, что вы создаёте приложение и в какой-то момент вам надо локально сохранить данные от пользователя или даже сохранить весь стейт для одного или нескольких других компонентов. И тут, возможно, вам захочется понять, а как же можно использовать&nbsp;<code>localStorage</code>&nbsp;в React приложении? Что же, начнем с того, что&nbsp;<code>setState</code>&nbsp;тут вам уже не помощник, но не переживайте, все будет довольно просто. Читаем дальше.</p>\n\n\n\n<p>Если вы не знаете про то, как работает localStorage, то вот отличная статья &#8212; <a href=\"https://stasonmars.ru/javascript/kak-rabotat-s-localstorage-v-javascript/\">Как работать с localStorage в JavaScript</a></p>\n\n\n\n<h2 id=\"e9e6\"><strong>Веб хранилище</strong></h2>\n\n\n\n<p id=\"9b4d\">Оно создано для того, чтобы хранить данные в браузере и оно потерпело значительное количество позитивных улучшений в сравнении со своим предшественником — кукисами. Сначала оно было как&nbsp;<strong>HTML5 API</strong>, ну а потом переросло уже в независимую рабочую единицу. Хранилище поддерживается буквально каждым современным браузером и даже некоторыми старичками, например такими как IE8. Веб хранилище реализовано двумя способами: первый —&nbsp;<code>localStorage</code>, постоянное хранилище данных, которое можно сравнить с постоянными кукисами, второе —<code>&nbsp;sessionStorage</code>, хранилище существующее только на время определенной сессии и на определенный период времени. Хоть эта статья и работает с&nbsp;<code>localStorage</code>, но вы также можете применить все описанные методики и на sessionStorage.</p>\n\n\n\n<h2 id=\"cf0c\">Наш компонент для рабочего примера</h2>\n\n\n\n<p id=\"37b2\">Итак, нам нужен компонент на котором мы будем все испытывать. Тут я думаю, что страница логина с опцией “<strong>Remember me</strong>” подойдет идеально. Для простоты и понятности, мы не будем добавлять поле пароля. Давайте посмотрим на метод&nbsp;<code>render()</code>:</p>\n\n\n\n<pre class=\"wp-block-code jsx\"><code>render() {\n  return (\n    &lt;form onSubmit={this.handleFormSubmit}>\n      &lt;label>\n        User: &lt;input name=\"user\" value={this.state.user} onChange={this.handleChange}/>\n      &lt;/label>\n      &lt;label>\n        &lt;input name=\"rememberMe\" checked={this.state.rememberMe} onChange={this.handleChange} type=\"checkbox\"/> Remember me\n      &lt;/label>\n      &lt;button type=\"submit\">Sign In&lt;/button>\n    &lt;/form>\n  );\n}</code></pre>\n\n\n\n<p>Как вы видите, это довольно простая форма с двумя инпутами и кнопкой. Код который должен обрабатывать стейт также очень легко понять:</p>\n\n\n\n<pre class=\"wp-block-code jsx\"><code>export default class SignIn extends Component {\n  state = {\n    user: '',\n    rememberMe: false\n  };\n \n  handleChange = (event) => {\n    const input = event.target;\n    const value = input.type === 'checkbox' ? input.checked : input.value;\n \n    this.setState({ &#91;input.name]: value });\n  };\n \n  handleFormSubmit = () => {};\n \n  render() { /*...*/ }\n}</code></pre>\n\n\n\n<p>В примере кода выше мы используем метод&nbsp;<code>setState</code>, чтобы сохранять актуальность стейта при каждом изменении в форме. Если вы запустите проект, то вот, что получите:</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"351\" height=\"38\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_oSfU_wl3WttGAdZLUMH7Hg.png\" alt=\"\" class=\"wp-image-195\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_oSfU_wl3WttGAdZLUMH7Hg.png 351w, https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_oSfU_wl3WttGAdZLUMH7Hg-300x32.png 300w\" sizes=\"(max-width: 351px) 100vw, 351px\" /></figure>\n\n\n\n<p>Если вы заполните инпут для пользователя, а потом кликните на “<strong>Remember Me</strong>” чекбокс и под конец кликните на кнопку “<strong>Sign In</strong>”, то вы заметите, что форма снова опустеет:</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"352\" height=\"28\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_gU6mXtUg4pfzPUOyYwJRgQ.gif\" alt=\"\" class=\"wp-image-196\"/></figure>\n\n\n\n<p>Это вполне нормальное поведение. Теперь мы должны узнать как же нам использовать&nbsp;<code>localStorage</code>&nbsp;в React и заставить форму работать должным образом.</p>\n\n\n\n<h2 id=\"a431\">Шаг 1: Сохраняем данные в localStorage</h2>\n\n\n\n<p id=\"923b\">В нашем примере нужно сохранить две вещи:</p>\n\n\n\n<p id=\"6d3f\">Значение опции&nbsp;<strong>Remember Me</strong></p>\n\n\n\n<p id=\"0cc4\">Имя пользователя, но только в том случае, если кликнули на опцию&nbsp;<strong>Remember Me</strong></p>\n\n\n\n<p id=\"a55c\">Для этих значений идеальным местом является метод&nbsp;<code>handleFormSubmit</code>:</p>\n\n\n\n<pre class=\"wp-block-code jsx\"><code>handleFormSubmit = () => {\n  const { user, rememberMe } = this.state;\n  localStorage.setItem('rememberMe', rememberMe);\n  localStorage.setItem('user', rememberMe ? user : '');\n};</code></pre>\n\n\n\n<p id=\"67db\">Что же происходит в этом методе?</p>\n\n\n\n<p id=\"95ad\">Сначала мы назначаем две переменные с помощью&nbsp;<a href=\"https://medium.com/@stasonmars/%D0%B4%D0%B5%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%B2-es6-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B5-%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE-b865bb71f376\">деструктуризации</a></p>\n\n\n\n<p id=\"921e\">Далее, мы вызываем метод&nbsp;<code>localStorage.setItem</code>, чтобы хранить значение опции “<strong>Remember Me</strong>”.</p>\n\n\n\n<p id=\"3757\">И под конец мы сохраняем имя пользователя, но только в том случае, когда “<strong>Remember Me</strong>” выставлено на&nbsp;<code>true</code>.</p>\n\n\n\n<p id=\"b6a3\">Вот, что пока что у нас есть:</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"600\" height=\"299\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_frlHF1ib5IHelm8clpXYYw.gif\" alt=\"\" class=\"wp-image-197\"/></figure>\n\n\n\n<p>Итак, полдела сделано. Теперь нам надо получить эти значения для компонента.</p>\n\n\n\n<h2 id=\"c2d0\">Шаг 2: Получаем данные из localStorage</h2>\n\n\n\n<p id=\"c54a\">Всё логику получения данных мы положим в&nbsp;<code>componentDidMount</code>, но вы можете спокойно положить её и в конструктор, если конечно захотите, так как её первоочередная цель — это выставление изначального стейта нашему компоненту.</p>\n\n\n\n<p id=\"02b7\">Обратите внимание, что вы не можете вызывать&nbsp;<code>setState</code>&nbsp;перед тем, как компонент монтируется, так что, если вы предпочитаете подход с конструктором, то выставьте свойство стейта напрямую. Я же предпочитаю аккуратный подход к коснтуктору, настолько аккуратный насколько это возможно, но это дело предпочтений.</p>\n\n\n\n<pre class=\"wp-block-code jsx\"><code>componentDidMount() {\n  const rememberMe = localStorage.getItem('rememberMe') === 'true';\n  const user = rememberMe ? localStorage.getItem('user') : '';\n  this.setState({ user, rememberMe });\n}</code></pre>\n\n\n\n<p id=\"464b\">Теперь давайте углубимся в код:</p>\n\n\n\n<p id=\"ca3b\">Первым делом мы получаем значение “<strong>Remember me</strong>”. Уже обратили внимание, что сравнение идёт со строкой “true”? Это потому что&nbsp;<code>localStorage</code>&nbsp;хранит данные как строки. Таким образом нам надо получить хранящееся значение и запарсить его обратно в логический тип данных, перед его непосредственным использованием. Вы бы также могли использовать&nbsp;<code>JSON.parse</code>, если бы были точно уверены в том, что там всегда будет храниться булево значение в виде строки. Но сейчас это нам не подойдет, так как само значение не выставлено при инициализации страницы.</p>\n\n\n\n<p id=\"dbd9\">Далее мы получаем имя пользователя, но только в том случае, если&nbsp;<code>remeberMe</code>&nbsp;имеет значение&nbsp;<code>true</code>.</p>\n\n\n\n<p id=\"06b4\">И под конец мы назначаем эти значения стейту компонента.</p>\n\n\n\n<p id=\"13b1\">И вот она магия!</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"600\" height=\"290\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/02/1_udpa03U52IDahtMogbbOiQ.gif\" alt=\"\" class=\"wp-image-198\"/></figure>\n\n\n\n<h2 id=\"88b1\">И ещё советик</h2>\n\n\n\n<p id=\"1e96\">Как я говорил выше,&nbsp;<code>localStorage</code>&nbsp;может хранить данные только в виде строк. Если вы имеете дело только с несколькими сохраненными значениями, то это не очень то и большая проблема. Но если вы хотите воспользоваться&nbsp;<code>localStorage</code>&nbsp;на полную катушку в вашем приложении, то я очень советую взять на вооружение библиотеку, которая облегчит сохранение и получение данных, обойдя стороной такие процессы, как парсинг и обращение в строку. В этом деле идеально может подойти проверенная в боях&nbsp;<a href=\"https://github.com/marcuswestin/store.js/\">Store.js</a>. Это моя личная рекомендация.</p>\n\n\n\n<h2 id=\"b7ea\">Заключение</h2>\n\n\n\n<p id=\"3a15\">В React&nbsp;<code>localStorage</code>&nbsp;очень просто использовать. Просто определите в каких случаях лучше сохранять и получать свои данные. Этот момент будет меняться от компонента к компоненту.</p>\n\n\n\n<p id=\"8e74\">Вообще, вы можете давать данные компонентам, как и через конструктор, так и через&nbsp;<code>componentDidMount</code>. Но учтите, что если вы собираетесь использовать конструктор, то вам надо определять стейт заранее, напрямую указав его свойства, так как&nbsp;<code>setState</code>&nbsp;метод не сработает пока не смонтируется компонент.</p>\n\n\n\n<p id=\"3744\">Если вам нужна хорошая библиотека для работы со значениями&nbsp;<code>localStorage</code>, то рассмотрите использование&nbsp;<a href=\"https://github.com/marcuswestin/store.js/\">Store.js</a>.</p>\n","type":"js","date":"2021-02-08T15:11:36.000Z","acf":{"seo_desc":"Как использовать преимущества localStorage в React? Да легко! В этой статье вы узнаете об удобстве применения локального хранилища в React приложениях.","keywords":"localStorage в React, React как использовать localStorage, localStorage, React","pub_date":"2020-02-18","tags":"React, JavaScript, localStorage"},"title":"Используем localStorage в React","id":"9245901e-e7f4-50e1-ac50-cd5e0f8b1321","excerpt":"<p>Как использовать преимущества localStorage в React? Да легко! В этой статье вы узнаете об удобстве применения локального хранилища в React приложениях.</p>\n","featured_media":{"source_url":"https://stasonmars.ru/wp/wp-content/uploads/2021/02/localStorageReactkfk.jpg"},"interesting":[{"title":"Как работать с localStorage в JavaScript","slug":"kak-rabotat-s-localstorage-v-javascript","type":"js"},{"title":"7 полезных уловок с rest параметрами и spread операторами на JavaScript объектах","slug":"7-poleznyh-ulovok-s-rest-parametrami-i-spread-operatorom-na-javascript-objectah","type":"js"},{"title":"Оператор spread и rest параметры в JavaScript","slug":"operator-spread-i-rest-parametry-v-javascript","type":"js"}]}},"staticQueryHashes":["3576131997","63159454"]}