ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ основному содСрТимому

[Medium] πŸ“„ Π₯ΡƒΠΊΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° Vue

1. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ Ρ…ΡƒΠΊΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° Vue (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Vue 2 ΠΈ Vue 3)​

ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ Ρ…ΡƒΠΊΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° Vue ΠΊΠ°ΠΊ Π² Vue 2, Ρ‚Π°ΠΊ ΠΈ Π² Vue 3.

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Vue ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· Ρ„Π°Π·Ρ‹ ΠΎΡ‚ создания Π΄ΠΎ размонтирования. Π₯ΡƒΠΊΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° β€” это ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°, ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„Π°Π·Π΅.

ВрСмСнная шкала ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ цикла​

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ -> ΠœΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ -> ОбновлСниС -> Π Π°Π·ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
↓ ↓ ↓ ↓
Created Mounted Updated Unmounted

БоотвСтствиС Vue 2 ΠΈ Vue 3​

Vue 2 (Options)Vue 3 (Options)Vue 3 (Composition)Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
beforeCreatebeforeCreatesetup()Π΄ΠΎ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ экзСмпляра
createdcreatedsetup()состояниС экзСмпляра Π³ΠΎΡ‚ΠΎΠ²ΠΎ
beforeMountbeforeMountonBeforeMountΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ DOM
mountedmountedonMountedпослС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ монтирования DOM
beforeUpdatebeforeUpdateonBeforeUpdateΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ обновлСния
updatedupdatedonUpdatedпослС обновлСния DOM
beforeDestroybeforeUnmountonBeforeUnmountΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°
destroyedunmountedonUnmountedпослС Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ
activatedactivatedonActivatedKeepAlive Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½
deactivateddeactivatedonDeactivatedKeepAlive Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½
errorCapturederrorCapturedonErrorCapturedΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ ошибок ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²

1) Π€Π°Π·Π° создания​

beforeCreate / created​

<script>
export default {
data() {
return {
message: 'Hello Vue',
};
},

beforeCreate() {
// data/methods Π΅Ρ‰Ρ‘ Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹
console.log(this.message); // undefined
console.log(this.$el); // undefined
},

created() {
// API состояния доступны, Π½ΠΎ DOM Π΅Ρ‰Ρ‘ Π½Π΅ смонтирован
console.log(this.message); // 'Hello Vue'
console.log(this.$el); // undefined

// подходящСС мСсто для API-запросов
this.fetchData();
},

methods: {
async fetchData() {
const response = await fetch('/api/data');
this.data = await response.json();
},
},
};
</script>

Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ использованиС:

  • created: API-запросы, инициализация Π±Π΅Π· DOM
  • Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с DOM здСсь

2) Π€Π°Π·Π° монтирования​

beforeMount / mounted​

<template>
<div ref="myElement">
<h1>{{ title }}</h1>
<canvas ref="myCanvas"></canvas>
</div>
</template>

<script>
export default {
data() {
return { title: 'Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Vue' };
},

beforeMount() {
console.log(this.$refs.myElement); // undefined
},

mounted() {
console.log(this.$refs.myElement); // доступСн

// Настройка, зависящая ΠΎΡ‚ DOM
this.initCanvas();
this.initChart();
},

methods: {
initCanvas() {
const canvas = this.$refs.myCanvas;
const ctx = canvas.getContext('2d');
// рисованиС...
},
initChart() {
// инициализация стороннСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ DOM
},
},
};
</script>

Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ использованиС:

  • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с DOM
  • Π‘Ρ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠ΅ UI/графичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
  • ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ DOM

3) Π€Π°Π·Π° обновлСния​

beforeUpdate / updated​

<template>
<div>
<p>Π‘Ρ‡Ρ‘Ρ‚Ρ‡ΠΈΠΊ: {{ count }}</p>
<button @click="count++">Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ</button>
</div>
</template>

<script>
export default {
data() {
return { count: 0 };
},

beforeUpdate() {
// Π΄Π°Π½Π½Ρ‹Π΅ измСнились, DOM Π΅Ρ‰Ρ‘ Π½Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½
},

updated() {
// DOM ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½
// ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΉ Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ состояния здСсь Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»ΠΎΠ²
},
};
</script>

Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ использованиС:

  • Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΡ/ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ послС обновлСния DOM
  • Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΉ нСпосрСдствСнно Π² updated

4) Π€Π°Π·Π° размонтирования​

beforeUnmount / unmounted (Vue 3)​

beforeDestroy / destroyed (Vue 2)​

