• Как сохранять выбранные пользователем элементы каталога?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Элементы games должны иметь уникальное свойство, которое бы позволяло их идентифицировать, id. Если такого нет - срочно добавляйте. Сохранять в localStorage следует эти id. Так что добавим в стейт соответствующий массив:

    state: {
      wishlistIds: [],
      ...

    И укажем его в настройках persistedstate (да, можно сохранять не весь стейт, а только некоторые элементы):

    plugins: [
      createPersistedState({
        paths: [ 'wishlistIds' ],
      }),
      ...

    Массив wishlist - из стейта переносим в геттеры:

    getters: {
      wishlist: state => state.games.filter(n => state.wishlistIds.includes(n.id)),
      ...

    Добавление/удаление, соответственно:

    mutations: {
      addGame(state, gameId) {
        if (!state.wishlistIds.includes(gameId)) {
          state.wishlistIds.push(gameId);
        }
      },
      removeGame(state, gameId) {
        const index = state.wishlistIds.indexOf(gameId);
        if (index !== -1) {
          state.wishlistIds.splice(index, 1);
        }
      },
      ...

    В компонент, отображающий элементы games, добавим вычисляемое свойство liked, которое будет указывать, находится ли текущий элемент в wishlist и управлять добавлением/удалением:

    computed: {
      liked: {
        get() {
          return this.$store.state.wishlistIds.includes(this.game.id);
        },
        set(val) {
          this.$store.commit(val ? 'addGame' : 'removeGame', this.game.id);
        },
      },
      ...

    <button @click="liked = !liked" :class="{ liked }" class="like"></button>

    Ну а свойство isLiked и метод putLike - это мусор, их следует вырезать.
    Ответ написан
    Комментировать
  • Как сбросить фильтр?

    kleinmaximus
    @kleinmaximus
    Senior Full-stack Javascript Developer
    Первое, и самое важное - не привязывайтесь к событиям DOM! Используйте обработчики событий Vue. Зачем с реактивными фреймворками типа Vue, React, Angular работать в стиле jQuery?

    Уберите все из mounted(), кроме вызова dispatch.
    Сделайте нормальную обработку событий.
    В противном случае вся реактивность убивается.

    И классы тоже надо выводить через computed свойства (на крайний случай через data), а не вставлять императивным методом.

    <template>
       ...
       <button id="s" class="toggle-search" v-on:click="clear"></button>
       ...
    </template>
    
    
    export default {
      // ...,
      methods: {
        clear() {
          this.search = '';
        },
      },
      // ...,
    };

    Еще в store надо завести флаг статуса (не готов, готов, загружается, загружено...), чтобы соответствующим образом отображать всякие лоадеры, спиннеры и пр.. Думайте о пользователе сразу!

    И советую подробно ознакомиться с документацией по Vue - она на понятном русском языке!
    Ответ написан
    Комментировать
  • Как сбросить фильтр?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Теряете контекст в обработчике click (Home.vue), так что search там у вас - вовсе не свойство компонента. Сделайте функцию стрелочной (это чтобы вот прям сейчас заработало, а реально - весь этот шлак в mounted надо переписывать, откройте документацию vue, и разберитесь, как назначать обработчики событий, добавлять/удалять классы и т.д.).
    Ответ написан
    1 комментарий
  • Как сделать такой псевдоэлемент?

    qork
    @qork
    { background: #F00B42 }
    Комментировать