\n`\n\nTrong template, bạn không cần sử dụng `this.` để truy cập các thuộc tính `data`. Vue.js sẽ tự động phân giải chúng trong phạm vi của template.\n\n**2. Truy cập trong Methods (Options API):**\n\nTrong các phương thức (`methods`) của component, bạn truy cập các thuộc tính","keywords":"VueJS","about":[{"@type":"Thing","name":"VueJS"}],"interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"comment":[]}
TopDev

Data trong Vue.js: Cách khai báo và truy cập hiệu quả

topdev 📖 9 phút đọc

Vue.js là một framework JavaScript mạnh mẽ để xây dựng giao diện người dùng tương tác. Một trong những khái niệm cốt lõi và quan trọng nhất trong Vue.js chính là data. data là nơi chúng ta lưu trữ trạng thái của ứng dụng, những thông tin mà giao diện người dùng sẽ hiển thị và tương tác. Hiểu rõ cách khai báo và truy cập data là chìa khóa để xây dựng các ứng dụng Vue.js hiệu quả và dễ bảo trì. Bài viết này sẽ đi sâu vào cơ chế hoạt động của data trong Vue.js, từ cách khai báo cơ bản đến những phương pháp truy cập nâng cao, kèm theo các ví dụ minh họa chi tiết.

Khai báo Data trong Vue.js: Nền tảng của sự phản ứng#

Trong Vue.js, data được khai báo như một hàm trả về một đối tượng (object) bên trong tùy chọn data của một component. Đây là cách tiếp cận được khuyến nghị và là tiêu chuẩn vàng trong Vue.js để đảm bảo tính độc lập của dữ liệu cho mỗi instance của component. Lý do cho việc sử dụng một hàm thay vì một đối tượng trực tiếp là để tránh việc chia sẻ cùng một tham chiếu đối tượng dữ liệu giữa nhiều instance của cùng một component, điều này có thể dẫn đến các lỗi không mong muốn và khó gỡ lỗi.

1. Khai báo Cơ bản (Component Options API):

Đây là cách khai báo phổ biến nhất khi sử dụng Options API của Vue.js. Bạn định nghĩa một hàm data trả về một đối tượng chứa các thuộc tính (properties) mà bạn muốn lưu trữ.

export default { data() { return { message: 'Xin chào Vue.js!', count: 0, user: { name: 'John Doe', age: 30 }, items: [ { id: 1, name: 'Item A' }, { id: 2, name: 'Item B' } ] }; } };

Trong ví dụ trên, chúng ta đã khai báo các thuộc tính message (kiểu chuỗi), count (kiểu số), user (kiểu đối tượng lồng ghép) và items (kiểu mảng các đối tượng). Vue.js sẽ tự động biến các thuộc tính này thành các thuộc tính phản ứng (reactive properties). Điều này có nghĩa là khi giá trị của chúng thay đổi, giao diện người dùng phụ thuộc vào chúng sẽ tự động được cập nhật.

2. Khai báo với Composition API (Vue 3):

Với sự ra đời của Composition API trong Vue 3, cách khai báo data có phần khác biệt, tập trung vào việc sử dụng các hàm phản ứng như refreactive.

` import { ref, reactive } from 'vue';

