#typescript #vue.js #vue-composition-api
Вопрос:
У меня есть пользовательский класс, содержащий свойства, и мне интересно, как я могу обновить файл vue, чтобы отразить изменение свойств. Для простоты я уменьшил свой пользовательский класс (который я расширю в будущем, чтобы иметь больше свойств.
В этом примере я ожидаю, что btn изменит цвет и значок, когда пользователь нажмет на него, на основе свойства «Проигрывается» на моем секундомере пользовательского класса.
main.vue
<template>
<q-page padding class="text-center q-pa-md">
<q-btn
:color="sw.isPlaying ? 'red' : 'green'"
:icon="sw.isPlaying ? 'mdi-pause' : 'mdi-play'"
@click="sw.toggle()"
/>
</q-page>
</template>
<script lang="ts">
import {
defineComponent,
ref,
computed,
onMounted,
onUnmounted
} from '@vue/composition-api';
import Stopwatch from 'src/utils/stopwatch';
export default defineComponent({
name: 'Stopwatch',
components: {},
setup() {
const sw = computed(() => new Stopwatch());
return {
sw
};
}
});
</script>
секундомер.ts
export default class Stopwatch {
isPlaying: boolean;
constructor() {
this.isPlaying = false;
}
// Start timer or continue from paused time
startTimer() {
this.isPlaying = true;
console.log('play');
}
// Stop/Pause the timer
stopTimer() {
this.isPlaying = false;
console.log('stop');
}
// Start/Stop timer or continue from paused time
toggle() {
if (this.isPlaying) {
this.stopTimer();
} else {
this.startTimer();
}
}
}
Ответ №1:
Вместо computed
этого используйте , reactive
чтобы сделать Stopwatch
реквизиты экземпляра реактивными:
import { defineComponent, reactive } from '@vue/composition/api'
export default defineComponent({
setup() {
const sw = reactive(new Stopwatch());
return {
sw
};
}
});
Комментарии:
1. спасибо, что поделились этой демонстрацией, а не просто кодом. очень признателен