Hagamos un CRUD

Pare nuestro CRUD lo primero que necesitamos hacer e una clase repositorio que nos permita comunicarnos con la API:

import axios from 'axios'

let api_url = 'http://localhost:5000/api/v1';

class PeliculasRepo {
    obtenerTodas() {
        return axios.get(`${ api_url }/peliculas`);
    }

    obtenerUna(id) {
        return axios.get(`${ api_url }/peliculas/${ id }`);
    }

    agregar(pelicula) {
        return axios.post(`${ api_url }/peliculas`, pelicula);
    }

    modificar(id, pelicula) {
        return axios.put(`${ api_url }/peliculas/${ id }`, pelicula);
    }

    eliminar(id,) {
        return axios.delete(`${ api_url }/peliculas/${ id }`);
    }
}

export default new PeliculasRepo();

Luego creamos nuestro componente:

<template>
    <div>
        <h3>Películas</h3>
        <div class="row">
            <div class="col">
                <a href="" @click.prevent="agregar">Nueva película</a>
            </div>
        </div>
        <div class="row" v-if="showForm">
            <div class="col">
                <form @submit.prevent="guardar">
                    <div class="form-group">
                        <label for="pelicula_nombre">Nombre:</label>
                        <input type="text" class="form-control" id="pelicula_nombre" v-model="pelicula.nombre">
                    </div>
                    <div class="form-group">
                        <label for="pelicula_nombre">Código IMDB:</label>
                        <input type="text" class="form-control" id="pelicula_codigo" v-model="pelicula.codigoIMDB">
                    </div>
                    <div class="form-group">
                        <label for="pelicula_nombre">Código IMDB:</label>
                        <textarea class="form-control" id="pelicula_codigo" v-model="pelicula.resumen"></textarea>
                    </div>
                    <div class="form-group">
                        <button type="submit" class="btn btn-primary">Guardar</button>
                        <button type="button" class="btn btn-danger" @click="showForm = false">Cancelar</button>
                    </div>
                </form>
            </div>
        </div>
        <div class="row">
            <div class="col">
                <table class="table">
                    <thead>
                        <tr>
                            <th>#</th>
                            <th>Nombre</th>
                            <th>Codigo IMDB</th>
                            <th>Resumen</th>
                            <th></th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr v-for="pelicula, i in peliculas">
                            <td>{{ i + 1 }}</td>
                            <td>{{ pelicula.nombre }}</td>
                            <td>{{ pelicula.codigoIMDB }}</td>
                            <td>{{ pelicula.resumen }}</td>
                            <td>
                                <a href="" @click.prevent="editar(pelicula)">Editar</a>
                                <a href="" @click.prevent="eliminar(pelicula)">Eliminar</a>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</template>

<script>
import peliculasRepo from '../repositories/peliculas-repo'

function obtenerPeliculas() {
    peliculasRepo.obtenerTodas().then(response => {
        this.peliculas = response.data;
    }).catch(error => {
        alert("Ocurrió un error descargando el listado de películas");
    });
}

function agregarPelicula() {
    peliculasRepo.agregar(this.pelicula).then(response => {
        obtenerPeliculas.call(this);
        this.showForm = false;
    }).catch(error => {
        alert("Ocurrió un error");
    });
}

function modificarPelicula() {
    peliculasRepo.modificar(this.id, this.pelicula).then(response => {
        obtenerPeliculas.call(this);
        this.id = null;
        this.showForm = false;
    }).catch(error => {
        alert("Ocurrió un error");
    });
}

function eliminarPelicula() {
    peliculasRepo.eliminar(this.id).then(response => {
        obtenerPeliculas.call(this);
        this.id = null;
    }).catch(error => {
        alert("Ocurrió un error");
    });
}

export default {
    data() {
        return {
            showForm: false,
            id: null,
            peliculas: [],
            pelicula: {}
        }
    },
    methods: {
        agregar() {
            this.showForm = true;
            this.id = null;
            this.pelicula = {};
        },
        editar(pelicula) {
            this.showForm = true;
            this.id = pelicula.id;
            this.pelicula = {
                nombre: pelicula.nombre,
                codigoIMDB: pelicula.codigoIMDB,
                resumen: pelicula.resumen,
                directorId: pelicula.directorId
            };
        },
        eliminar(pelicula) {
            if(confirm('Esta seguro??')) {
                this.id = pelicula.id;
                eliminarPelicula.call(this);
            }
        },
        guardar() {
            if(this.id) {
                modificarPelicula.call(this);
            } else {
                agregarPelicula.call(this);
            }
        }
    },
    created() {
        obtenerPeliculas.call(this);
    }
}
</script>

Las funciones (Ej. obtenerPeliculas, agregarPelicula, modificarPelicula, eliminarPelicula) pueden pasarse a otro archivo .js (preferiblemente un servicio), en caso de que el componente se vuelva muy pesado.

No olvide agregar el componente al archivo routes.js y al menú

results matching ""

    No results matching ""