export default { setup() { const message = ref('Xin chào Composition API!'); // Sử dụng ref cho các kiểu dữ liệu nguyên thủy const count = ref(0);

const user = reactive({ // Sử dụng reactive cho các đối tượng
  name: 'Jane Doe',
  age: 25
});

const items = reactive([
  { id: 1, name: 'Product X' },
  { id: 2, name: 'Product Y' }
]);

return {
  message,
  count,
  user,
  items
};

} }; `

  • ref: Thường được sử dụng cho các kiểu dữ liệu nguyên thủy (string, number, boolean) và đôi khi cũng dùng cho đối tượng/mảng. Khi truy cập giá trị của ref bên trong <template>, bạn không cần .value. Tuy nhiên, khi truy cập trong <script>, bạn phải sử dụng .value (ví dụ: message.value = 'Hello').

  • reactive: Thường được sử dụng cho các đối tượng và mảng. reactive biến toàn bộ đối tượng/mảng thành một Proxy, cho phép Vue theo dõi sự thay đổi bên trong đối tượng/mảng đó mà không cần .value khi truy cập. Tuy nhiên, nếu bạn gán lại một đối tượng/mảng hoàn toàn mới cho biến reactive, tính phản ứng có thể bị mất.

Cả refreactive đều tạo ra các thuộc tính phản ứng, đảm bảo giao diện được cập nhật khi dữ liệu thay đổi.

Truy cập Data trong Vue.js: Tương tác với trạng thái ứng dụng#

Sau khi đã khai báo data, việc truy cập và thao tác với chúng là bước tiếp theo để xây dựng logic ứng dụng. Vue.js cung cấp nhiều cách để truy cập data tùy thuộc vào ngữ cảnh.

1. Truy cập trong Template (Options API & Composition API):

Trong phần <template> của component, bạn có thể truy cập trực tiếp các thuộc tính data bằng cách sử dụng cú pháp dấu ngoặc nhọn kép (Mustache syntax) {{ propertyName }} hoặc thông qua v-bind và v-model.

`

`

Trong template, bạn không cần sử dụng this. để truy cập các thuộc tính data. Vue.js sẽ tự động phân giải chúng trong phạm vi của template.

2. Truy cập trong Methods (Options API):

Trong các phương thức (methods) của component, bạn truy cập các thuộc tính data thông qua từ khóa this.

export default { data() { return { count: 0 }; }, methods: { incrementCount() { this.count++; // Truy cập và thay đổi giá trị của count }, resetMessage() { this.message = 'Giá trị mặc định'; // Lỗi: message không được khai báo trong data } } };

Điều quan trọng là this trong methods sẽ luôn trỏ đến instance của component, đảm bảo bạn có thể truy cập tất cả các thuộc tính của nó, bao gồm data, computed, methods, v.v.

3. Truy cập trong Computed Properties (Options API):

Computed properties là các thuộc tính được tính toán dựa trên các thuộc tính data khác. Chúng cũng truy cập data thông qua this.

export default { data() { return { firstName: 'John', lastName: 'Doe' }; }, computed: { fullName() { return this.firstName + ' ' + this.lastName; } } };

4. Truy cập trong Watchers (Options API):

Watchers cho phép bạn thực hiện các hành động không đồng bộ hoặc phức tạp khi một thuộc tính data cụ thể thay đổi. Chúng cũng truy cập data thông qua this.

export default { data() { return { question: '', answer: 'Tôi không thể trả lời cho đến khi bạn đặt câu hỏi!' }; }, watch: { question(newQuestion, oldQuestion) { if (newQuestion.includes('?')) { this.answer = 'Đang suy nghĩ...'; // Giả lập một API call setTimeout(() => { this.answer = 'Chắc chắn rồi!'; }, 500); } } } };

5. Truy cập trong Composition API (setup() function):

Trong Composition API, bạn truy cập các biến phản ứng (ref hoặc reactive) trực tiếp trong hàm setup(). Lưu ý cách truy cập giá trị của ref bằng .value khi ở trong <script>.

` import { ref, reactive } from 'vue';

