Diferència entre revisions de la pàgina «VUEJS»

De wikiserver
Dreceres ràpides: navegació, cerca
(Ejercicios)
(Es desfà la revisió 17837 de Amoncusi (Discussió))
Línia 823: Línia 823:
 
     <div id="el">  
 
     <div id="el">  
 
         <div v-for="profesor in profesores" >
 
         <div v-for="profesor in profesores" >
             <div v-text="profesor.nombre" ></div> <div v-text="profesor.edad"></div><button @click="incrementar(profesor)">+</button>
+
             <div v-text="profesor.nombre" ></div> <div v-text="profesor.edad"></div><span @click="incrementar(profesor)">+</span>
 
         </div>
 
         </div>
            <input type="text" v-model="profesorNuevo" v-on:keyup.enter="anadir">
+
        <input type="text" v-model="profesor" @click="anadir">
            <button @click="anadir">Añadir Profesor</button>
 
 
 
 
         <br>
 
         <br>
 
         {{$data}}
 
         {{$data}}
Línia 835: Línia 833:
 
     <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 
     <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 
<script>
 
<script>
     var variable = Vue.createApp({
+
    Vue.config.devtools = true
         data:() => ({
+
     var variable = new Vue({
 +
        el: '#el',
 +
         data: {
  
 
             profesor: " ",
 
             profesor: " ",
Línia 854: Línia 854:
  
 
             ]
 
             ]
         }),
+
         },
 
         methods: {
 
         methods: {
             anadir() {
+
             anadir: function(){
    if (this.profesorNuevo.trim() !== '') { // Verificar si profesorNuevo no está vacío
+
                 this.profesores.push({nombre: this.profesor, edad: 0});
                 this.profesores.push({ nombre: this.profesorNuevo, edad: "0" });
+
                 console.log(this.profesor);
                 this.profesorNuevo = ""; // Limpiar el input después de añadir
 
                }
 
 
             },
 
             },
 
             incrementar: function(profe){
 
             incrementar: function(profe){
Línia 866: Línia 864:
 
             }
 
             }
 
         }
 
         }
     }).mount("#el");
+
     });
 
     </script>
 
     </script>
 
</source>
 
</source>
Línia 896: Línia 894:
 
   <script src="https://cdn.jsdelivr.net/npm/vue"></script>   
 
   <script src="https://cdn.jsdelivr.net/npm/vue"></script>   
 
   <script>
 
   <script>
     var app = Vue.createApp({
+
     var app=new Vue({
       data:() => ({  
+
      el: '#aplicacion',
 +
       data:{  
 
         valor1: 0,
 
         valor1: 0,
 
         valor2: 0,
 
         valor2: 0,
 
         suma: ''
 
         suma: ''
       }),
+
       },
 
       methods: {
 
       methods: {
 
         sumarValores: function() {
 
         sumarValores: function() {
Línia 907: Línia 906:
 
         }
 
         }
 
       }       
 
       }       
     }).mount("#aplicacion")
+
     })
 
   </script>
 
   </script>
</body>
 
 
</source>
 
</source>
  
Línia 921: Línia 919:
 
<body>
 
<body>
 
     <div id="el">  
 
     <div id="el">  
         <div v-for="tarea in tareas" > <!--    // <div v-for="(item, index) in tareas" > -->
+
         <div v-for="tarea in tareas" >     // <div v-for="(item, index) in tareas" >
             <div v-text="tarea" ></div> <button @click="eliminar(tarea)">X</button>
+
             <div v-text="tarea" ></div> <span @click="eliminar(tarea)">X</span>
 
         </div>
 
         </div>
         <input type="text" v-model="tarea" v-on:keyup.enter="anadir"><button @click="anadir">+</button>
+
         <input type="text" v-model="tarea"><span @click="anadir">+</span>
 
         <br>
 
         <br>
 
         {{$data}}
 
         {{$data}}
Línia 932: Línia 930:
 
     <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 
     <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 
<script>
 