<script>
export default {
data() {
return {
timer: null,
ws: null,
};
},

mounted() {
this.timer = setInterval(() => {}, 1000);
this.ws = new WebSocket('ws://example.com');
window.addEventListener('resize', this.handleResize);
},

unmounted() {
if (this.timer) clearInterval(this.timer);
if (this.ws) this.ws.close();
window.removeEventListener('resize', this.handleResize);
},

methods: {
handleResize() {},
},
};
</script>

Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ использованиС:

  • ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ²
  • Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»Π΅ΠΉ
  • Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сокСтов/подписок
  • Π£Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ сторонних экзСмпляров

5) ΠžΡΠΎΠ±Ρ‹ΠΉ случай: KeepAlive​

<KeepAlive> ΠΊΠ΅ΡˆΠΈΡ€ΡƒΠ΅Ρ‚ экзСмпляры ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² вмСсто ΠΈΡ… уничтоТСния ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ.

Π—Π°Ρ‡Π΅ΠΌ это ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒβ€‹

  1. Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ локального состояния (Π²Π²ΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ)
  2. ИзбСТаниС ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ/API-Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²
  3. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ UX ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π²ΠΊΠ»Π°Π΄ΠΎΠΊ/страниц

ΠŸΡ€ΠΈΠΌΠ΅Ρ€β€‹

<template>
<KeepAlive include="UserList,ProductList" :max="10">
<component :is="currentComponent" />
</KeepAlive>
</template>

6) Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ…ΡƒΠΊΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ цикла​

activated / deactivated (с KeepAlive)​

<script>
export default {
mounted() {
console.log('смонтирован ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·');
},
activated() {
// вызываСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ становится Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΈΠ· кСша
this.refreshData();
},
deactivated() {
// вызываСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΊΠ΅ΡˆΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ/дСактивируСтся
this.pauseTasks();
},
methods: {
refreshData() {},
pauseTasks() {},
},
};
</script>

errorCaptured​

<script>
export default {
errorCaptured(err, instance, info) {
console.error('ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π° ошибка Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:', err, info);
return false; // ΠΏΡ€ΠΈ нСобходимости ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ дальнСйшСС распространСниС
},
};
</script>

Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Vue 3 Composition API​

<script setup>
import {
ref,
onBeforeMount,
onMounted,
onBeforeUpdate,
onUpdated,
onBeforeUnmount,
onUnmounted,
onActivated,
onDeactivated,
onErrorCaptured,
} from 'vue';

const count = ref(0);

// setup() дСйствуСт ΠΊΠ°ΠΊ Π»ΠΎΠ³ΠΈΠΊΠ° Ρ„Π°Π·Ρ‹ beforeCreate + created

onBeforeMount(() => {});
onMounted(() => {});
onBeforeUpdate(() => {});
onUpdated(() => {});
onBeforeUnmount(() => {});
onUnmounted(() => {});
onActivated(() => {});
onDeactivated(() => {});
onErrorCaptured((err, instance, info) => {
return false;
});
</script>

2. Каков порядок выполнСния Ρ…ΡƒΠΊΠΎΠ² ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²?​

Каков порядок выполнСния ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° для Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²?

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ монтирования​

Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ beforeCreate
β†’ Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ created
β†’ Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ beforeMount
β†’ Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ beforeCreate
β†’ Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ created
β†’ Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ beforeMount
β†’ Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ mounted
β†’ Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ mounted

МнСмоника: созданиС начинаСтся снаруТи Π²Π½ΡƒΡ‚Ρ€ΡŒ, ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ Π½Π°Ρ€ΡƒΠΆΡƒ.

ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ примСр​

<!-- ParentComponent.vue -->
<script>
import ChildComponent from './ChildComponent.vue';

export default {
components: { ChildComponent },
beforeCreate() { console.log('1. Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ beforeCreate'); },
created() { console.log('2. Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ created'); },
beforeMount() { console.log('3. Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ beforeMount'); },
mounted() { console.log('8. Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ mounted'); },
beforeUnmount() { console.log('9. Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ beforeUnmount'); },
unmounted() { console.log('12. Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ unmounted'); },
};
</script>
<!-- ChildComponent.vue -->
<script>
export default {
beforeCreate() { console.log('4. Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ beforeCreate'); },
created() { console.log('5. Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ created'); },
beforeMount() { console.log('6. Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ beforeMount'); },
mounted() { console.log('7. Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ mounted'); },
beforeUnmount() { console.log('10. Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ beforeUnmount'); },
unmounted() { console.log('11. Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ unmounted'); },
};
</script>

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ обновлСния​

