Счетчик «localStorage»

в этом счетчике я хочу сохранить номер в localStorage, подскажите в чем ошибка почему он не сохраняется в памяти

const app = Vue.createApp({
  data() {
    return {
      counter: 0,
    };
  },
  methods: {
    getItem() {
      localStorage.setItem('count', this.counter);
      return localStorage.getItem('count');
    },
  },
}).mount('#app');
  <div id = "app">
      <h2>{{getItem()}}</h2>
      <button @click = "counter--">-</button>
      <button @click = "counter++">+</button>
    </div>

когда вы звоните getItem вы постоянно сбрасываете значение на 0

Derek Pollard 11.05.2022 18:26

когда я вызываю «счетчик», он также сбрасывает значение на 0

Java Script 11.05.2022 18:32

Я думаю, что vue не перезапускает функцию getItem, поэтому она выглядит устаревшей.

Derek Pollard 11.05.2022 18:37

возможно, стоит также отметить, что вы не можете напрямую «смотреть» локальное хранилище на наличие изменений без тонны дополнительного кода.

Derek Pollard 11.05.2022 18:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
56
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Проблема здесь в том, что всякий раз, когда страница загружается, и вы вызываете getItem(), вы сбрасываете localStorage.count = 0, поскольку он автоматически инициализируется до 0.

Вместо этого сделайте что-то вроде этого:

const app = Vue.createApp({
  data() {
    return {
      counter: localStorage.getItem('count') || 0,
    };
  },
  watch: {
    counter() {
      localStorage.setItem('count', this.counter);
    }

  },
  methods: {
    getItem() {
      return localStorage.getItem('count');
    },
  },
}).mount('#app');

Таким образом, вы устанавливаете начальное значение на значение из хранилища; и наблюдая за этим значением для изменения, а затем обновляя localStorage, чтобы отразить правильное значение, хранящееся в окне.

Это решение должно работать для вас:

Вот улучшенная версия:

В этом решении я использовал тернарный оператор, который сначала спрашивает, существует ли свойство счетчика в локальном хранилище, если нет, то счетчик будет инициализирован со значением 0, если счетчик есть, он получит значение и проанализирует это значение до значения int как все значения в локальном хранилище сохраняются как строки.

Итак, если вы суммируете значение, строка будет делать следующее:

шаг: 1

counter = '0';

шаг: 2

counter++

на этом шаге счетчик будет преобразован в целое число, но все равно будет равен 0;

Вместо этого, если вы сделаете то, что я кодирую

шаг: 1

counter = parseInt('0');

шаг: 2

counter++, счетчик в первый раз будет 1

Поскольку этот код предназначен для vuejs версии 3, фрагмент не будет работать.

const app = Vue.createApp({
  data() {
    return {
      counter: localStorage.getItem('count') ? parseInt(localStorage.getItem('count')) : 0,
    };
  },
  watch: {
    counter(newQuestion, oldQuestion){
      localStorage.setItem('count', newQuestion)
    }
  },
}).mount('#app');
<div id = "app">
   <h2>{{counter}}</h2>
   <button @click = "counter--">-</button>
   <button @click = "counter++">+</button>
</div>

Используйте вычисляемые свойства. Так что вам не нужны методы, наблюдатели или данные

const app = Vue.createApp({
  computed: {
     counter: {
        get() {
           return localStorage.getItem('count') || 0
        },
        set(val) {
           localStorage.setItem("count", val)
        }
     }
  },
}).mount('#app');

Другие вопросы по теме