export default { setup() { const message = ref('Hello Vue!'); const user = reactive({ name: 'Alice' });

const updateMessage = () => {
  message.value = 'Message Updated!'; // Truy cập .value của ref
};

const updateUserName = () => {
  user.name = 'Bob'; // Truy cập trực tiếp thuộc tính của reactive object
};

return {
  message,
  user,
  updateMessage,
  updateUserName
};

} }; `

Khi trả về các biến từ setup(), chúng sẽ được tự động giải phóng (unwrapped) để có thể truy cập trực tiếp trong template mà không cần .value.

Nguyên tắc quan trọng khi làm việc với Data trong Vue.js#

1. Tính phản ứng (Reactivity):

Vue.js sử dụng một hệ thống phản ứng để tự động cập nhật giao diện người dùng khi dữ liệu thay đổi. Khi bạn khai báo data, Vue sẽ đi qua tất cả các thuộc tính của đối tượng data và chuyển đổi chúng thành các getter/setter. Khi một getter được truy cập, Vue sẽ theo dõi nó như một dependency. Khi một setter được gọi, Vue sẽ thông báo cho các dependency đã theo dõi để kích hoạt quá trình cập nhật giao diện.

2. Khai báo tất cả các thuộc tính ban đầu:

Vue không thể phát hiện các thuộc tính mới được thêm vào một đối tượng sau khi nó đã được khởi tạo. Điều này có nghĩa là nếu bạn thêm một thuộc tính mới vào đối tượng data sau khi component đã được tạo, Vue sẽ không làm cho thuộc tính đó phản ứng và giao diện sẽ không cập nhật khi thuộc tính đó thay đổi.

export default { data() { return { user: { name: 'Alice' } }; }, methods: { addEmail() { this.user.email = 'alice@example.com'; // email sẽ không phản ứng! } } };

Để khắc phục điều này, bạn nên khai báo tất cả các thuộc tính mà bạn dự định sử dụng ngay từ đầu, ngay cả khi chúng có giá trị ban đầu là null hoặc undefined.

export default { data() { return { user: { name: 'Alice', email: null } // Khai báo email ngay từ đầu }; }, methods: { addEmail() { this.user.email = 'alice@example.com'; // Bây giờ email sẽ phản ứng } } };

Hoặc sử dụng Vue.set (Vue 2) hoặc tạo lại đối tượng (Vue 3/Composition API) nếu bạn thực sự cần thêm thuộc tính động.

` // Vue 2 import Vue from 'vue'; // ... Vue.set(this.user, 'email', 'alice@example.com');

// Vue 3 (Composition API) const user = reactive({ name: 'Alice' }); user.email = 'alice@example.com'; // Hoạt động tốt với reactive

// Nếu bạn phải thay thế một đối tượng: const user = ref({ name: 'Alice' }); user.value = { ...user.value, email: 'alice@example.com' }; `

3. Giới hạn của thay đổi mảng:

Vue không thể phát hiện các thay đổi khi bạn trực tiếp gán giá trị cho một phần tử của mảng bằng chỉ số (e.g., this.items[0] = newItem) hoặc khi bạn thay đổi độ dài của mảng (e.g., this.items.length = 0). Để đảm bảo tính phản ứng, hãy sử dụng các phương thức sửa đổi mảng như push(), pop(), shift(), unshift(), splice(), sort(), reverse() hoặc tạo một mảng mới.

` // Không phản ứng this.items[0] = { id: 3, name: 'Item C' }; this.items.length = 0;

// Phản ứng this.items.push({ id: 3, name: 'Item C' }); this.items.splice(0, this.items.length); // Xóa tất cả phần tử this.items = []; // Tạo mảng mới cũng phản ứng `

Kết luận#

data là trái tim của mọi ứng dụng Vue.js. Bằng cách hiểu rõ cách khai báo data dưới dạng một hàm trả về đối tượng (hoặc sử dụng ref/reactive với Composition API) và cách truy cập chúng thông qua this trong Options API hoặc trực tiếp các biến phản ứng trong Composition API, bạn có thể xây dựng các ứng dụng Vue.js mạnh mẽ, linh hoạt và dễ bảo trì. Luôn ghi nhớ các nguyên tắc về tính phản ứng của Vue để tránh các lỗi tiềm ẩn và đảm bảo rằng giao diện người dùng của bạn luôn được cập nhật chính xác với trạng thái ứng dụng.

Bài liên quan trong #VueJS

✓ Đã sao chép link