Глубокое клонирование реактивных объектов в Vue 3
3 рабочих способа
1. Комбинация
2. Ручное глубокое копирование
3. Библиотечные решения
#tip #reactivity
Vue 3
использует Proxy
для реактивности, что создает проблемы при попытке клонировать объекты. Стандартные методы работают не так, как ожидается:const state = reactive({ user: { name: "Al" } });
// Проблемы:
const badCopy1 = { ...state }; // сохраняет Proxy-ссылки
const badCopy2 = JSON.parse(JSON.stringify(state)); // теряет методы и Proxy
3 рабочих способа
1. Комбинация
toRaw
+ structuredClone
import { toRaw } from 'vue';
const original = reactive({ data: 123 });
const copy = structuredClone(toRaw(original));
2. Ручное глубокое копирование
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
const clone = Array.isArray(obj) ? [] : {};
for (const key in obj) {
clone[key] = deepClone(obj[key]);
}
return clone;
}
const copy = reactive(deepClone(toRaw(original)));
3. Библиотечные решения
import { cloneDeep } from 'lodash-es';
const copy = reactive(cloneDeep(toRaw(obj)));
#tip #reactivity
This media is not supported in your browser
VIEW IN TELEGRAM
Хорошая библиотека
Долго мучился с расположением при динамично меняющемся таргет элементе - все как-то через одно место криво работало. Решил поставить
Немного радует, что довольно часто обновляется и фиксят баги.
P.S. Ререндеринг через `:key` - плохая практика. Последний вариант.
#lib #arkui
Ark-ui
, но с особенностями. Особенно у "выпадашки" HoverCard
(для меню которая)Долго мучился с расположением при динамично меняющемся таргет элементе - все как-то через одно место криво работало. Решил поставить
:key
на HoverCard
и инкрементить его при апдейтах - и всё сразу заработало как надо. Ну, ё-моё...Немного радует, что довольно часто обновляется и фиксят баги.
P.S. Ререндеринг через `:key` - плохая практика. Последний вариант.
#lib #arkui
Статья о современном минимальном наборе фавиконок для сайта
#webdev
<link rel="icon" href="/favicon.ico" sizes="any"><!-- 32×32 -->
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/apple-touch-icon.png"><!-- 180×180 -->
<link rel="manifest" href="/manifest.webmanifest">
// manifest.webmanifest
{
"icons": [
{ "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" },
{ "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" }
]
}
#webdev
Хабр
Как создавать иконки сайтов в 2022 году — всё о favicon
Эта статья перевод англоязычной статьи Андрея Ситника из блога Злых марсиан . Пришло время переосмыслить то, как мы создаем набор иконок для современных браузеров, и остановить безумные генераторы....
Почему неконтролируемого использования
1. Нарушение реактивного потока
2. Плохая читаемость
Цепочки
Плохо для рефакторинга - логика, разбросанная по
3. Производительность
Неотписанные
#reactivity #watch
watch
лучше избегать?1. Нарушение реактивного потока
watch
часто скрывает логику реактивности. Например, отслеживание изменения переменной для вызова побочного эффекта (fetch
) делает поток данных менее предсказуемым, особенно если эффекты затрагивают несколько компонентов.Vue
поощряет однонаправленную реактивность (данные -> шаблон). watch
часто используется для обратной связи (данные -> данные), что усложняет отладку.2. Плохая читаемость
Цепочки
watch
внутри компонента превращаются в плохо понимаемый в спагетти-код.Плохо для рефакторинга - логика, разбросанная по
watch
, сложно переносится в composables
.3. Производительность
watch
с deep: true
может создать нагрузку при отслеживании больших объектов или массивов.watch
часто дублирует логику, которую можно выразить через computed
. Вычисляемые свойства кешируются и эффективнее.Неотписанные
watch
в динамических компонентах (например, внутри v-if
) могут накапливаться и вызывать утечки памяти.watch
— это аварийный выход для случаев, когда декларативных подходов недостаточно. Если возможно, нужно старайться решить задачу через computed
, props
или события.#reactivity #watch
Представитель
Задавайте вопросы и запросы, какие темы осветить. Любые.
#interview #hh #job
hh.ru
согласился дать интервью каналуЗадавайте вопросы и запросы, какие темы осветить. Любые.
#interview #hh #job
Все, кто имет отношение, приглашаются пройти исследование русскоязычных продакт-менеджеров — 2025
Команда
– что входит в зону ответственности продакта в компаниях разного размера,
– какие навыки востребованы и чего не хватает,
– как и где продакты учатся и растут,
– какие инструменты и подходы реально работают,
– сколько получают и сколько хотят получать специалисты на разных грейдах.
https://survey.alchemer.eu/s3/90815016/dvcrowd-product-2025
Подробней на канале Тиграна Басеяна о продакт менеджменте и стартапах
#offtop
Команда
DevCrowd
в четвёртый раз запускает исследование, чтобы понять, как живётся продактам:– что входит в зону ответственности продакта в компаниях разного размера,
– какие навыки востребованы и чего не хватает,
– как и где продакты учатся и растут,
– какие инструменты и подходы реально работают,
– сколько получают и сколько хотят получать специалисты на разных грейдах.
https://survey.alchemer.eu/s3/90815016/dvcrowd-product-2025
Подробней на канале Тиграна Басеяна о продакт менеджменте и стартапах
#offtop
Обычно для группировки массива по какому-то ключу используют
Однако уже доступны
#js
reduce
Однако уже доступны
Object.groupBy
и Map.groupBy
, которые позволяют упростить эту процедуруconst users = [
{ id: 1, name: "Alex", role: "admin" },
{ id: 2, name: "Anna", role: "user" },
];
const grouped = Object.groupBy(users, ({ role }) => role);
// Результат:
// { admin: [{...}], user: [{...}] }
#js
Кто снёс канал Душного Вуя?
Anonymous Poll
24%
Дуров Павел Никодимович
28%
Приглашённые гастарбайтеры
49%
Озон
Ради интереса выставил своего Аргуса на конкурс проектов на Product Radar
Кому бот понравился - поддержите голосом (надо залогиниться на сайт).
Хейтеры могут поддержать соперников. Можно сразу всех вместе.
#argus #productradar #contest
Кому бот понравился - поддержите голосом (надо залогиниться на сайт).
Хейтеры могут поддержать соперников. Можно сразу всех вместе.
#argus #productradar #contest
pollinations.ai
- правильный API
для AI
:GET https://text.pollinations.ai/{prompt}
<img
src="https://image.pollinations.ai/prompt/Reactjs%20is%20dying"
alt="A beautiful picture"
/>
Другие варианты тут
P.S. На картинке генерация DALL-E 3 с промптом из кодблока
Кстати, где можно генерить качественные картинки - https://www.tg-me.com/neuralforum/5300857
#ai
По большому счету технически
В этой статье показывается пример, как реализовать
С
#spa #router
SPA
- это в основном router
В этой статье показывается пример, как реализовать
router
на чистом js
С
Hash Mode
и History Mode
#spa #router
JavaScript Development Space - Master JS and NodeJS
Build a Single-Page Application(SPA) Router in Vanilla JavaScript
Learn how to implement client-side routing in single-page applications using vanilla JavaScript. Step-by-step guide to building a robust SPA router without frameworks.