Если Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ родитСля, Π²Π»ΠΈΡΡŽΡ‰ΠΈΠ΅ Π½Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ:

Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ beforeUpdate
β†’ Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ beforeUpdate
β†’ Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ updated
β†’ Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ updated

Если измСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ локальноС состояниС Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Ρ…ΡƒΠΊΠΈ обновлСния родитСля Π½Π΅ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ размонтирования​

Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ beforeUnmount
β†’ Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ beforeUnmount
β†’ Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ unmounted
β†’ Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ unmounted

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊΠΎΠΉ порядок​

  • ΠœΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ выполняСтся Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ: Ρ€Π΅Π½Π΄Π΅Ρ€ родитСля ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ
  • Π Π°Π·ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сначала увСдомляСт родитСля, Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·Ρ€ΡƒΡˆΠ°Π΅Ρ‚ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅, Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ родитСля

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ послСдствия​

  1. Доступ ΠΊ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ refs бСзопасСн Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ mounted, Π½ΠΎ Π½Π΅ Π² created
  2. Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ mounted ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ Π΄ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ mounted
  3. Для ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ готовности родитСля ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ события/props ΠΈΠ»ΠΈ nextTick

ЧастыС ΠΎΡˆΠΈΠ±ΠΊΠΈβ€‹

  1. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ this.$refs.child Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ created
  2. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΡƒΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ смонтирован, ΠΊΠΎΠ³Π΄Π° выполняСтся Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ mounted

3. Когда слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ…ΡƒΠΊ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°?​

Когда Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ…ΡƒΠΊ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°?

ΠšΡ€Π°Ρ‚ΠΊΠ°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡβ€‹

Π₯ΡƒΠΊΠ’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅Π”ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ DOM
created / setupAPI-запрос, инициализация состоянияНСт
mounted / onMountedΠ Π°Π±ΠΎΡ‚Π° с DOM, инициализация сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ”Π°
updated / onUpdatedБинхронизация DOM послС обновлСнияДа (ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½)
unmounted / onUnmountedΠžΡ‡ΠΈΡΡ‚ΠΊΠ° рСсурсовЀаза Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ
activatedΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ Π² ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²ΠΈΠ΄Π”Π°

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ примСры​

1) created: Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… API​

<script>
export default {
data() {
return { users: [], loading: true, error: null };
},
created() {
this.fetchUsers();
},
methods: {
async fetchUsers() {
try {
this.loading = true;
const response = await fetch('/api/users');
this.users = await response.json();
} catch (error) {
this.error = error.message;
} finally {
this.loading = false;
}
},
},
};
</script>

2) mounted: инициализация стороннСй библиотСки​

<template>
<div ref="chart" style="width: 600px; height: 400px"></div>
</template>

<script>
import * as echarts from 'echarts';

export default {
data() {
return { chartInstance: null };
},
mounted() {
this.chartInstance = echarts.init(this.$refs.chart);
this.chartInstance.setOption({
title: { text: 'ΠŸΡ€ΠΎΠ΄Π°ΠΆΠΈ' },
xAxis: { data: ['Пн', 'Π’Ρ‚', 'Π‘Ρ€', 'Π§Ρ‚', 'ΠŸΡ‚'] },
yAxis: {},
series: [{ type: 'bar', data: [10, 20, 30, 40, 50] }],
});
},
unmounted() {
if (this.chartInstance) this.chartInstance.dispose();
},
};
</script>

3) unmounted: очистка рСсурсов​

<script>
export default {
data() {
return { intervalId: null, observer: null };
},
mounted() {
this.intervalId = setInterval(() => {}, 1000);
this.observer = new IntersectionObserver(() => {});
this.observer.observe(this.$el);
window.addEventListener('resize', this.handleResize);
},
unmounted() {
if (this.intervalId) clearInterval(this.intervalId);
if (this.observer) this.observer.disconnect();
window.removeEventListener('resize', this.handleResize);
},
methods: {
handleResize() {},
},
};
</script>

ΠœΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠ°β€‹

  1. created: состояниС Π³ΠΎΡ‚ΠΎΠ²ΠΎ, DOM Π½Π΅ Π³ΠΎΡ‚ΠΎΠ²
  2. mounted: DOM Π³ΠΎΡ‚ΠΎΠ²
  3. updated: DOM ΠΎΠ±Π½ΠΎΠ²Π»Ρ‘Π½
  4. unmounted: ΠΎΡ‡ΠΈΡ‰Π°Π΅ΠΌ всё

Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½Ρ‹Π΅ матСриалы​