Việc sử dụng Vue Router cùng với Composition API đã mở ra nhiều khả năng mới cho các nhà phát triển. Tại Cafedev, chúng tôi sẽ hướng dẫn bạn cách kết hợp hai công cụ mạnh mẽ này để tối ưu hóa ứng dụng Vuejs của bạn. Bài viết này sẽ giúp bạn hiểu rõ cách truy cập Router và Route trong `setup`, cũng như cách sử dụng các bộ bảo vệ điều hướng và `useLink`. Hãy cùng khám phá chi tiết qua bài viết dưới đây!


Việc giới thiệu Composition API của Vue đã mở ra nhiều khả năng mới, nhưng để có thể tận dụng tối đa Vue Router, chúng ta cần sử dụng một vài hàm mới để thay thế việc truy cập this và các bộ bảo vệ điều hướng trong thành phần.

1. Truy cập Router và Route hiện tại bên trong setup

Vì chúng ta không có quyền truy cập this bên trong setup, chúng ta không thể trực tiếp truy cập this.$router hoặc this.$route. Thay vào đó, chúng ta sử dụng các hàm composable useRouteruseRoute:

<script setup>
import { useRouter, useRoute } from 'vue-router'

const router = useRouter()
const route = useRoute()

function pushWithQuery(query) {
  router.push({
    name: 'search',
    query: {
      ...route.query,
      ...query,
    },
  })
}
</script>

Đối tượng route là một đối tượng phản ứng. Trong hầu hết các trường hợp, bạn nên tránh theo dõi toàn bộ đối tượng route. Thay vào đó, bạn có thể trực tiếp theo dõi các thuộc tính mà bạn dự kiến sẽ thay đổi:

<script setup>
import { useRoute } from 'vue-router'
import { ref, watch } from 'vue'

const route = useRoute()
const userData = ref()

// fetch the user information when params change
watch(
  () => route.params.id,
  async newId => {
    userData.value = await fetchUser(newId)
  }
)
</script>

Lưu ý rằng chúng ta vẫn có quyền truy cập $router$route trong các mẫu, vì vậy không cần phải sử dụng useRouter hoặc useRoute nếu chúng ta chỉ cần các đối tượng đó trong mẫu.

2. Bộ bảo vệ điều hướng

Vue Router cung cấp các bộ bảo vệ cập nhật và rời khỏi dưới dạng các hàm của Composition API:

<script setup>
import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
import { ref } from 'vue'

// same as beforeRouteLeave option but with no access to `this`
onBeforeRouteLeave((to, from) => {
  const answer = window.confirm(
    'Do you really want to leave? you have unsaved changes!'
  )
  // cancel the navigation and stay on the same page
  if (!answer) return false
})

const userData = ref()

// same as beforeRouteUpdate option but with no access to `this`
onBeforeRouteUpdate(async (to, from) => {
  // only fetch the user if the id changed as maybe only the query or the hash changed
  if (to.params.id !== from.params.id) {
    userData.value = await fetchUser(to.params.id)
  }
})
</script>

Các bộ bảo vệ của Composition API cũng có thể được sử dụng trong bất kỳ thành phần nào được hiển thị bởi , không cần phải sử dụng trực tiếp trên thành phần tuyến đường như các bộ bảo vệ trong thành phần.

3. useLink

Vue Router cung cấp hành vi nội bộ của RouterLink dưới dạng một composable. Nó chấp nhận một đối tượng phản ứng như các thuộc tính của RouterLink và cung cấp các thuộc tính cấp thấp để xây dựng thành phần RouterLink của riêng bạn hoặc tạo các liên kết tùy chỉnh:

<script setup>
import { RouterLink, useLink } from 'vue-router'
import { computed } from 'vue'

const props = defineProps({
  // add @ts-ignore if using TypeScript
  ...RouterLink.props,
  inactiveClass: String,
})

const {
  // the resolved route object
  route,
  // the href to use in a link
  href,
  // boolean ref indicating if the link is active
  isActive,
  // boolean ref indicating if the link is exactly active
  isExactActive,
  // function to navigate to the link
  navigate
} = useLink(props)

const isExternalLink = computed(
  () => typeof props.to === 'string' && props.to.startsWith('http')
)
</script>

Lưu ý rằng v-slot của RouterLink cung cấp quyền truy cập vào các thuộc tính tương tự như composable useLink.

Qua bài viết này, hy vọng bạn đã nắm được cách sử dụng Vue Router kết hợp với Composition API để tạo ra các ứng dụng Vuejs linh hoạt và hiệu quả hơn. Những kỹ thuật này sẽ giúp bạn tận dụng tối đa các tính năng mạnh mẽ của Vuejs. Nếu có bất kỳ câu hỏi hoặc thắc mắc nào, hãy liên hệ với Cafedev để được hỗ trợ. Cảm ơn bạn đã theo dõi và chúc bạn thành công trong quá trình phát triển ứng dụng!

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!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!