На это я потратил месяц своей жизни. Надеюсь это все будет не зря) Спасибо за курс, это было познавательно, а главное ненапряжно. И главное - все обьяснялось.
@katenka_katrusya2 ай бұрын
делала сохранение в LS в середине курса. Всю логику сделала в редаксе в слайсе корзины. Поняла теперь, что так делать нельзя, а я думала какая ж я молодец. P.S. Переделала всё на Persist, а это оказалось куда круче, чем голый localStorage 😀
@IvanCrazyArchangelsk8 күн бұрын
Очень крутые уроки! Только я, как новичок, стараюсь черпать не детали реализации, а концептуальный список фич и проблем в реальном продакшене. Мои собственные изыскания по теме урока (намёки и подсказки): 1. Сохранение корзины: решил вопрос без persist. Обратите внимание на опцию preloadedState и метод стейта subscribe. Между ними можно вложить собственный миддлвер на 10-15 строк кода вместо подгрузки целой библиотеки. 2. По структуре проекта: в директории src создал директорию types, в которой разбивка по сущностям проекта. Преимущества: IDE отдельно окрашивает и подписывает иконку директории, все созданные сущности типов и интерфейсов внутри этой директории не нуждаются в экспорте/импорте. 3. Хоть интерфейсы более гибкая штука, но лучше, по возможности, создавать типы. Так IDE будет подсвечивать структуру аннотации типов при наведении на неё в коде, не нужно будет постоянно обращаться в исходное описание. А интерфес IDE просто подсвечивает, как интерфейс.
@Ari0tee8 ай бұрын
Еще кое-что нашел. Если мы удаляем из cart "item", через removeItem, то в totalPrice у нас остается ранее добавленное число (стоимость). А также в totalPrice не меняется значение. Добавьте это в редуюсер removeItem //после удаления элемента из массива items, значение totalPrice будет пересчитываться на основе обновленного массива items state.totalPrice = calcTotalPrice(state.items);
@АнтонБуйнов-м3й Жыл бұрын
Курс успешно пройден. Автору респект. Пошел фиксить навигацию по URL и исправлять косяки с адаптивом
@Калабарака10 ай бұрын
Можно накатить Persist в Store, чтобы обойти этот урок. import { configureStore } from '@reduxjs/toolkit'; import filter from './slices/filterSlice'; import cart from './slices/cartSlice'; import pizza from './slices/pizzaSlice'; import { useDispatch } from 'react-redux'; import storage from 'redux-persist/lib/storage'; import { persistReducer, persistStore } from 'redux-persist'; import thunk from 'redux-thunk'; const persistConfigPizza = { key: 'pizza', storage, }; const persistConfigCart = { key: 'cart', storage, }; const persistConfigFilter = { key: 'filter', storage, }; const persistedReducerPizza = persistReducer(persistConfigPizza, pizza); const persistedReducerCart = persistReducer(persistConfigCart, cart); const persistedReducerFilter = persistReducer(persistConfigFilter, filter); export const store = configureStore({ reducer: { persistedReducerPizza, persistedReducerCart, persistedReducerFilter }, devTools: process.env.NODE_ENV !== 'production', middleware: [thunk], }); export const persistor = persistStore(store); export type RootState = ReturnType; export type AppDispatch = typeof store.dispatch; export const useAppDispatch: () => AppDispatch = useDispatch; и в index или APP ,
@matvienko_p9 ай бұрын
ооо🔥 чит-коды в комментариях 😁
@dvornicked2 жыл бұрын
Необоснованный буллинг Алисы, но мне нравится! Лайк
@ПавелСтародубцев-ц6ш Жыл бұрын
Очень хорошо что Денис объясняет ,как делают в реальной разработке и приводит примеры
@ВикторБелянкин-м1щ Жыл бұрын
Денис, отдельное спасибо за этот видос! Очень круто объяснил локал сторадж и очень здорово, что показал, как "интересснее разбить слейсы"
@shokhrookhr38502 жыл бұрын
Спасибо. Обрадовал перед сном)
@dimalavrenov3916 Жыл бұрын
Внатуре. Вроде рабочий варик, завтра попробую
@nikitareshetnikov4220 Жыл бұрын
21:30 - RIP Алиса😆😆
@Brunopt893 Жыл бұрын
32:45 - Все просто, какой проект такая и структура))))
@dominic90402 жыл бұрын
решил сделать сохранение корзины еще пару уроков назад, долго пытался сам, потом загуглил и сделал через persist, как-то даже прикольно, что сам решил задачу, не смотря этот урок
@elconrel9665 Жыл бұрын
Можешь кинуть код как ты сохранил ? Мучаюсь с персистом, не могу исправить гору ошибок... Заранее спасибо
@rustamakhmetyanov44042 жыл бұрын
React / сохранение в LocalStorage /спасибо за курс
@АртёмПронин-я3и Жыл бұрын
Я стажировку проходил в одной компании и там рекомендовали называть интерфейсы, начиная с буквы "I". По типу ICartItem. И чтобы не было такой проблемы как на видео, что интерфейс и компонент называются полностью одинаково и он пару раз ошибся и импортировал не из того файла
@ГеннадийГорохов-ц8н9 ай бұрын
Шикарное видео про локал сторадж.
@JavaScriptcher2 жыл бұрын
Пока делаю 15 урок, решил в будущее заглянуть
@ArchakovBlog2 жыл бұрын
если пройдёшь 15 урок, то ты избранный
@shokhrookhr38502 жыл бұрын
@@ArchakovBlog Спасибо за мотивацию 💪🏻
@ДенисСофієнко2 жыл бұрын
@@ArchakovBlog Избранный сеньор помидор 😂
@yersainaldabayev8836 Жыл бұрын
Не понимаю какой смысл в isMounted в useEffect, после того как мы get c localStorage за хардкодили прям в слайс в инишиал стейт? по сути происходит автоматически проверка прямо в слайсе
@diggerdog00110 ай бұрын
Есть баг, кстати, что если удалишь из корзины товары, то из LocaleStorage он же не удаляется, по итогу корзина снова отображает товары
@hotmitrofan5 ай бұрын
у меня нет такого бага
@Alex-dq9yk2 жыл бұрын
Спасибо за курс) Такой вопрос: есть ли смысл учить Redux? Который не тулкит)
@ArchakovBlog2 жыл бұрын
Есть. Но многие переходят на тулкит
@jamjam33372 жыл бұрын
🔥🔥🔥
@vaich17382 жыл бұрын
Отличный курс
@nickdunne12352 жыл бұрын
Красавчик, спасибо.
@UnKnown-ur9fq7 ай бұрын
да блин, redux-persist крутая штука и создается секунд за 10.. главное первый раз сделать, а дальше все однотипно к любым проектам
@kenanhaciyev3759 Жыл бұрын
klass
@sergeikanashevsky83112 жыл бұрын
Что то пошло не так или скоро NEXT ? )
@СтройКонсалт Жыл бұрын
День 15-й. Начал #26 в 17:00. Полторы тонны лайков - авансом. UPD: закончил в 23:00. Дэн - ЧЕЛОВЕЧИЩЕ!!
@BlockElement Жыл бұрын
Ну ты крутой. Прям до конца дошел
@Denis-ws1vn2 жыл бұрын
Почему const isMounted = React.useRef(false) , а не isMounted = React.useState(false)?
@ГригорийБотаров2 жыл бұрын
при изменении useState будет происходить перерендер компонента, который нам будет мешать
@miksa88752 жыл бұрын
@@ГригорийБотаров думаю дело не в этом, а в том, что у рефа можно всегда достать актуальное значение
@ГригорийБотаров2 жыл бұрын
@@miksa8875 как и у useState. Там тоже можно всегда достать актуальное значение. useState позволяет перерендеривать компонент при изменении стейта. Если бы в React изначально была реактивность, как во Vue, или мы использовали RxJS или MobX, которые добавляют реактивность, то разницы бы между их работой не было, точнее между результатом их работы
@miksa88752 жыл бұрын
@@ГригорийБотаров да. Я спутал. В useCallBack нельзя получить актуальный стейте, если не передать в зависимости или в реф
@ГригорийБотаров2 жыл бұрын
@@miksa8875 актуальное значение useState получить не удастся, если изменять его напрямую, а не через set(имя переменной). Но при использовании ее, у нас будет ререндериться компонент, что изменяет текущие данные и выводит актуальные. Если бы до актуальных данных useState можно было достучаться через useEffect, то тогда мы бы не смогли бы выводить актуальные данные в JSX самого компонента, через useState
@zloba75782 жыл бұрын
Скажите, пожалуйста, а какой шрифт используете?
@REDH3ADd Жыл бұрын
скорее всего Mono Lisa, посмотрите Mono шрифты
@engineerng Жыл бұрын
Nunito
@СтепанРазин-к2н2 жыл бұрын
Это был последний урок в серии? Или будут еще?
@ArchakovBlog2 жыл бұрын
Будут ещё
@aswonder55692 жыл бұрын
А почему нельзя вынести _всю_ логику с localStorage в cartSlice? Например, создать функцию обновления localStorage - типа saveCart() - и вызывать её в конце методов addItem(), removeItem() и clearItems(). Тогда, по идее, мы отделяем бизнес-логику от UI. Я попробовал - работает так же. Правда, приходится дублировать её вызов во всех редюсерах слайса.
@ArchakovBlog2 жыл бұрын
Это side effect, что есть не хорошо делать в редаксе
@aswonder55692 жыл бұрын
@@ArchakovBlog Я не согласен. Не вижу никакого side effect. localStorage.getItem() аналогичен axios.get(), только с другого ресурса.
@solodzh2 жыл бұрын
@@ArchakovBlog А localStorage.getItem - это не side effect? Или при инициализации можно? Но тогда и парсинг фильтров при первой загрузке проще сделать в redux при инициализации слайса.
@StrikerFeed2 жыл бұрын
@@aswonder5569 изучите понятие сайд эффекта. При получении в функцию одних и тех же данных, метод, например, localStorage.getItem(), может возвращать разные значения. Это АПИ браузера, там в любой момент может быть что угодно, именно поэтому это сайд эффект. И если Вы скажите, что нет, вы можете контроллировать что там находится, есть же localStorage.setItem() - ну нет, это тоже сайд эффект. Сайд эффектам не место в редаксе.