Galera, no desafio de criar um componente para o botão, dei uma improvisada e fiz dessa forma:
Parte que chamo o botão no componente temporizador:
<template>
<div class="is-flex is-align-items-center is-justify-content-space-between">
<CronometroPrincipal :tempoEmSegundos="tempoEmSegundos" />
<BotaoPrincipal :icon="iconPlay" :nomeBotao="nomeBotaoPlay" :iniciar="iniciar" :cronometroRodando="cronometroRodando"/>
<BotaoPrincipal :icon="iconStop" :nomeBotao="nomeBotaoStop" :finalizar="finalizar" :cronometroRodando="!cronometroRodando"/>
</div>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import CronometroPrincipal from "./CronometroPrincipal.vue";
import BotaoPrincipal from "./BotaoPrincipal.vue";
export default defineComponent({
name: "TemporizadorPrincipal",
emits: ['aoTemporizadorFinalizado'],
components: {
CronometroPrincipal,
BotaoPrincipal
},
data() {
return {
tempoEmSegundos: 0,
cronometro: 0,
cronometroRodando: false,
iconPlay: 'fas fa-play',
iconStop: 'fas fa-stop',
nomeBotaoPlay: 'play',
nomeBotaoStop: 'stop',
};
},
methods: {
iniciar() {
this.cronometroRodando = true;
this.cronometro = setInterval(() => {
this.tempoEmSegundos += 1;
}, 1000);
},
finalizar() {
this.cronometroRodando = false;
clearInterval(this.cronometro);
this.$emit('aoTemporizadorFinalizado', this.tempoEmSegundos);
this.tempoEmSegundos = 0;
},
},
});
</script>
Parte do componente do botao, ao invés de criar uma função para validar o estado, criei uma condicional ternária:
<template>
<button class="button" @click="estado" :disabled="cronometroRodando">
<span class="icon">
<i :class="icon"></i>
</span>
<span>{{ nomeBotao }}</span>
</button>
</template>
<script lang="ts">
import {defineComponent} from 'vue'
export default defineComponent({
name: 'BotaoPrincipal',
props: {
iniciar: {},
finalizar: {},
icon: {
type: String,
required: true
},
nomeBotao: {
type: String,
required: true
},
cronometroRodando: {
type: Boolean
},
},
data () {
return {
estado: this.iniciar ? this.iniciar : this.finalizar,
}
},
})
</script>
Obs: Está funcionando sem erros porem não sei se podemos fazer dessa forma..