[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) | ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ |
|---|---|---|---|
beforeCreate | beforeCreate | setup() | Π΄ΠΎ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° |
created | created | setup() | ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π³ΠΎΡΠΎΠ²ΠΎ |
beforeMount | beforeMount | onBeforeMount | ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ²ΡΠΌ ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ DOM |
mounted | mounted | onMounted | ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ DOM |
beforeUpdate | beforeUpdate | onBeforeUpdate | ΠΏΠ΅ΡΠ΅Π΄ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ |
updated | updated | onUpdated | ΠΏΠΎΡΠ»Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ DOM |
beforeDestroy | beforeUnmount | onBeforeUnmount | ΠΏΠ΅ΡΠ΅Π΄ ΡΠ°Π·ΡΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° |
destroyed | unmounted | onUnmounted | ΠΏΠΎΡΠ»Π΅ ΡΠ°Π·ΡΡΡΠ΅Π½ΠΈΡ |
activated | activated | onActivated | KeepAlive Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½ |
deactivated | deactivated | onDeactivated | KeepAlive Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½ |
errorCaptured | errorCaptured | onErrorCaptured | ΠΏΠ΅ΡΠ΅Ρ Π²Π°Ρ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ² |
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> ΠΊΠ΅ΡΠΈΡΡΠ΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π²ΠΌΠ΅ΡΡΠΎ ΠΈΡ
ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ.
ΠΠ°ΡΠ΅ΠΌ ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡβ
- Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ (Π²Π²ΠΎΠ΄ ΡΠΎΡΠΌΡ, ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ)
- ΠΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ/API-Π²ΡΠ·ΠΎΠ²ΠΎΠ²
- Π£Π»ΡΡΡΠ΅Π½ΠΈΠ΅ 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
ΠΠΎΡΠ΅ΠΌΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊβ
- ΠΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² Π³Π»ΡΠ±ΠΈΠ½Ρ: ΡΠ΅Π½Π΄Π΅Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ°ΡΡ ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΡΠΌΠΈ
- Π Π°Π·ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ½Π°ΡΠ°Π»Π° ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΠ΅Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ, Π·Π°ΡΠ΅ΠΌ ΡΠ°Π·ΡΡΡΠ°Π΅Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅, Π·Π°ΡΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡβ
- ΠΠΎΡΡΡΠΏ ΠΊ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌ refs Π±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌ
mounted, Π½ΠΎ Π½Π΅ Π²created - ΠΠΎΡΠ΅ΡΠ½ΠΈΠΉ
mountedΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ Π΄ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎmounted - ΠΠ»Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΈΠΈ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΈ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ/props ΠΈΠ»ΠΈ
nextTick
Π§Π°ΡΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈβ
- ΠΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ
this.$refs.childΠ² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌcreated - ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΡΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½, ΠΊΠΎΠ³Π΄Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ
mounted
3. ΠΠΎΠ³Π΄Π° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Ρ ΡΠΊ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π°?β
ΠΠΎΠ³Π΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Ρ ΡΠΊ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π°?
ΠΡΠ°ΡΠΊΠ°Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡβ
| Π₯ΡΠΊ | Π’ΠΈΠΏΠΈΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ | ΠΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ DOM |
|---|---|---|
created / setup | API-Π·Π°ΠΏΡΠΎΡ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ | ΠΠ΅Ρ |
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>
ΠΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠ°β
created: ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ, DOM Π½Π΅ Π³ΠΎΡΠΎΠ²mounted: DOM Π³ΠΎΡΠΎΠ²updated: DOM ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ½unmounted: ΠΎΡΠΈΡΠ°Π΅ΠΌ Π²ΡΡ