Ответы пользователя по тегу Vuex
  • Как перезаписать данные в state, на те что приходят с backend?

    Kozack
    @Kozack
    Thinking about a11y
    Вы в мутации изменяете рутовый объект. То есть вы написали что-то в таком духе
    const state = {data: {user: ''}}
    state.user = '...' // <-- Изменяете не то поле

    Вам нужно изменять подъобект data
    const state = {data: {user: ''}}
    state.data.user = '...' // <--
    Ответ написан
    4 комментария
  • Как в компоненте вывести загруженные данные?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    Ответ написан
    Комментировать
  • Как в Vue-приложении сначала загрузить данные в $store, а уже потом рендерить шаблоны?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    Алексей,

    Ну дык за это и весь базар)))
    Я хочу, чтобы независимо от того, какую страницу открыл юзер, данные для шаблона загрузились бы первые, а потом уже выполнялся рендеринг, для которого эти данные нужны. И пусть он видит афигенный индикатор загрузки в этот момент))
    Юзер ведь может, например, сохранить у себя ссылку на какую-то внутреннюю страницу сайта, которой нужен storage. А потом её просто открыть. Как я и говорил, решение есть: условный рендеринг template через v-if, промисы в хуках и пр. и пр. И это в каждом таком компоненте. Я хочу это в одном месте сделать, и забыть о том, что нужна проверка в


    Во-первых: Абсолютно каждый компонент, должен проверять загружено ли какое-то подмножество данных без которых он не может работать. И каждый компонент должен сам решать как ему работать пока это подмножество не загружено. Что показывать что скрывать.

    Например компонент шапки может не дожидаться пока загрузится фид. И не дожидаясь пока загрузится информация о пользователе отобразить меню сайта. Или какая-то форма может полностью отобразится не дожидаясь информации об пользователе, но блокировать отправку пока эта информация не будет загружена.

    Если у вас ни один компонент не может работать пока не загрузится абсолютно все данные -- это хреновая архитектура.

    Во-вторых, если вам вот настолько чешется сделать всё в одном месте -- условный рендеринг в App в котором выполняется запрос.
    Ответ написан
    1 комментарий
  • Как разбивать модуль Vuex на части?

    Kozack
    @Kozack
    Thinking about a11y
    Выносите всё что хотите в отдельные файлы, а потом просто импортируете ...
    Ответ написан
    Комментировать
  • Как связать геттер в сторе с компонентом?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    Вы не правильно используйте Геттер.
    Геттер — это вычисляемое свойство.

    Например
    redBackgrounds: function (state) {
      return state.backgrounds // В этот момент Vue записывает state.backgrounds в зависимости для redBackgrounds
        .filter(b => b === 'red') // Вычисляется и возвращается результат
    }


    При использовании
    $store.getters.redBackgrounds // <-- Это свойство
    /*
    Функция которую мы писали выше будет запущена только один раз.
     Её результат будет кэширован. 
    Кэш сбросится только в случае если одна из зависимостей, в нашем случае это state.backgrounds, изменится. 
    Тогда наша функция-геттер запустится снова, пересчитает значение и оно снова кэшируется.
    */


    В вашем же случае геттер выглядит так:
    showBackgrounds: function () {
        return function () {} // <-- нет никаких зависимостей.
    }


    Важно отметить, что функции могут возвращаться геттерами. Но вы должны понимать в каких ситуациях это применимо и как работают геттеры
    Ответ написан
    Комментировать
  • Как использовать vuex в electron, если в приложение несколько отдельных окон?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    Вам нужен плагин. По типу vuex-shared-mutations. Он использует BroadcastChannel, что в теории может заработать в многооконном electron. Ну, а если не взлетит – вы можете написать собственную стратегию используя ipc и интегрировать её в этот плагин
    Ответ написан
    Комментировать
  • Как правильно задать начальное состояние компонента из Vuex?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    Почему я копирую данные для компоненты, так это для того, чтобы на каждое изменение инпута в компоненте - не обрабатывать на стороне Vuex

    Для таких случаев, существует debounce

    Простейший способ рекунривно скопировать объект:
    const copy = JSON.parse( JSON.stringify( source ) )


    Ну, а сохранять — вызвать action и передать в него вашу копию.
    Ответ написан
    Комментировать
  • Какие правила хорошего кода для Vue/Vuex?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    1. Да
    2. Тут всё просто: Функцция или данные нужны только в одном компоненте или в нескольких? В одном — всё в компонент. Иначе в хранилище. Сами мутации должны быть как можно легче. Они блокируют интерфейс.
    3. Чем меньше тем лучше. Любую несвязанную логику лучше выносить в отдельный компонент. Это опять таки скажется на производительности в лучшую сторону


    Ссылки:
    Ответ написан
    1 комментарий
  • Как в компоненте получить отсортированные данные из хранилища?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    Создайте ещё один геттер во Vuex и используйте его в компонентах:
    export const getters = {
      filters: st => st.filters,
      ageRatings: (state, getters) => getters.filters.age_ratings.sort((a,b) => parseInt(a) - parseInt(b))
    }
    Ответ написан
    3 комментария
  • Почему не рекомендуется делать огромное число коммитов за короткий промежуток времени?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    Собственно почему vuex не подходит для огромного числа коммитов?

    Потому что при каждом комите Vue проходится по всем зависимостям, пересчитывает их, пересчитывает состояния всех компонентов, изменяет DOM где это нужно. А это всё блокирующие операции.

    Лучше используйте EventBus : транслируйте разыне события, не просто "drag" но и "dragstart" и "dragend". Передавайте с событиями нужные координаты. И создавайте компоненты-подписчики на нужные события.

    Отдельно можете добавить тротлинг. Не большой, буквально до 100 миллисекунд. Уже это существенно уменьшит количество комитов, а интерфейс останется таким же "мгновенным"
    Ответ написан
    1 комментарий
  • Как и когда правильно использовать actions Vuex для API-запросов?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    запросы к API надо делать внутри actions Vuex (якобы это best practices). Однако, я совершенно не понимаю, всегда ли это необходимо


    state нужен в тех случаях, когда доступ к списку пользователей вам нужен не в одном компоненте, а как минимум в двух. В таких случаях без него никак.

    Если вы уверены, что список пользователей вам нужен только в одном компоненте — тогда все данные нужно хранить именно в нем.

    Важно понимать разницу:
    • Данные в Vuex "существуют" всегда и всегда занимают часть памяти на клиенте.
    • Данные в компоненте "существуют" только когда существует компонент. И будут удалены если удалится компонент.


    Если ваше приложение завязано на списке пользователей, и несколько компонентов используют эти данные, то без Vuex вам будет сложно.

    В то же время, если список пользователей вам нужен только для какого-то виджета, который отображается не всегда — тогда хранить данные в Vuex не стоит.

    См. также

    Подскажите, что делать дальше, после того как запрос ушел на сервер и мы получили ответ, что пользователь добавлен?

    Это вопрос уже совершенно другого направления.

    Создать и вызвать мутацию addUser для добавления нового пользователя в state?

    Да. Actions для того и существует, чтобы вы могли выполнить какие-то асинхронные запросы, доп проверки, валидацию данных, определить нужно ли что-то сохранить в state и если нужно — что именно. Здесь вы можете добавить пользователя, проверить добавился ли он, выполнить дополнительный запрос на извлечение информации о нем. И тп.
    А мутация — непосредственно алгоритм изменения состояния.

    в чем тогда смысл нашего state?

    Локальная, быстрая, реактивная копия данных с сервера на клиенте.

    при любом действии все равно необходимо загружать данные с сервера

    Это уже вопрос к серверу. И к его API. Есть много разных технологий синхронизации данных между сервером и клиентом.

    На самом деле я не вижу ничего плохого в том, чтобы после добавления нового пользователя выполнить обращение и загрузить новый актуальный список.
    Ответ написан
    Комментировать
  • Vuex best practies или как правильно делать?

    Kozack
    @Kozack
    Thinking about a11y
    Все данные в state должны быть логически разделены на модули. Все комиты тоже должны быть логически разделены внутри каждого модуля. Лично я предпочитаю вообще не создавать корневого хранилища — всё в подмодулях.

    Что касается валидации, то Aetae всё верно написал.

    Лично я использую следующий подход. Он не лучший, и не всегда подходящий.
    — Все компоненты вызывают только action
    — Комиты вызываются только внутрии action после всех проверок и валидаций.
    — Все комиты расчитаны на получение заведомо корректных данных.

    Таким образом:
    мутация — низкоуровневый инструмент для управления хранилищем.
    action — высокоуровневый менеджер по управлению хранилищем, который проверяет все данные, выполняет любые дополнительные манипуляции, преобразования, разбивает большие данные на части если это нужно и так далее, и только потом уже готовые данные передаёт в мутацию.
    компонент — пользователь хранилища. Которые не вызывает мутации напрямую, а вызывает только action. И в исключительных случаях может получить прямой доступ к хранилищу в обход любых проверок и изменений вызвав напрямую мутацию.
    Ответ написан
    Комментировать
  • Как сделать геттер-функцию?

    Kozack
    @Kozack Автор вопроса
    Thinking about a11y
    По итогу написал что-то такого:

    getters: {
      getPostsByCategory(state) {
        const map = new Map();
        state.posts; // Необходимо чтобы геттер пересчитывался при изменении state.posts
    
        return (catId) => {
          if (map.has(catId)) {
            return map.get(catId);
          }
    
          let posts = state.posts.filter(p => p.catId === catId);
          map.set(catId, posts);
    
    
          return posts;
        };
      }
    }


    Как это работает:
    Геттер возвращает не результат, но функцию. Эта функция фильтрует посты, и через замыкание кэширует результат. Если в любом другом компоненте потребуется список постов этой же категории — эни будут возвращены из кэша.

    При изменении state.posts — этот внутренний кэш очищается и список постов будет сформирован заново
    Ответ написан
    Комментировать