Migrar Vista CreateOrEdit.vue
Tomando en cuenta las consideraciones sobre el gancho
setupde 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
<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
templateno sufre ninguna modificación.
