24 - Componentes: slot-scope

Hay otra variante de slot que nos permiten comunicar datos desde la componente a donde la definimos a la misma.

Con esta variante podemos crear una componente que tenga una forma de mostrar datos por defecto, pero si se define un slot-scope luego la forma de mostrar los datos queda como responsabilidad fuera de la componente.

Problema

Crear una componente llamada 'dias-semana'. Por defecto muestra los días uno al lado del otro separados por un guión. Definir un slot-scope que pase cada día para que en la zona del HTML donde se define un objeto se muestre de diferente forma.

<!doctype html>
<html>
<head>
  <title>Prueba Vue</title> 
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<body>
  <div id="aplicacion1">
    <dias-semana></dias-semana>
    <hr>
    <dias-semana>
      <h1 slot-scope="valor">
       {{valor.nombre}} 
      </h1>
    </dias-semana>
    <hr>
    <dias-semana>
      <p slot-scope="valor">
        Día:{{valor.nombre}} 
      </p>
    </dias-semana>    
  </div>
 
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

<script>
Vue.component('dias-semana', {
  template:`<div><slot v-for="dia in dias" v-bind:nombre="dia">{{dia}}-</slot></div>`,
  data: function() {
    return {
      dias: ['lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado', 'domingo']
    }
  }
})

new Vue({
  el: '#aplicacion1'
})
</script>
</body>
</html>

{{valor.nombre}}


Día:{{valor.nombre}}

En la componente del modelo definimos un vector con los 7 días de la semana. En el template definimos un slot y una propiedad llamada nombre con la directiva v-bind:

Vue.component('dias-semana', {
  template:`<div><slot v-for="dia in dias" v-bind:nombre="dia">{{dia}}-</slot></div>`,
  data: function() {
    return {
      dias: ['lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado', 'domingo']
    }
  }
})

Si definimos una componente sin slot luego se ejecuta el template mostrando cada día separado por un guión:

    <dias-semana></dias-semana>

Si le pasamos un slot con la propiedad slot-spope luego podemos recuperar los datos que se envían desde la componente y mostrarlos según nuestras necesidades:

    <dias-semana>
      <h1 slot-scope="valor">
       {{valor.nombre}} 
      </h1>
    </dias-semana>

Se muestran cada día como un título h1.

El tercer elemento 'dias-semana' se muestran uno por párrafo junto a la etiqueta 'Día:'

    <dias-semana>
      <p slot-scope="valor">
        Día:{{valor.nombre}} 
      </p>
    </dias-semana>    

Ejecutar Ejemplo

Resolver problema propuesto

Retornar