0

Cách tạo duration progress bar với PrimeVue ProgressBar

Tôi từng rất đau đầu khi muốn tạo 1 progress bar từ component ProgressBar của PrimeVue mà có thể chạy từ 0% đến 100% trong 1 khoảng thời gian chỉ định. Tuy nhiên khi đọc doc của PrimeVue về component này thì tôi không thấy bất cứ tuỳ chọn nào cho phép tôi làm điều này. Vậy nên chỗ này cần phải tricky một chút.

Đầu tiên chúng hãy xem document về component này: PrimeVue ProgressBar

Chúng ta thấy rằng cần truyền vào 1 prop tên là :value là 1 số từ 0 đến 100 thể hiện giá trị phần trăm của progress bar.

Tiếp theo hãy đọc đến đoạn doc Dynamnic

Ta thấy mỗi khi giá trị của progress bar thay đổi, cần 1 khoảng thời gian để giá trị cũ trượt đến giá trị mới. Vậy khoảng thời gian đó là bao nhiêu. Cùng tôi inspect element này lên:

Inspect ProgressBar's css

Để ý rằng ở đây có thuộc tính transition: width 1s ease-in-out;. Nghĩa là cần 1 giây để progress bar thay đổi giá trị. Nghĩa là khi chúng ta thay đổi giá trị từ 0% thành 100% thì progress bar này cần 1 giây để chạy. Vậy thì 1 giây chính là duration mặc định của component này. Vậy thì chúng ta chỉ cần thay đổi thuộc tính css transition-duration của element progress-bar-value bên trong component progress bar. Hãy sử dụng tính năng passthrough của PrimeVue để làm việc này:

<template>
  <ProgressBar :value="value" :pt:value:style="{ 'transition-duration': '3s' }" />
</template>

Sau đó hãy thay đổi value để xem kết quả.

Kết quả cuối cùng:

// ~/components/app/progress-bar.vue
<template>
  <p-progress-bar
    v-bind="props"
    :pt:value:style="{ 'transition-duration': props.duration }"
  />
</template>

<script setup lang="ts">
import type { ProgressBarProps } from 'primevue';

// define prop type to get suggestion in VSCode
interface AppProgressBarProps extends /* @vue-ignore */ ProgressBarProps {
  duration?: string;
}

const props = withDefaults(defineProps<AppProgressBarProps>(), {
  duration: '3s',
});
</script>

StackBlitz: https://stackblitz.com/edit/nuxt-starter-cdnmfmvv?file=components%2Fapp%2Fprogress-bar.vue


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí