Vue Instance - developer documentation and reference notes for Vue Instance.
Vue Instance
Recovered from a request errorRecovered from a request errorĐược, mình sẽ đi sâu từng phần một về Vue Instance trong Vue 2.7. Mình chia thành các mục để bạn dễ theo dõi.
1. Vue Instance là gì?
Trong Vue 2, mọi ứng dụng Vue đều bắt đầu bằng việc tạo một root instance thông qua hàm khởi tạo new Vue():
vm (ViewModel) chính là Vue Instance. Nó đóng vai trò là cầu nối giữa DOM và data. Khi data thay đổi, instance tự động cập nhật DOM và ngược lại.
2. Cấu trúc một Vue Instance
Khi bạn truyền một options object vào new Vue({...}), Vue sẽ:
- Khởi tạo event lifecycle
- Thiết lập reactivity system (để theo dõi data)
- Biên dịch template thành render function (nếu có template)
- Mount vào DOM
- Patches DOM mỗi khi data thay đổi
3. Các thuộc tính và phương thức cốt lõi trên instance
Mỗi Vue instance đều có các thuộc tính bắt đầu bằng $:
Data & DOM
Methods
Event (chỉ trong component con)
4. Lifecycle Hooks — Instance sống như thế nào?
Lifecycle hook là các function được Vue gọi tự động tại các giai đoạn khác nhau của instance.
Chi tiết từng hook trong instance
5. Reactivity System — "Ma thuật" bên trong Instance
Đây là phần quan trọng nhất để hiểu Vue Instance hoạt động như thế nào.
Cách Vue 2 theo dõi data
Bên trong Vue 2, nó làm các bước:
- Walk object: Duyệt tất cả property trong
data,props,computed - Object.defineProperty: Định nghĩa lại getter/setter cho từng property
- Dep (Dependency): Mỗi property có một
Dep— danh sách cácWatcherđang "theo dõi" nó - Watcher: Mỗi computed, template, hoặc watch function là một Watcher
Vì sao phải dùng this.$set?
Vue 2 dùng Object.defineProperty, nên nó chỉ phát hiện được property có sẵn khi khởi tạo. Nếu bạn thêm property mới sau đó, nó không reactive:
Với array cũng vậy — chỉ các method được wrap (push, pop, splice...) mới trigger update. Gán index trực tiếp không được:
6. Root Instance vs Component Instance
Root Instance
- Không có parent — không nhận props
$parent === undefined$root === chính nó
Component Instance (do export default { ... } tạo ra)
Mỗi khi Vue compiler gặp một component tag trong template, nó tạo một Vue component instance mới:
- Có parent:
this.$parenttrỏ tớiApp - Có props:
this.$props.msg === 'hi' - Có slots:
this.$slots - Có scoped slots:
this.$scopedSlots
Ví dụ về component tree instance
Trong tree này:
E.$root=AE.$parent=DD.$children[0]=E(một trong các NavItem)
7. Render Function và Virtual DOM
Mọi Vue instance đều có một render function. Nếu bạn viết template, Vue compile thành render function.
h (createElement)
Virtual DOM là cây object JavaScript thể hiện cấu trúc DOM thực. Khi data thay đổi:
- Vue chạy render function → tạo new Virtual DOM tree
- So sánh với old Virtual DOM tree (diffing)
- Tính toán những node thực sự thay đổi
- Cập nhật DOM thật (patch) — chỉ những chỗ cần thiết
8. Instance Methods thực tế hay dùng
$watch — Theo dõi data thủ công
$refs — Truy cập DOM/Component
$nextTick — Đợi DOM cập nhật xong
9. Tổng kết
Bạn muốn mình đi sâu thêm phần nào? Ví dụ:
- Reactive system code nội bộ Vue 2 (Observer, Dep, Watcher)?
- Cách
computedcache hoạt động bên trong instance? - Slot mechanism và scoped slots?