Skip to content

Migrar Vista CreateOrEdit.vue

Tomando en cuenta las consideraciones sobre el gancho setup de la Composition API descritas en la sección anterior, avancemos entonces con el archivo ./views/CreateOrEdit.vue.

./views/CreateOrEdit.vue

Tenga en cuenta que las props y components hijos, se declaran en la Composition API igual que lo venimos haciendo en la Options API. De hecho, recuerde que el gancho setup es una opción más de la misma.

Una diferencia entre la Options API y la Composition API es que el router es instanciado como un composable.

La diferencia de la ./views/Index.vue con respecto a la ./views/CreateOrEdit.vue, es que en esta debemos pasar como argumento las props al gancho setup().

Note que aquí también necesitamos importar el método computed de nuestro framework Vue, así como lo hicimos previamente en la sección anterior con onMounted.

📃./views/CreateOrEdit.vue

vue
<script lang="ts">
import { computed, defineComponent, ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import * as Services from '../services/'
import FormTask from '../components/FormTask.vue'
import type { Task } from '@/types'

export default defineComponent({
  props: {
    id: String
  },
  components: {
    FormTask
  },
  setup(props) {
    const router = useRouter()
    const task = ref({} as Task)
    const pending = ref(false)

    const isRenderable = computed(
      ()=> (props.id && Object.keys(task.value).length > 0)
        || props.id===undefined
    )
    
    const getTask = ()=> {
      pending.value = true
      Services.getTask(props.id)
        .then(response => task.value = response.data)
        .catch(
          error => console.log({
            errorCode: error.code, errorMessage: error.message
          })
        )
        .finally(() => pending.value = false)
    }

    const submit = (payload: Task) => {
      pending.value = true
      if (props.id===undefined) {
        Services.insertTask(payload)
          .then(response => {
            alert(response.data.message)
            router.push({name: 'index'})
          })
          .catch(error => console.log(error))
          .finally(() => pending.value = false)
      } else {      
        Services.updateTask(props.id, payload)
          .then(response => {
            alert(response.data.message)
            router.push({name: 'index'})
          })
          .catch(error => console.log(error))
          .finally(() => pending.value = false)
      }
    }

    onMounted(()=>{
      if (props.id)
        getTask();
    })

    return {
      isRenderable,
      pending,
      task,

      submit
    }
  }
})
</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>

Tenga en cuenta que el template no sufre ninguna modificación.