<script>
     var variable = Vue.createApp({
+
    Vue.config.devtools = true
         data: () => ({
+
     var variable = new Vue({
 +
        el: '#el',
 +
         data: {
  
 
             tarea: "",
 
             tarea: "",
  
 
             tareas: []
 
             tareas: []
         }),
+
         },
 
         methods: {
 
         methods: {
 
             anadir: function(){
 
             anadir: function(){
Línia 950: Línia 950:
 
              
 
              
 
         }
 
         }
     }).mount("#el");
+
     });
 
     </script>
 
     </script>
 
</body>
 
</body>
  
 
</html>
 
</html>
 +
</source>
 +
 +
 +
 +
 +
 +
'''Eventos: v-on:keypress, v-on:keyup'''
 +
 +
Mediante un control de tipo input permitir el ingreso de una frase. Mostrar por pantalla cada vez que presionamos una tecla la cantidad de letras 'a' que tiene la
 +
oración.
 +
 +
'''solución:'''
 +
 +
<source lang="javascript">
 +
<body>
 +
  <div id="aplicacion">
 +
    <p>Ingrese una frase:
 +
      <input v-model="frase" v-on:keyup="contabilizarLetrasA" type="text" size="80">
 +
    </p>
 +
    <p>Cantidad de letras 'a o 'A'':{{cantidadLetrasa}}</p>
 +
  </div>
 +
 +
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 +
  <script>
 +
    var app=new Vue({
 +
      el: '#aplicacion',
 +
      data:{
 +
        cantidadLetrasa: 0,
 +
        frase: ''
 +
      },
 +
      methods: {
 +
        contabilizarLetrasA: function () {
 +
          var cant=0;
 +
          for(var f=0; f<this.frase.length; f++)
 +
            if (this.frase[f]=='a' || this.frase[f]=='A')
 +
              cant++;
 +
          this.cantidadLetrasa=cant;
 +
        }
 +
      }
 +
    })
 +
  </script>
 +
</body>
 +
 
</source>
 
</source>
  
Línia 971: Línia 1.014:
 
       <input v-model="frase" v-on:keyup="contabilizarLetrasA" type="text" size="80">
 
       <input v-model="frase" v-on:keyup="contabilizarLetrasA" type="text" size="80">
 
     </p>
 
     </p>
     <p>Cantidad de letras 'a' o 'A':{{cantidadLetrasa}}</p>
+
     <p>Cantidad de letras 'a o 'A'':{{cantidadLetrasa}}</p>
 
   </div>
 
   </div>
  
 
   <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 
   <script src="https://cdn.jsdelivr.net/npm/vue"></script>
 
   <script>
 
   <script>
     var app= Vue.createApp({
+
     var app=new Vue({
data:() => ({  
+
      el: '#aplicacion',
 +
      data:{  
 
         cantidadLetrasa: 0,
 
         cantidadLetrasa: 0,
 
         frase: ''
 
         frase: ''
       }),
+
       },
 
       methods: {
 
       methods: {
 
         contabilizarLetrasA: function () {
 
         contabilizarLetrasA: function () {
Línia 990: Línia 1.034:
 
         }
 
         }
 
       }
 
       }
     }).mount("#aplicacion")
+
     })
 
   </script>
 
   </script>
</body>
 
 
</source>
 
</source>
  

Revisió del 13:38, 24 feb 2024


Vueimagen.png

https://www.youtube.com/watch?v=ub8ZU3JxNsM&list=PL7VXpoQP1k247QUTTxHcYBNyCg1j2ALfD

v-text: para mostrar texto y que no parpadee

v-show: para mostrar u ocultar el elemento en función de su valor. v-show="true" es igual v-show="mensaje"

V-TEXT

<body>
    <div id="el">
            <h1> {{mensaje}}</h1>    <!--podemos ver -->
    </div>
</body>
    
<script src="https://cdn.jsdelivr.net/npm/vue"></script>  //CDN
<script>
     Vue.config.devtools = true;    
     var variable = Vue.createApp({
        data: () => ({
            mensaje: "resultado"   //datos, hace referencia dentro de elemento #el {{mensaje}} 
        })
    }).mount(#el) //hace referencia al elemento id= el
    
</script>


<body>
    <div id="el">
            <h1>Hola <span v-text="mensaje"> </span></h1>   <!--muestra "Hola" y luego en función del texto del input va rellenando-->
            <input type="text" class="text" v-model="mensaje">
    </div>
</body>
   
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>

    var variable = Vue.createApp({
        data: () => ({
            mensaje: "resultado"
        })
    }).mount('#el');
    
</script>

V-SHOW

v-show: para mostrar u ocultar el elemento en función de su valor. v-show="true" es igual v-show="mensaje"

<body>

    <div id="el">
            <h1 v-show="mensaje.length > 2">Ejemplo <span v-text="mensaje"> {{mensaje}}</span></h1>  <!--al recargar la pagina, se puede ver {{mensaje}} para evitar esto se usa la directiva v-text-->
            <input type="text" class="text" v-model="mensaje">
    </div>
</body>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>

    var variable = Vue.createApp({
        data: () => ({
            mensaje: "resultado"
        })
    }).mount("#el")


</script>


<body>
  <div id="el">
    <h1 v-show="mensaje.length > 2">Hola <span v-text="mensaje"> </span></h1>   <!--si el mensaje es mayor que 2 muestra en caso contrario hace un display:none en css-->
    <input type="text" class="text" v-model="mensaje">
  </div>
</body>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>

  var variable = Vue.createApp({
    data: () => ({
      mensaje: "resultado"
    })
  }).mount("#el")

</script>

V-IF

<body>
  <div id="el">
    <h1 v-if="mensaje.length > 2">Hola <span v-text="mensaje"> </span></h1>    <!--en vez de v-show podemos usar v-if-->
    <h1 v-else>otra</h1>
    <input type="text" class="text" v-model="mensaje">
  </div>
</body>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>

  var variable = Vue.createApp({
    data: () => ({
      mensaje: "resultado"
    })
  }).mount("#el")

</script>

V-FOR

<body>
    <div id="el">
        <ul>
            <!-- <li v-text="profesores[0]"></li> -->
            <li v-for="profesor in profesores" v-text="profesor"></li>
        </ul>
    </div>
</body>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>
    var variable = Vue.createApp({
        data: () => ({
            profesores: [      //utilizamos un array con cadenas
                "Julio Noguera",
                "Albert Canela",
                "Alex Salinas"
            ]
        })
    }).mount("#el")
</script>


Recorriendo Objetos

<body>
    <div id="el">
        <ul>
            <!-- <li v-text="profesores[0]"></li> -->
            <li v-for="profesor in profesores" v-text="profesor.nombre"></li>
        </ul>
    </div>
</body>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>
    var variable = Vue.createApp({
        data: () => ({    //utilizamos un array con objetos
            profesores: [   
                {nombre:"Julio Noguera"},
                {nombre: "Albert Canela"},
                {nombre: "Alex Salinas"}

            ]
        })
    }).mount("#el")
</script>

Podemos especificar recorrer los objetos y mostrar o acceder a su contenido

<body>
   <div id="el">
        <ul>
            <!-- <li v-text="profesores[0]"></li>-->
            <li v-for="profesor in profesores">
                <span v-text="profesor.nombre"></span>
                <small v-if="profesor.activo">-Activo</small>
                <small v-else>-NO está</small>
               
            </li>
        </ul>
    </div>
</body>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>
    var variable = Vue.createApp({
        data: () => ({
            profesores: [{
                    nombre: "Julio Noguera",
                    activo: true
                },
                {
                    nombre: "Albert Canela",
                    activo: true
                },
                {
                    nombre: "Alex Salinas",
                    activo: false
                }

            ]
        })
    }).mount("#el")
</script>

//en Consola del navegador->
// variable.profesores[0].nombre ="Pepe"
// variable.profesores.push({nombre:"Joan Comas",activo:true})

EVENTOS y FUNCIONES

CLICK

Tenemos los datos mensajes y el array de profesores, también el método invertir que se ejecutará cuando se haga click en botón, también es interesante que para acceder a los datos se utiliza this.

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<body>
    <div id="el">
        <input type="text" v-model="mensaje">
        <h1 v-text="mensaje"></h1>
        <!-- <button @click="mensaje=mensaje.split('').reverse('').join('')">BOTON</button> --> 
        <!-- @click es abreviación de v-on:click -->
        <button @click="invertir">INVERTIR</button>
    </div>
</body>

<script>
    var variable = Vue.createApp({
        data: () => ({
            mensaje: "",
        }),
        methods: {
            invertir() {
                this.mensaje = this.mensaje.split('').reverse().join('');
            }
        }
    }).mount("#el");
</script>

Mostrar lista asociando evento click

<style>
.false{background:blue}
.true{background: green}
</style>
<body>
    <div class="container">
        <div id="el">
            <ul>
                <li v-for="profe in profesores">
                    <span v-text="profe.nombre"></span>
                    <span @click="profe.activo=false" v-if="profe.activo" class="false">X</span>
                    <span @click="profe.activo=true" v-else class="true">X</span>

                </li>
            </ul>
            <pre>{{$data}}</pre>
        </div>
    </div>
</body>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>
    var variable = Vue.createApp({
        data: () => ({
            profesores: [{
                    nombre: "Julio Noguera",
                    activo: true
                },
                {
                    nombre: "Albert Canela",
                    activo: true
                },
                {
                    nombre: "Alex Salinas",
                    activo: false
                }

            ]

        })
    }).mount("#el");
</script>


BOTÓN- AÑADIR LISTA

KEYUP

Eventos de teclado

<body>
    <div id="el">
        <ul>
            <li v-for="profesor in profesores">
                <span v-text="profesor.nombre"></span>
                <small v-if="profesor.activo">-Activo</small>
                <small v-else>-NO está</small>
            </li>
          <input v-on:keyup.enter="anadir" type="text" v-model="profe" >

            <!-- <input @keyup.enter="anadir" type="text" v-model="profe" > -->
        </ul>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script>
        var variable = Vue.createApp({
            data:() => ({
              profe: "",
                profesores: [
                  { nombre: "Julio Noguera", activo: true },
                  { nombre: "Albert Canela", activo: true },
                  { nombre: "Alex Salinas", activo: false }
                ]
            }),
            methods: {
                anadir() {
                    this.profesores.push({
                        nombre: this.profe,
                        activo: false
                    });
                    this.profe = ""; // Restableix el valor de profe a una cadena buida després d'afegir-lo
                }
            }
        }).mount("#el");
    </script>
</body>

DIRECTIVA V-BIND

PARA ACTIVAR CLASES

<style>
    .rojo {
        background: red;
    }

    .verde {
        background: green;
    }
    .glyphicon{
        color: white;
    }
</style>
<body>

      <div id="el">
          <ul>
            <!--//en el caso de querer añadir varias clases-->
            <!-- v-bind:class="['glyphicon',tarea.completo ? 'verde': 'rojo']" -->
              <li v-for="tarea in tareas"> 
                  <span v-bind:class="{  
                               'rojo': !tarea.completo,
                               'verde': tarea.completo
                                }" v-text="tarea.nombre" @click="tarea.completo=!tarea.completo" ></span>
                  <input type="checkbox"  v-model="tarea.completo">
              </li>
          </ul>
          <pre>
            {{$data}}
          </pre>
      </div>

</body>

<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>
  var variable = Vue.createApp({
      data: () => ({
          tareas: [
            {
                nombre: "Estudiar",
                completo: true
            },
            {
                nombre: "Repasar",
                completo: true
            },
            {
                nombre: "Examinar",
                completo: false
            }
          ]
      })
  }).mount("#el");
</script>


INCREMENTAR

Como se puede ver, se produce un incremento de voto modificando su atributo directamente.

<body>
    <div class="container">
        <h1>veamos</h1>
        <div>
            <ul>
              <li v-for="storie in stories"><button  @click="storie.votos++">Vote {{storie.politico}}</button><pre v-text="storie.votos"></pre></li>
            </ul>
        </div>
        <pre>{{$data}}</pre>
    </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script type="text/javascript">
  const app = Vue.createApp({
    data() {
      return {
        stories: [
          { politico: "julio", votos: 1 },
          { politico: "paco", votos: 2 },
          { politico: "raúl", votos: 3 },
          { politico: "jorge", votos: 4 }
        ]
      };
    },
    methods: {
      incrementVote(storie) {
        storie.votos++;
      }
    }
  }).mount(".container");

</script>

FILTRAR

<div id="aplicacion">
    <input type="range" v-model="minimo" min="0" max="50">  
    <div v-text="minimo"></div>


    <div v-for="dato in filtrar">
      <div v-text="dato.descripcion"></div>
    </div>

    <input type="search" v-model="campo">

    <div v-for="dato in busqueda">
      <div v-text="dato.descripcion"></div>
    </div>

  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script>
    var app = Vue.createApp({
      data:() => ({

        minimo: "5",

        campo: "",

        datos: [{
          codigo: 1,
          descripcion: 'papas',
          precio: 12.52
        }, {
          codigo: 2,
          descripcion: 'naranjas',
          precio: 21
        }, {
          codigo: 3,
          descripcion: 'peras',
          precio: 18.20
        }]
      }),
      computed: {
        filtrar() {
          return this.datos.filter((dato) => dato.precio > this.minimo);
        },
        busqueda() {
          return this.datos.filter((dato) => dato.descripcion.includes(this.campo));
        }

      }
    }).mount("#aplicacion")

  </script>

Componentes

1. Crear una nueva instancia de Vue con Vue.createApp

2. Existen 3 Objetos básicos y fundamentales que estarán en la mayoria de las aplicaciones web: el data y methods.

3. Se debe crear un contenedor con un id igual al del objeto el para establecer el alcance del framework


Crear Nuestro primer Componente Básico

<body>
  <div id="aplicacion">
    <!-- vue está disponible en todo este div-->
    <hola-mundo></hola-mundo>
  </div>
 
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

<script>
 

//nueva instacia de Vue : new Vue
  var app= Vue.createApp({
    data:() => ({ //capa de datos

    }),
    methods:
    {

    }
    })
    
    app.component('hola-mundo', {    //debe coincidir con el nombre del componente(etiqueta html)
    template: `<p>
                 Hola mundo
              </p>`
  });
    
    app.mount('#aplicacion')  // el elemento donde se aplicará Vue, en este caso un div con id = main);
</script>



PROPS

Props sirve para interpolar o pasar los valores que hayan dentro del atributo la etiqueta html (inglés, castellano) al objeto component

<body>
  <div id="aplicacion">
    <hola-mundo idioma="ingles"></hola-mundo>
    <hola-mundo idioma="castellano"></hola-mundo>
  </div>
 
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>
  
  var app= Vue.createApp({
  })
  
  app.component('hola-mundo', {
    props: ['idioma'],
    template: `<div>
                  <p v-if="idioma=='castellano'">Hola mundo</p>
                  <p v-if="idioma=='ingles'">Hello world</p>
              </div>`
  })
  
  app.mount("#aplicacion")
</script>

</body>

Otro Componente Básico

<body>
 
 <div id="app">
 <ejemplo nombre="Juan" apellido="Perez"></ejemplo> 
 <ejemplo nombre="Alejandra" apellido="Quiroga"></ejemplo> 
</div>


<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>
  
  var app= Vue.createApp({
  })
  
  
  app.component('ejemplo', {
   props: ['nombre', 'apellido'],
   template: '<p> Hola {{nombre}} {{apellido}} </p>' 
  });

  app.mount("#app")
</script>

</body>

Ejemplo de Componente, podemos ver que pasamos una peliculas "peliculon 1917" y una imagen en la etiqueta peliculas, que serán los valores que recibirá el componente para luego incluirlo en la plantilla.

<body>
  <div class="container">
    <peliculas titulo="peliculon 1917"
      imagen="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcSexz8IyOhoxR2ibVc78RHzpBCsvhDt3fx0wl99Qcxacht4gk9z"></peliculas>
  </div>


<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script type="text/javascript">
  

  var app = Vue.createApp({
  
  })
  
  app.component('peliculas', {

    props: ['imagen', 'titulo'],  //los props reciben los datos externos del html en este caso será "peliculon 1917" y la ruta de la imagen
    template: 
      `<div>
      <img width="100px" v-bind:src="imagen" :alt="titulo"/>  <!-- v-bind:alt se reduce en :alt , al ser un atributo no se puede usar {{}} sino v-bind-->
      <h2> {{titulo}} </h2>
      </div>`
  });
  
  app.mount(".container")

</script>
</body>


Este ejemplo, viene a basarse en el ejemplo anterior pero además coje datos del JSON data y los va mostrando

<body>
  <div class="container">
    <div v-for="(dato, index) in datos">   <!-- Corregido -->
      <peliculas :key="index" :titulo="dato.titulo" :imagen="dato.imagen">
      </peliculas>
    </div>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>

  <script type="text/javascript">
		var app = Vue.createApp({
      data: () => ({
          datos: [{
              titulo: "star wars",
              imagen: "https://vignette.wikia.nocookie.net/cine/images/8/88/Sw1.jpg/revision/latest?cb=20120930202439 "
            },
            {
              titulo: "Sonic",
              imagen: "https://www.smashbros.com/wiiu-3ds/images/character/sonic/main.png"
            },
            {
              titulo: "Mario bros",
              imagen: "https://imagenesparapeques.com/wp-content/uploads/2021/05/Mario-Bros-png-transparente.png"
            }
          ]

        })
    })

    app.component('peliculas', {
     props: ['titulo', 'imagen'],
      template: `<div>
        <img width="100px" :src="imagen" :alt="titulo"/>
        <h2>{{ titulo }}</h2>
      </div>`
    });
    
		app.mount(".container")

  </script>
</body>

Ejercicios

https://www.tutorialesprogramacionya.com/vueya/

https://www.youtube.com/watch?v=jfEEQVdbl54&list=PLPl81lqbj-4J-gfAERGDCdOQtVgRhSvIT&index=7&t=0s