Skip to content

Refactorizar Vista CreateOrEdit.vue

En esta sección aplicaremos exactamente lo mismo que en la sección anterior, es decir, consumir e implementar nuestro servicio y tipado.

En el siguiente código resaltado notará los cambios que hicimos para mejorar nuestro código.

📃./views/CreateOrEdit.vue

vue
<script lang="ts">
import { defineComponent } from 'vue'
import * as Services from '../services/'
import FormTask from '../components/FormTask.vue'
import type { Task } from '@/types'

export default defineComponent({
  props: {
    id: String
  },
  components: {
    FormTask
  },
  data() {
    return {
      task: {} as Task,
      pending: false
    }
  },
  mounted() {
    if (this.$props.id)
      this.getTask();
  },
  computed: {
    isRenderable() {
        return (this.$props.id && Object.keys(this.task).length > 0)
          || this.$props.id===undefined
    }
  },  
  methods: {
    getTask() {
      this.pending = true
      Services.getTask(this.$props.id)
        .then(response => this.task = response.data)
        .catch(
          error => console.log({
            errorCode: error.code, errorMessage: error.message
          })
        )
        .finally(() => this.pending = false)
    },
    submit(payload: Task) {
      this.pending = true
      if (this.$props.id===undefined) {
        Services.insertTask(payload)
          .then(response => {
            alert(response.data.message)
            this.$router.push({name: 'index'})
          })
          .catch(error => console.log(error))
          .finally(() => this.pending = false)
      } else {      
        Services.updateTask(this.$props.id, payload)
          .then(response => {
            alert(response.data.message)
            this.$router.push({name: 'index'})
          })
          .catch(error => console.log(error))
          .finally(() => this.pending = false)
      }
    }  
  }
})
</script>

<template>
  <div class="container row col-md-6 mx-auto w-1/2">
    <h1 v-if="pending" class="text-2xl" align="center">Loading...</h1>
    <h1 v-else class="text-2xl" align="center">
      {{$props.id ? 'Editing' : 'Creating'}} Tast
    </h1>
    <FormTask v-if="isRenderable" :task="task" @submit='submit' />
  </div>
</template>

Ahora, solo nos toca mejorar el componente FormTask.vue, sigamos avanzando...