Как здорово, что вы живой, я думал что-то случилось. Вы замечательный преподователь, желаю вам успехов и по-больше баловать нас видосами, у вас талант.
@dev-workshop17 күн бұрын
Спасибо большое, мне очень приятно! С видосами напряженка, да :) Иногда постики в телеграм канал попадают, по ним проще определять, жив я или нет :)
@lokerfray6147Ай бұрын
якби українською... но круто дякую тобі
@dev-workshopАй бұрын
Если бы я знал... Спасибо и тебе за комментарий!
@RomanDawydkinАй бұрын
Вместо объекта со значениями true надо использовать Set
@dev-workshopАй бұрын
@@RomanDawydkin до определенной версии у вью были проблемы с реактивностью в сетах
@r35p3ct002 ай бұрын
Пора выпускать ролик 😁
@flipper-limon3 ай бұрын
Написал комментарий) где видео с кастомной директивоЙ?
@eg0ist_6653 ай бұрын
такое себе объяснять просто написанный код - думал с нуля будем делать поэтапно смотреть что получается
@dev-workshop3 ай бұрын
Ну во первых этот код написал я Во вторых это обзор на нпм пакет в третьих очень долго делать поэтамно, такие штуки, обычно на стримах в четвертых - сделай лучше, я верю, что у тебя получится так, как хочешь ты
@eg0ist_6653 ай бұрын
@@dev-workshop есть ребята которые crm создают и видосы по 7 часов )) а тут мы говорим про компонент аккордеона ) Мне было интересно, как ты сделаешь по шагам, чтобы видеть всю картину, но ты поленился)
@dev-workshop3 ай бұрын
@@eg0ist_665 А давай теперь посмотрим, пользуется ли кто-то этими crm? а пользуется ли кто-то библиотекой компонента? Если бы я поленился, то ни видео ни компонента не существовало бы
@eg0ist_6653 ай бұрын
@@dev-workshop дело не в этом вообще, я тебе высказал свое мнение о том, что показывать просто готовый результат и его комментировать не интересно смотреть, особенно новичкам. Кому интересно пусть смотрят)
@dev-workshop3 ай бұрын
@@eg0ist_665 Спасибо за твое мнение
@ВладимирОков-и1с4 ай бұрын
Слишком всё усложнено. Можно сделать телепорт спиннера сразу в корень body и он будет поверх всего контента. Далее назначаем переменную: let isSpinner = ref(false); - тип можно не указывать, т.к. явно задано начальное значение. Таким образом, в исходном состоянии спиннер не виден. <teleport to="body"> <AppSpinner v-if="isSpinner" /> </teleport> Следующий шаг. Меняем значение isSpinner в функции получающей данные. const getSomeData = () => { // показываем спиннер isSpinner.value = true; try { // Далее код получающий и обрабатывающий некие данные с сервера или из стора } catch (err) { console.log(err) } finally { // теперь убираем спиннер isSpinner.value = false; } } Вызов компонента спиннера можно разместить в основном HTML-файле. А чтобы доступ к isSpinner был из любого компонента или лейаута, можно добавить isSpinner в store. Тогда не нужно будет усложнять код провайдами и инжектами. Можно сделать точку назначения переменной <teleport :to="destination"> и в переменной destination указывать, в корень какого элемента хотите переместить спиннер.
@ESTechnonet5 ай бұрын
Самый имбовый способ разделить роли - разные url для разных ролей. Все остальное (в том числе то, о чем говорит автор) для очень простых приложух.
@dev-workshop5 ай бұрын
Ну вот здесь я бы поспорил) Возьмем TeamCity, явно не очень простое приложение или гитлаб В зависимости от разных доступов на одной странице в интерфейсе, даже в одной менюшке есть разный набор кнопок
@ESTechnonet5 ай бұрын
@@dev-workshop я тут не прав в том смысле что слово "простые" тут не подходит. Ща попробую сформулировать точнее: если у вас интерфейс админа и юзера отличается целиком а не только лишь парой кнопок и менюшкой, то имеет смысл опереться о url ролевую модель. Это не подойдет лишь в случае если религия не позволяет наблюдать "/userRole/dashboard" в адресной строке. В остальном композиция компонент позволяет прекрасно переиспользовать код и не париться по поводу прав. Я не говорю что та модель которую вы рассмотрели не жизнеспособна, нет, она прекрасно работает но только в ряде случаев.
@dev-workshop5 ай бұрын
@@ESTechnonet Дополнив текущую реализацию можно сделать ограничения и по урлам, такми образом будет комбинированная система для накста очень удобно через pageMeta ограничивать доступы и мидлваркой их отлавливать
@soulwind75775 ай бұрын
Я мб не внимательно смотрел, а чем не устраивает стандартная реализация vue-router ? ``` { path: '/', component: LayoutDefault, name: 'Layout Default', children: [ { path: '/', component: ViewHome, name: 'Home' }, { path: '/example/:id', component: ViewExample, name: 'Example' }, ] }, ```
@mster_r5 ай бұрын
Вопрос, при такой системе лейаутов, если обновлять страницу то прокрутка страницы возвращается в самое начало. В других проектах, если ты прокрутил допустим до середины, то после F5 страница туда же возвратится. Как можно исправить?
@dev-workshop5 ай бұрын
@@mster_r воспользоваться другими системами лейаутов, про которые вы написали?)
@mster_r5 ай бұрын
@@dev-workshop но мне нравится эта система, да и нет других на примете) Я имел ввиду обычное поведение браузера, под другими проектами. Просто неожиданное неудобство такое тут возникло, думал может известно решение. Или может подскажешь как бы решил, в какую сторону подумать?
@mster_r5 ай бұрын
@@dev-workshop А может вообще я сам где напортачил, и проблема не от лейаутов. Встречалось ли тебе такое?
@dev-workshop5 ай бұрын
@@mster_r все очень индивидуально, нужно смотреть проект и его код) всегда можно что-нибудь придумать, например хранить в sessionStorage последнее значение позиции скролла и потом при маунте заставлять браузер скролиться на эту позицию)
@mster_r5 ай бұрын
@@dev-workshop понял, спасибо, тоже думал в эту сторону. Для меня показательно уже то, что с проблемой скроллинга столкнулся только я)
@user-hruser6 ай бұрын
на сколько обоснован динамичесикй импорт? прочему не обычный?
@dev-workshop6 ай бұрын
на столько же, на сколько обоснован code splitting
@olegvoron68477 ай бұрын
Что то всёравно плохо работает этот метод, dts у меня так и не собрался. Видимо, придётся отложить напотом эту задачку.
@grefrewhtr7 ай бұрын
Сергей, большое спасибо вам за данное видео, оно прекрасно! Показана проблема, показаны разные варианты решения, их плюсы и минусы, разобрана реализация каждого подхода, идеально! Жаль, что вы делаете так мало контента, у вас определено талант!
@dev-workshop7 ай бұрын
Большое спасибо, мне очень приятно!) Проблемы с распределением времени, нужны помощники в монтаже)
@svet0v7 ай бұрын
Интересное видео, спасибо
@benrise47758 ай бұрын
Шикарно!! Спасибо
@dev-workshop8 ай бұрын
Пожалуйста)
@fluffyartdev8 ай бұрын
Видео полезное, для новичком будет очень здорово, но есть пара нюансов: 1. Глобальный скоуп работает только в рамках шаблона. В скрипте все равно придется доставать хуком или еще как-либо. 2. В данном случае, хоть сама задача авторизации и является глобальной, все таки стоит еще задуматься о том, чтобы сделать хуки импортить от туда хук + енам. Тем более, если делать директиву или компонент обертку, то это уже не выглядит таким накладным)
@dev-workshop8 ай бұрын
1. Полностью согласен, это была распространенная практика со 2 вью, в третьем она почти забыта 2. Такой задачи не стояло, видео и так объемное)
@VolodymyrSirenko9 ай бұрын
Информативные видео для новичков! Спасибо!
@dev-workshop9 ай бұрын
Пожалуйста) Подписывайся на канал в телеге)
@adiletomurbekov93009 ай бұрын
Здравствуйте, можете сделать пожалуйста видео про авторизацию.
@dev-workshop9 ай бұрын
Здравствуйте, может быть ближе к лету, если найду редактора для видео
@Vladislav14499 ай бұрын
Привет! Очень жаль, что видео перестали выходить довольно продолжительное время😢 Надеюсь, еще появится тут новый, полезный контент!❤
@dev-workshop9 ай бұрын
Привет! Может быть если я найду того, кто будет монтировать видосы, тогда наладится регулярность ))
@kalyszhek529610 ай бұрын
Ты мне открыл глаза. 😳🥹 Но я нифига не понял, но к этому иду. Я начинающий. 😅 Пойду посмотрю все видео. Надеюсь есть где пишешь все это..
@Dikodance11 ай бұрын
Эх, где это видео было раньше. Столько времени убил чтоб самому допереть до этого)) спасибо. Ещё удобно добавить группы скоупов, особенно если из много и юзеры сами будут рулить доступами
@dev-workshop11 ай бұрын
группы скоупов это уже роли) но мы тоже делали группы, но только чтобы отобразить группой в интерфейсе, а у пользователя связи были только со скоупами)
@Dikodance11 ай бұрын
@@dev-workshop думаю все зависит от сценария. Я пилю щас crud saas и там например у каждого аккаунта рожаются роли и дефолтные пермишены. и если взять скажем роль админа который имеет доступ везде то там без групп получится что надо назначать простыню доступов на пару экранов) а если таких ролей будет несколько то все резко станет сложно) а так я завел группы и если юзер может все с crud сущностью то просто вешаю на нее группу. но в конце концов с бека оно конечно выпрямляется все и фронту прилетают только пермишены.
@dev-workshop11 ай бұрын
@@Dikodance интересное решение. Да, я скорее к тому, что с бека прилетал один тип сущностей, по которому определяются доступы. Для единообразия
@antonnevskiy3027 Жыл бұрын
Полезное видео, спасибо! Жаль, не так много контента на канале
@dev-workshop Жыл бұрын
Привет! Спасибо, в связи с работой сложно выделить время на видосики
@kumb61 Жыл бұрын
Ну такой себе спиннер, скорей как у деда старого
@dev-workshop Жыл бұрын
Что именно тебе не нравится в данной реализации?
@БехрузАбдувалиев-н5и Жыл бұрын
🔥🔥🔥
@izzy7541 Жыл бұрын
А нужна ли вообще директива для доступов? По моему получится велосипед в виде кастомного v-if
@dev-workshop Жыл бұрын
Скорее философский вопрос) Да, это будет кастомный v-if. Да, можно использовать просто v-if. Но идея директивы для доступов разделить условное отображение связанное с бизнес логикой и условное отображение связанное с ролевыми доступами Плюс по такой директиве легко прочитать доступы прям в шаблоне, тогда как условия v-if часто заворачиваются в компьютед свойства, для которых нужно лезть в код
@Screxyy Жыл бұрын
Посмотрев это видео, понял сколько мне еще учиться xDD
@stanislav_ovv Жыл бұрын
А если допустим это ui-kit в котором сборник компонентов, то как их экспортировать? И есть такие случаи когда компоненты сборные, состоящие из нескольких из этой же библиотеки.
@dev-workshop Жыл бұрын
Можно докрутить файлик buildLibrary.ts Для публикации библиотеки компонентов я бы пользовался этим видео в ознакомительных целях, и докручивал бы под себя
@stanislav_ovv Жыл бұрын
@@dev-workshopтам просто когда экспортируем компонент в котором есть зависимости от других компонентов. То при импорте в другом проекте такого компонента вылезает предупреждение ('[Vue warn]: resolveComponent can only be used in render() or setup().') и получается что сборный компонент нормально не отрабатывает.
@dev-workshop Жыл бұрын
@@stanislav_ovv очевидно, что для компонентов с зависимостями нужны каки-то изменения
@stanislav_ovv Жыл бұрын
@@dev-workshop Проблема решилась, что в том проекте где импортировали ui-kit в конфигурации вебпака надо было прописать алиас, resolve:{ alias:{ vue: path.resolve('./node_modules/vue') } }
@stanislav_ovv Жыл бұрын
@@dev-workshop А так сделали первую версию UI-KIT по тому же принципу, что описан в видео, только на JS. Следующий шаг наверно будет Storybook и TS
@user-quasarDiO Жыл бұрын
Крутая тема , давай продолжение , видео понравилось !!!
@shahid1508 Жыл бұрын
Динамические группы/роли/скоупы то еще зло на деле, хоть и звучит красиво и как бы логично))
@dev-workshop Жыл бұрын
Я согласен, но иногда от этого никуда не уйти)
@artemijeka Жыл бұрын
Спасибо автору! Круто когда люди делятся открытиями с обществом) Мне интересна тема для следующего видео) если конечно вопрос стоящий: насколько успешно поисковик считывает контент с SPA приложений и как лучше подавать контент для поисковика в vuejs?
@dev-workshop Жыл бұрын
Привет! Спасибо!) Практически не на сколько. Хоть все и говорят, что вот вот индексаторы научатся в спа - это все не правда Все, что должно попасть в индексацию должно быть ssr
@grigoriy-iceicebaby2985 Жыл бұрын
Классный контент, помогает, продолжение этой части с тайпскриптом нужно!
@HalauLilau Жыл бұрын
С этим лайоут системой столкнулся на такое когда меняется хэш (window.location.hash) загружает снова лейоут и страница фризится
@dev-workshop Жыл бұрын
Надо смотреть, что в этот момент происходит с роутером вьюшным
@HalauLilau Жыл бұрын
@@dev-workshop Страница состоит из двух блоков ЛЕВАЯ часть просто список линков по клику вызывается функция которая ищет в DOM element(ПРАВАЯ часть) если находит делает scroll ПРАВУЮ часть и потом добавляет в адрес localtion.hash = '#somehash' (пробывал и $router.push({hash:''})
@olegycholegych1920 Жыл бұрын
ты лучший ❤
@Эдуард-п2у Жыл бұрын
Скажи пожалуйста, а во "Vue" отладки сродни той что есть для js не существует? В случае с js в браузере зашел в devtools -> источники -> выбрал файл и вперед, можно по шагам смотреть как где чего работает. Как в случае с vue такие вещи смотреть? Просмотра состояния переменных vue через Vue Devtools несколько недостаточно как по мне..
@dev-workshop Жыл бұрын
Эта отладка никуда и не ушла) пропиши в нужном тебе vue файлике "debugger;" и открой devtools в хроме и будет тебе счастье
@АртемАртеменконезабывайвыходит Жыл бұрын
сделаешь подробнее уроки с vue laravel по этой теме?
@dev-workshop Жыл бұрын
Привет! Я не особо умею в PHP :( по этому скорее нет. Плюч видео сейчас временно не выходят
@sakensatenov Жыл бұрын
Видос очень классный и суперский! Хотелось бы видеть такое же видео, только про модалок (как в видео). Как по мне они очень нужны в любом проекте, и важно чтобы была такая же крутая реализация модалок, которую можно использовать в vue 3 или vue 2
@dev-workshop Жыл бұрын
с модалками интересно, да) Рад что понравилось!) Сейчас есть некоторые сложности со временем, но я добавлю в список)
@mikhailwalle9556 Жыл бұрын
Привет! Пытаюсь применить указанный 3-ий способ с воем проекте. <Component :is="route.meta.layoutComponent"> <slot /> </Component> Тут TS ругается на "route.meta.layoutComponent": Type VueElement | undefined is not assignable to type string | ComponentDefinition Буду благодарен за комментарий.)
@dev-workshop Жыл бұрын
Привет! А ты не забыл? declare module "vue-router" { interface RouteMeta { layout?: AppLayoutsEnum; layoutComponent?: VueElement; } }
@albertsaitov7463 Жыл бұрын
Топич, спасибо большое за ролик
@dev-workshop Жыл бұрын
Рад, что понравилось)
@grantorino3465 Жыл бұрын
Огонь!
@dev-workshop Жыл бұрын
Рад, что понравилось)
@HalauLilau Жыл бұрын
Есть лайот шапка внутри инпут с выпадающию меню и у каждой страницы выпадающию меню свой. Как реализовать такое отношение?
@dev-workshop Жыл бұрын
либо через внешний стор, либо сделать композабл с замыканием состояния и на каждой странице обновлять данные для выпадашки
@HalauLilau Жыл бұрын
@@dev-workshop замыкание состояние страницы?
@dev-workshop Жыл бұрын
@@HalauLilau нет, пишешь замыкание внутри которого используешь, грубый пример const dropdownData = useRef(); export function useLayoutDropdown() { function updateData(newValue) { dropdownData.value = newValue; } return reactive( { dropdownData, updateData }) } затем в лейауте вызываешь useLayoutDropdown и используешь из него данные и на страницы используешь useLayoutDropdown и обновляешь данные. Но это очень грубый пример, здесь получается синглтон, который нельзя использовать, если у тебя ssr Но никто не мешает создать такое замыкание в контексте запроса
@dev-workshop Жыл бұрын
@@HalauLilau еще можно рулить данными для выпадашки на уровне роутера
@HalauLilau Жыл бұрын
@@dev-workshop у меня ssr нет. Оказывается не только данные и иинпуты и селекты разные. Например страница клиент там в дропдауне фильтр поле дата, город, номер. А проектах другие поля в дродауне
@K1appy Жыл бұрын
офигенный контент, пожалуйста не забрасывай канал, очень полезные видео, а не просто пересказ доков или объяснения как через v-for список вывести !
@dev-workshop Жыл бұрын
Привет! Спасибо за отклик! Я постараюсь, но со временем очень большая напряженка
@zergzerg4844 Жыл бұрын
Не пойму к чему такие сложности. Можно же проще написать и принцип mount/unmount лайота с компонентами такой же будет: в App.vue <router-view /> в router.js (все компоненты пихаем в children нужного layout) const routes = [ { path: '/', name: 'baselayout', component: BaseLayout, meta:{ layout: BaseLayout }, children: [ { path: '/page1/', name: 'page1', component: () => import('@/views/Page1.vue') }, { path: '/page2', name: 'page2', component: () => import('@/views/Page2.vue') }, ] }, { path: '/guard', name: 'guard', component: () => import('@/views/guard/GuardIndex.vue'), meta:{ layout: AdminLayout }, children: [ { path: '/page3.', name: 'page3', component: () => import('@/views/Page2.vue') }, ] }, ]; в BaseLayout.vue (transition конечно здесь лишний. просто допом оставил) <Header /> <router-view v-slot="{Component, route}"> <transition name="slide" mode="out-in" > <keep-alive> <component :is="Component" :key="route.path" /> </keep-alive> </transition> </router-view> <Footer /> И все работает и при хождении по дочерним вьюшкам layout не размонтируется каждый раз, а только тогда пока перехожу на дочернюю вьюшку другого layout. Глюков с переходами при таком подходе пока не увидел. Автор, поправьте, если что-то не так с таким подходом, так как не очень хорошо шарю за vue. Спасибо за видео
@jozefmaslovsky9270 Жыл бұрын
Интересненько!!! Спасибо, тебе, добрый человек!
@dev-workshop Жыл бұрын
Рад, что понравилось!
@technews2324 Жыл бұрын
Спасибо!
@dev-workshop Жыл бұрын
Пожалуйста:)
@АлександрСударев-ж1г Жыл бұрын
Спасибо! Очень круто!!!!
@dev-workshop Жыл бұрын
Рад, что понравилось)
@sakensatenov Жыл бұрын
Вопрос (оффтоп): у меня есть layout (шапка и футер) В котором есть компонент (страница с данными). В шапке тоже есть свои данные, все прекрасно работает. Но я хочу передать некоторые данные из чайлд компонента в layout, дабы отобразить инфу про страницу в layout. Не хочу лезть в vuex. Как можно передать данные из чайлда в layout?
@dev-workshop Жыл бұрын
Это плохая практика, лучше делать это каким-то отдельным инструментом. Но как вариант, можно воспользоваться либо ивентбасом Либо сделать синглтон композобл и воспользоваться им в шапке и на странице. Но это плохая практика, столкнетесь со многими проблемами :)
@sakensatenov Жыл бұрын
@@dev-workshop ок спасибо
@DenisB-d5f Жыл бұрын
зря перестал видосы выпускать реально кайфовые
@dev-workshop Жыл бұрын
Спасибо! Скоро будут еще
@grantorino3465 Жыл бұрын
а почему в последнем подходе сперва маунтится шаблон страницы, а потом после него шаблон леяута, если страница - это дочерний компонент леяута?
@dev-workshop Жыл бұрын
Потому что сначала маунтятся самые глубокие дети и потом всплывает наверх) medium.com/@brockreece/vue-parent-and-child-lifecycle-hooks-5d6236bd561f
@sezarik1663 Жыл бұрын
Привет. Классный контент пилишь). А можешь про модульную архитектуру запилить видос? Заранее пасяб)
@dev-workshop Жыл бұрын
Привет! Спасибо! А что ты имеешь в виду под модульной архитекторой? Разделение приложения на модули?