effectScope voor gegroepeerde effecten
effectScope(), watchers en computed binnen een scope uitvoeren en scope.stop() gebruiken voor opruimen.
effectScope voor gegroepeerde effecten is een gratis Vue Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Vue Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Vue Academy bevat in totaal 4 lessen.
Het opruimprobleem
Watchers en berekende waarden die buiten de setup van een component worden aangemaakt, worden niet automatisch opgeruimd. In zelfstandig gebruikte composables of code op pluginniveau kunnen reactieve effecten blijven lekken. effectScope lost dit op door effecten te groeperen, zodat je ze gezamenlijk kunt opruimen.
Wat effectScope doet
effectScope() maakt een bereik dat alle reactieve effecten (watchers, berekende waarden) verzamelt die worden aangemaakt terwijl het actief is. Later stop je het bereik om ze allemaal tegelijk op te ruimen.
import { effectScope } from "vue"
const scope = effectScope()Effecten verzamelen met run
Roep scope.run(fn) aan en maak je watchers en berekende waarden binnen fn aan. Elk effect dat tijdens die aanroep wordt aangemaakt, wordt bij het bereik geregistreerd.
import { effectScope, ref, watch, computed } from "vue"
const scope = effectScope()
scope.run(() => {
const count = ref(0)
const doubled = computed(() => count.value * 2)
watch(count, (v) => console.log(v))
})Het bereik stoppen
scope.stop() stopt elke watcher en berekende waarde die binnen het bereik is aangemaakt, met één aanroep — je hoeft niet elke afzonderlijke stop-functie bij te houden.
scope.stop() // disposes all watchers and computed at onceWaarom dit belangrijk is
Zonder een bereik moet je de stopfunctie van elke watcher bewaren en ze één voor één aanroepen. Met veel effecten is dit foutgevoelig. Een bereik maakt N opruimacties tot één actie.
// without scope: must track each
const stop1 = watch(a, fn)
const stop2 = watch(b, fn)
// stop1(); stop2(); ... easy to forget oneGeneste bereiken
Bereiken kunnen worden genest. Een onderliggend bereik dat binnen een bovenliggend bereik wordt aangemaakt, wordt automatisch gestopt wanneer het bovenliggende bereik stopt, zodat je zonder extra werk hiërarchisch kunt opruimen.
const parent = effectScope()
parent.run(() => {
const child = effectScope() // stopped when parent stops
child.run(() => watch(/* ... */))
})
parent.stop() // stops child tooLosgekoppelde bereiken
Geef true door om een losgekoppeld bereik te maken dat NIET door een omliggend bovenliggend bereik wordt verzameld. Gebruik dit wanneer je de levensduur onafhankelijk wilt beheren.
const scope = effectScope(true) // detached
// must be stopped manually; parent stop will not reach itGebruikssituatie: abonnementen op pluginniveau
Een veelvoorkomende toepassing is het beheren van reactieve abonnementen op plugin- of app-niveau die buiten één afzonderlijke component actief zijn — bijvoorbeeld een opslag synchroniseren met localStorage. Groepeer ze in een bereik dat je stopt wanneer de app wordt afgesloten.
const appScope = effectScope()
appScope.run(() => {
watch(store.state, persistToLocalStorage, { deep: true })
})
// on app shutdown: appScope.stop()Een herbruikbaar opruimobject bouwen
Een composable kan een eigen bereik maken om interne effecten te bundelen en één dispose beschikbaar te stellen. Aanroepers ruimen alles met één aanroep op.
export function useTracker() {
const scope = effectScope()
scope.run(() => {
watch(/* ... */)
})
return { dispose: () => scope.stop() }
}Bereiken en componenten
Binnen de setup van een component gebruikt Vue al een impliciet bereik dat aan de levenscyclus van de component is gekoppeld — daarom worden watchers van componenten automatisch opgeruimd wanneer de component wordt verwijderd. effectScope geeft je dezelfde mogelijkheid buiten componenten.
getCurrentScope en onScopeDispose
Binnen een bereik kun je opruimwerk registreren met onScopeDispose(fn). Dit wordt uitgevoerd wanneer het bereik stopt — vergelijkbaar met onUnmounted, maar dan voor elk bereik.
import { onScopeDispose } from "vue"
scope.run(() => {
const id = setInterval(tick, 1000)
onScopeDispose(() => clearInterval(id))
})Korte controle
Controleer of je effectScope begrijpt.
Samenvatting
Je hebt effectScope voor gegroepeerde effecten geleerd:
effectScope()maakt een bereik dat effecten verzamelt die daarin worden aangemaakt.scope.run(fn)verzamelt de watchers en berekende waarden die infnworden aangemaakt.scope.stop()ruimt ze allemaal tegelijk op; geneste bereiken stoppen samen met hun bovenliggende bereik (gebruiktruevoor een losgekoppeld bereik).onScopeDispose(fn)registreert opruimwerk dat bij het stoppen wordt uitgevoerd.- Ideaal voor composables en reactieve abonnementen op pluginniveau buiten componenten.
Leer HTML met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 42
- Lessen
- 156
Veelgestelde vragen
Is de les “effectScope voor gegroepeerde effecten” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Vue Academy, waaronder “effectScope voor gegroepeerde effecten”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Vue Academy bevat in totaal 4 lessen.
Wat leer ik in “effectScope voor gegroepeerde effecten”?
effectScope(), watchers en computed binnen een scope uitvoeren en scope.stop() gebruiken voor opruimen. Je oefent met Vue Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Vue Academy te beginnen?
Ervaring vooraf is niet nodig. Vue Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “effectScope voor gegroepeerde effecten”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Vue Academy?
Ja. Elke les over Vue Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Geavanceerde reactiviteit: shallowRef en triggerRef
- Composable-factories en geparametriseerde composables
- State machines met XState in Vue
- effectScope voor gegroepeerde effecten