Chào mừng độc giả đến với Cafedev! Trong quá trình phát triển ứng dụng Vue.js, đôi khi chúng ta cần truy cập trực tiếp vào các phần tử DOM hoặc các thể hiện thành phần con. Để làm điều này, Vue cung cấp một cách tiếp cận thông qua thuộc tính đặc biệt gọi là `ref`. Hãy cùng khám phá cách sử dụng Template Refs trong Vue.js để tận dụng sức mạnh của nó trong việc tương tác với DOM và các thành phần!
Mặc dù mô hình k-rendering biểu thị của Vue đã trừu tượng hóa hầu hết các thao tác DOM trực tiếp cho bạn, nhưng vẫn có những trường hợp mà chúng ta cần truy cập trực tiếp vào các phần tử DOM cơ bản. Để đạt được điều này, chúng ta có thể sử dụng thuộc tính đặc biệt ref
:
<input ref="input">
ref
là một thuộc tính đặc biệt, tương tự như thuộc tính key
được thảo luận trong chương v-for
. Nó cho phép chúng ta nhận một tham chiếu trực tiếp đến một phần tử DOM hoặc một thể hiện thành phần con cụ thể sau khi nó được gắn kết. Điều này có thể hữu ích khi bạn muốn, ví dụ, tập trung một đầu vào một cách chương trình trên việc gắn kết thành phần, hoặc khởi tạo một thư viện bên thứ ba trên một phần tử.
Nội dung chính
1. Truy Cập Các Refs
Để nhận tham chiếu bằng Composition API, chúng ta cần khai báo một ref với một tên phù hợp với giá trị của thuộc tính ref mẫu:
<script setup>
import { ref, onMounted } from 'vue'
// declare a ref to hold the element reference
// the name must match template ref value
const input = ref(null)
onMounted(() => {
input.value.focus()
})
</script>
<template>
<input ref="input" />
</template>
Nếu không sử dụng <script setup>, đảm bảo cũng trả về ref từ setup().
export default {
setup() {
const input = ref(null)
// ...
return {
input
}
}
}
Kết quả của ref được tiết lộ trên this.$refs
:
<script>
export default {
mounted() {
this.$refs.input.focus()
}
}
</script>
<input ref="input" />
Lưu ý rằng bạn chỉ có thể truy cập ref sau khi thành phần được gắn kết. Nếu bạn cố gắng truy cập input
trong biểu thức mẫu, nó sẽ là null
trong lần render đầu tiên. Điều này bởi vì phần tử không tồn tại cho đến sau lần render đầu tiên!
Nếu bạn đang cố gắng theo dõi các thay đổi của một ref mẫu, hãy đảm bảo xem xét trường hợp mà ref có giá trị null
:
watchEffect(() => {
if (input.value) {
input.value.focus()
} else {
// not mounted yet, or the element was unmounted (e.g. by v-if)
}
})
Xem thêm: Kiểu Refs Mẫu
2. Refs bên trong v-for
Yêu cầu v3.2.25 hoặc cao hơn
Khi ref
được sử dụng bên trong v-for
, ref tương ứng phải chứa một giá trị Mảng, sẽ được điền vào các phần tử sau khi gắn kết:
<script setup>
import { ref, onMounted } from 'vue'
const list = ref([
/* ... */
])
const itemRefs = ref([])
onMounted(() => console.log(itemRefs.value))
</script>
<ul>
<li v-for="item in list" ref="itemRefs">
{{ item }}
</li>
</ul>
Thử nghiệm ở Playground
Khi ref
được sử dụng bên trong v-for
, giá trị ref kết quả sẽ là một mảng chứa các phần tử tương ứng:
Cần lưu ý rằng mảng ref không đảm bảo cùng một thứ tự như mảng nguồn
3. Refs Kiểu Hàm
Thay vì một khóa chuỗi, thuộc tính ref
cũng có thể được ràng buộc với một hàm, sẽ được gọi trong mỗi cập nhật thành phần và cho phép bạn hoàn toàn linh hoạt về nơi lưu trữ tham chiếu đến phần tử. Hàm nhận tham chiếu phần tử làm đối số đầu tiên:
<input :ref="(el) => { /* assign el to a property or ref */ }">
Lưu ý chúng ta đang sử dụng một ràng buộc :ref
động để chúng ta có thể truyền cho nó một hàm thay vì một chuỗi tên ref. Khi phần tử bị gỡ bỏ, đối số sẽ là null
. Bạn có thể, tất nhiên, sử dụng một phương thức thay vì một hàm inline.
4. Ref trên Thành Phần
Phần này giả định bạn hiểu về Thành Phần. Hãy bỏ qua nếu bạn muốn và quay lại sau.ref
cũng có thể được sử dụng trên một thành phần con. Trong trường hợp này, tham chiếu sẽ là một thể hiện của một thành phần:
<script setup>
import { ref, onMounted } from 'vue'
import Child from './Child.vue'
const child = ref(null)
onMounted(() => {
// child.value will hold an instance of <Child />
})
</script>
<template>
<Child ref="child" />
</template>
Khi một phần tử cha nhận một thể hiện của thành phần này thông qua các ref mẫu, thể hiện được trả về sẽ có dạng { a: number, b: number }
(refs tự động được giải gói giống như trên các thể hiện bình thường).
Xem thêm: Kiểu Refs Mẫu Thành Phần
Trong kết thúc này, chúng ta đã tìm hiểu cách sử dụng Template Refs trong Vue.js để truy cập và tương tác với các phần tử DOM và thành phần con một cách thuận tiện và linh hoạt. Hy vọng rằng những kiến thức này sẽ giúp bạn xây dựng các ứng dụng Vue.js phong phú và mạnh mẽ hơn. Đừng quên theo dõi Cafedev để cập nhật thêm nhiều thông tin thú vị và hữu ích về Vue.js cũng như các công nghệ lập trình khác!
Tham khảo thêm: MIỄN PHÍ 100% | Series tự học Vuejs từ cơ bản tới nâng cao
Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của CafeDev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!