👩‍💻 effectScope - способ управлениями эффектами группируя их. effectScope — это функция, введенная в Vue.js 3, которая позволяет создавать область (scope) для управления побочными эффектами (effects), такими как watch и computed. Это полезно для группировки и управления несколькими эффектами вместе, особенно когда нужно очистить или остановить их выполнение.

Основные моменты:

1 Группировка эффектов: effectScope позволяет объединить несколько реактивных эффектов в одну область. Это упрощает управление ими, например, остановку всех эффектов одновременно.

2 Очистка ресурсов: Когда область эффектов больше не нужна, можно вызвать метод stop() на объекте effectScope, чтобы остановить все эффекты внутри этой области и освободить ресурсы.

3 Вложенные области: effectScope поддерживает вложенные области, что позволяет создавать иерархии областей для более сложных сценариев.

Пример использования:

`import { effectScope, reactive, watch } from 'vue';

function createCounter() { const scope = effectScope(); // Создаем область эффектов

scope.run(() => { const state = reactive({ count: 0 });

// Следим за изменением count watch(() => state.count, (newValue) => { console.log(Counter value: ${newValue}); });

// Функция для увеличения счетчика const increment = () => { state.count++; };

// Функция для остановки всех эффектов const stop = () => { scope.stop(); };

return { state, increment, stop }; }); }

const counter = createCounter(); counter.increment(); // Counter value: 1 counter.increment(); // Counter value: 2

// Останавливаем все эффекты counter.stop();

Так же пример с использованием Composition Api `import { effectScope, reactive, watch, computed } from 'vue';

function useCounter() { const scope = effectScope(); // Создаем область эффектов

const state = reactive({ count: 0 });

const doubleCount = computed(() => state.count * 2);

scope.run(() => { watch(() => state.count, (newValue) => { console.log(Count changed to ${newValue}); });

watch(() => doubleCount.value, (newValue) => { console.log(Double count changed to ${newValue}); }); });

const increment = () => { state.count++; };

const stop = () => { scope.stop(); };

return { state, doubleCount, increment, stop }; }

export default { setup() { const { state, doubleCount, increment, stop } = useCounter();

return { state, doubleCount, increment, stop }; }, };``