Professional Documents
Culture Documents
Lifecycle C A Vue - Js
Lifecycle C A Vue - Js
js
1. Creation (Initialization) – Khởi tạo component
Đầu tiên, bất cứ component nào cũng cần được khởi tạo. Các methods được
thực thi ở Creation sẽ được xác nhận (perform actions) trước khi các
component này được thêm vào DOM.
Hầu hết các xử lí được thực hiện ở Creation thường là thao tác giữa Client và
Server (Xác thực đăng nhập, fetch data từ API). Nhưng tại sao lại thế?
Creation là bước đầu tiên trong chuỗi Vuejs life cycle, ở bước này, chúng ta chưa
có quyền truy cập vào DOM tree, target mounting element (this.$el) cũng
không thể truy cập
Chú ý rằng bất cứ dữ được nào được lấy ra ở bước này đều không ánh xạ đi
đâu. Các sự kiện ở trên component cũng không work ở đây
export default {
beforeCreate() {
}
CHỐT: beforeCreate LUÔN ĐƯỢC GỌI VÀ GỌI ĐẦU TIÊN
Tuy nhiên, do các method mounted (gắn kết) và rendered (hiển thị) chưa được
gọi. Không thể thực hiện các thao tác trên DOM ở bước này.
Ex: document.getElementById, byTag, …
Hãy nhớ rằng Mounting rất linh động, nó cho phép ta truy cập tới các thành
phần trên DOM TRƯỚC HOẶC SAU LẦN RENDER ĐẦU TIÊN.
Vậy nếu chúng ta cần sửa đổi, truy cập tới một phần tử trước và sau khi DOM
render. Các methods nên được viết ở phần mounting, còn nếu bạn muốn set
data khởi tạo cho các component, các method fetch dữ liệu nên được viết ở
created.
Theo kinh nghiệm riêng của mình, khi fetch hoặc update lại data ở component
viết ở Mouting, không có vẻ gì là sai nhưng lúc component thay đổi data liên tục
realtime. Các component sẽ giật giật tung cả chảo. =)))
Chính vì vậy, đừng set giá trị cho các biến để kiểm tra khi render ở event này.
Ra thế, tôi mới bảo các bạn hãy nắm chắc Vuejs Life Cycle, sẽ rất dễ để
biết bước nào nên làm gì?
export default {
beforeMount() {
}
CHỐT: CÁC ELEMENT trên DOM chưa thể truy cập được ở BEFORE MOUNT
Event này cũng thường được sử dụng để gán data cho các child component
(thông qua this)
<template>
<h1>This is title, we can access it after beforeMount()</h1>
</template>
<script>
export default {
mounted() {
console.log(this.$el.textContent) // This is title, we can access
it after beforeMount()
}
}
</script>
CHỐT: ở event Mounted, có thể truy cập được tới các element trên DOM.
<script>
export default {
data() {
return {
firstTimeItem: "Firsttime"
}
},
beforeUpdate() {
console.log(this.firstTimeItem) // Mỗi lần upadte sẽ gọi tới method
này
},
created() {
setInterval(() => {
this.firstTimeItem = "Yo bro, i want to update"
}, 1000)
}
}
</script>
Nếu ta muốn thao tác thay đổi trên DOM tree sau khi nội dung đã update thì
thực hiện ở updated là an toàn nhất. Nguyên nhân là vì updated chỉ được gọi
sau khi DOM đã update xong.
<template>
<p ref="dom-element">{{counter}}</p>
</template>
<script>
export default {
data() {
return {
counter: 0
}
},
updated() {
// Được gọi sau khi DOM update. Giá trị luôn bằng giá trị tăng của
counter
console.log(+this.$refs['dom-element'].textContent ===
this.counter)
},
created() {
setInterval(() => {
this.counter++
}, 1000)
}
}
</script>
<script>
export default {
data() {
return {
variableLeakMem: 'When component destroy, please remove me'
}
},
beforeDestroy() {
// Loại bỏ variable hay các event listening sẽ đỡ lãng phí bộ nhớ
this.variableLeakMem = null
delete this.variableLeakMem
}
}
</script>
<script>
import MyCreepyAnalyticsService from './somewhere-bad'
export default {
destroyed() {
console.log(this) // There's practically nothing here!
MyCreepyAnalyticsService.informService('Component destroyed. All
assets move in on target on my mark.')
}
}
</script>
CHỐT: EVENT DESTROY CÓ THỂ DÙNG ĐỂ KIỂM CHỨNG CHO VIỆC MUỐN
DESTROY CÁC ĐỐI TƯỢNG MONG MUỐN.
Hầu hết các xử lí được thực hiện ở Creation thường là thao tác giữa Client và
Server (Xác thực đăng nhập, fetch data từ API).
Creation là bước đầu tiên trong chuỗi Vuejs life cycle, ở bước này, chúng ta chưa
có quyền truy cập vào DOM tree, target mounting element (this.$el) cũng
không thể truy cập
Chú ý rằng bất cứ dữ được nào được lấy ra ở bước này đều không ánh xạ đi
đâu. Các sự kiện ở trên component cũng không work ở đây
export default {
beforeCreate() {
}
CHỐT: beforeCreate LUÔN ĐƯỢC GỌI VÀ GỌI ĐẦU TIÊN
Tuy nhiên, do các method mounted (gắn kết) và rendered (hiển thị) chưa được
gọi. Không thể thực hiện các thao tác trên DOM ở bước này.
Hãy nhớ rằng Mounting rất linh động, nó cho phép ta truy cập tới các thành
phần trên DOM TRƯỚC HOẶC SAU LẦN RENDER ĐẦU TIÊN.
Vậy nếu chúng ta cần sửa đổi, truy cập tới một phần tử trước và sau khi DOM
render. Các methods nên được viết ở phần mounting, còn nếu bạn muốn set
data khởi tạo cho các component, các method fetch dữ liệu nên được viết ở
created.
Theo kinh nghiệm riêng của mình, khi fetch hoặc update lại data ở component
viết ở Mouting, không có vẻ gì là sai nhưng lúc component thay đổi data liên tục
realtime. Các component sẽ giật giật tung cả chảo. =)))
Chính vì vậy, đừng set giá trị cho các biến để kiểm tra khi render ở event này.
Ra thế, tôi mới bảo các bạn hãy nắm chắc Vuejs Life Cycle, sẽ rất dễ để biết
bước nào nên làm gì?
export default {
beforeMount() {
}
CHỐT: CÁC ELEMENT trên DOM chưa thể truy cập được ở BEFORE MOUNT
Event này cũng thường được sử dụng để gán data cho các child component
(thông qua this)
<template>
<h1>This is title, we can access it after beforeMount()</h1>
</template>
<script>
export default {
mounted() {
console.log(this.$el.textContent) // This is title, we can access
it after beforeMount()
}
}
</script>
CHỐT: ở event Mounted, có thể truy cập được tới các element trên DOM.
Tất nhiên, chỉ component nào sau khi render và được cập nhật lại mới gọi tới
methods này.
<script>
export default {
data() {
return {
firstTimeItem: "Firsttime"
}
},
beforeUpdate() {
console.log(this.firstTimeItem) // Mỗi lần upadte sẽ gọi tới method
này
},
created() {
setInterval(() => {
this.firstTimeItem = "Yo bro, i want to update"
}, 1000)
}
}
</script>
Nếu ta muốn thao tác thay đổi trên DOM tree sau khi nội dung đã update thì
thực hiện ở updated là an toàn nhất. Nguyên nhân là vì updated chỉ được gọi
sau khi DOM đã update xong.
<template>
<p ref="dom-element">{{counter}}</p>
</template>
<script>
export default {
data() {
return {
counter: 0
}
},
updated() {
// Được gọi sau khi DOM update. Giá trị luôn bằng giá trị tăng của
counter
console.log(+this.$refs['dom-element'].textContent ===
this.counter)
},
created() {
setInterval(() => {
this.counter++
}, 1000)
}
}
</script>
<script>
export default {
data() {
return {
variableLeakMem: 'When component destroy, please remove me'
}
},
beforeDestroy() {
// Loại bỏ variable hay các event listening sẽ đỡ lãng phí bộ nhớ
this.variableLeakMem = null
delete this.variableLeakMem
}
}
</script>
<script>
import MyCreepyAnalyticsService from './somewhere-bad'
export default {
destroyed() {
console.log(this) // There's practically nothing here!
MyCreepyAnalyticsService.informService('Component destroyed. All
assets move in on target on my mark.')
}
}
</script>
CHỐT: EVENT DESTROY CÓ THỂ DÙNG ĐỂ KIỂM CHỨNG CHO VIỆC MUỐN
DESTROY CÁC ĐỐI TƯỢNG MONG MUỐN.