Pull to refresh
21
0
Никита Коробочкин @NikitaKA

User

Send message

Более того, он уже успел (неделю назад) объявить о том, что делает перерыв в гонках, потому что устал и перестал получать удовольствие...

У меня WebStorm последней версии. Посмотрите, может у вас TS не настроен?.. Либо VSCode как альтернатива — он работает с TS идеально.
В моем случае при настроенной IDE (в т.ч. и в консоли вылетает) я получаю вот такой результат:

image
По идее, TS можно настроить так, что он практически ни на что не будет ругаться. Это позволит прозрачно перейти на TS без изменения кода. Особенно мне понравилось, что когда ты основательно типизируешь всякие сущности, то IDE в дальнейшем сразу подсказывает тебе какие есть ключи, что можно использовать сразу, а что надо проверить на null и т.д… В итоге отладки стало в разы меньше. (Понятное дело, что это могут решить тесты, но вы же понимаете...)
Я, возможно, не правильно вас понял. Ответ лежит на поверхности: гарантии обеспечивает модуль vuex-smart-module, который берет на себя эту работу. Он предоставляет классы, которые через дженерики расширяются соответсвующими типами. В примере в статье видно, как это происходит. Таким образом, если вы попытаетесь указать в commit несуществующую мутацию, то Typescript вам об этом сообщит, подсветит место и подскажет, что не так. То же самое касается и принимаемых наборов аргументов.

Гарантия существования мутации и принимаемых аргументов:
class AppMutations extends Mutations<AppState> {
  setCategories(categories: Category[]) {
    this.state.categories = categories;
  }
}

class AppActions extends Actions<
  AppState,
  AppGetters,
  AppMutations,
  AppActions
> { /* ... */ }


Вот пара файлов, в которых можно увидеть, как это реализовано: раз, два.
Примерно вот так (вырезал кусками и кое-что поменял, прошу прощения, если что-то упустил):
export type Category {
  attributes: {
    hasPrice: boolean;
    icon: string;
    lvl: number;
    name: string;
    slug: string;
  };
  id: number;
}

export interface IParams {
	city_id: number
}

class AppState {
	categories: Category[] = [];
}

/* ... */

class AppMutations extends Mutations<AppState> {
  setCategories(categories: Category[]) {
    this.state.categories = categories;
  }
}

class AppActions extends Actions<
  AppState,
  AppGetters,
  AppMutations,
  AppActions
> {
  async getCategories({params}: {params: IParams}): Promise<Category[]> {
    return categoriesAPI.get({params}).then(
      ({ data: categories }: { data: Category[] }) => {
        this.commit("setCategories", categories);

        return categories;
      }
    );
  }
}


Обновил статью. Спасибо, что указали на промах.
Признаться у меня в воспоминаниях осталось только что-то вроде «не сработало». Если мне не изменяет память (это было около 4-х месяцев назад) я пытался использовать модуль внутри модуля… Либо архитектура приложения что-то не позволяла сделать. Еще возможно, что были проблемы с типизацией, которые могли быть из-за неполноценной на тот момент поддержки IDE (WebStorm) Typescript (после недавних обновлений стало намного лучше). На vuex-smart-module остановился потому что он позволил все реализовать без танцев, ошибок и нетривиальных конструкций. А может все было просто из-за моей не опытности. Но могу наверняка сказать, что с моей небольшой подготовкой (на тот момент) именно этот модуль оказался идеальным инструментом, с которым удалось сходу (почти) начать работать.
У меня, например, в сторе хранится пользователь с полем, которое описывает его права:
user: {
  roles: ['IS_ADMIN', 'IS_COMPANY', 'IS_USER'],
  ...
}

В сторе у меня есть глобальный геттер, который определяет, является ли пользователь админом:
isAdmin() {
  return this.state.roles.includes(Roles.ROLE_ADMIN);
}
Соглашусь, что в случае необходимости данных только внутри компонента, хранить эти данные (а если их еще и мутировать надо — то это еще и дополнительные экшены/мутации) в сторе — это оверхед. У меня реализация примерно такая же, как вы и предложили, единственное что у меня не фабрика, а файл с набором методов-промисов, которые я импортирую в стор если это нужно хранить глобально, либо, если это «локальные нужды» компонента, то импортирую метод прямо в компонент и там работаю с результатом. Надо будет задуматься над преимуществами реализации в виде фабрики…

С флагами тоже поддерживаю, а ведь именно так раньше я и делал. Управление флагами загрузки оказалось гораздо более гибким и очевидным если оно реализовано внутри компонента, а не стора.

You specified couple of Vuex libraries. And I don't found library which I'm using last months: vuex-smart-module, its developed by one of the main Vuex contributors.

Как бы вы рекомендовали решить проблему обращений к апи внутри экшенов? Я сам этим грешил поначалу, но впоследствии стал выносить всю логику обращения к апи в отдельную либу, свою для каждого модуля. В итоге внутри экшена у меня идет вызов импортированного метода, возвращающего промис с которым я дальше уже работаю. В экшенах чисто, а все апи как на ладони в отдельном файле.

Да уж, посмотрел как добавить «уголок» во вьюху… Четыре страницы мануала. Тяжело, конечно, сравнить с преимуществами WebView, но я понимаю, что Flutter из мира нейтива, тут ничего не поделаешь. Вообще, признаться, производительность вебвьшных приложений в т.ч. зависит от того, насколько качественный и оптимизированный код ты пишешь. Запускаем приложение на андроид за 5к рублей какого-то noname-производителя — работает не медленнее главного экрана телефона. Просто было интересно, раз полгода смотрю что там появляется нового в области кроссплатфоменности. WebView приложения удобны тем, что под них, имхо, проще найти специалиста со знанием JS, которого еще и на других веб-проектах можно использовать, где нужен JS. Я ни в коем случае не хочу спорить, просто проходил мимо.
Интересно, как там обстоят дела с кастомом? Если с вебвью все понятно (использую Framework7 и Vue), то как мне, например, кастомизировать элемент? Как выполняется стилизация, верстка компонентов?
Спасибо за ценный комментарий.

Подскажите, пожалуйста, по аргументам в ваших примерах: scope:'root'/'isolate' — в документации написано, что аргументы могут быть true/'isolate', но в ваших примерах используется 'root', который ведет себя как-то по-особенному, а все остальное (true, 'isolate', 'foo') ведет одинаково.
Так же не сказано про самую главную «оптимизацию» — компонентный подход

Не могли бы вы привести пример?
Понял, спасибо. Просто было интересно.
Самое интересное, что то, куда надо дважды кликнуть для получения режима «полный размер», так и осталось загадкой. :) Просто чисто из любопытства было интересно попытаться понять проблему и решить задачу иным путем. Можно было бы, например, не убирать dblclick, но при этом по одинарному щелчку (по превью) показывать какую-то иконку поверх окна, приглашающую в «полный размер».
Не совсем понял где на вашем скриншоте нужно кликать дважды. На уменьшенных превьюшках, верно? А что будет, если я просто кликну на превью, без двойного клика?
У Вас излишне сложно, хотя более правильно. Но это далеко не всегда нужно.

Единственный раз столкнулся с реальной необходимостью двойного клика при работе с canvas. Ключевым моментом было отслеживать не только время между кликами, но и смещение курсора: активно работая с инструментом click per second может просто зашкаливать.

Что касается dblclick, то всегда стараюсь уходить от использования его при проектировании интерфейсов, т.к. он, как минимум, не очевиден.
откуда взялось micros()

Это вшитая функция, есть еще millis(), например.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity