Minipágina React

Yo tengo varias cosas.

En public tengo una carpeta img con diferentes imágenes. Si dentro de mi programa pongo ruta absoluta ‘/img/…’ React va a buscar esa imagen en la carpeta.

Tengo mi App como siempre, que en general es el punto de entrada de cualquier web.

import './App.css'; // Estilos propios del componente 
import Tarjeta from './componentes/Tarjeta'; // Importo la tarjeta


function App() {

  // Devuelvo un div con las tarjetas que quiera
  // la Tarjeta tiene unas propiedades que se pasan al componente
  // Pasamos el nombre y la url de la imagen
  return (
    <div className="App"> 
      <Tarjeta nombre="Einstein" url='/img/einstein.jpg' />
    </div>
  );
}

export default App;

El componente ‘Tarjeta’ es un componente compuesto, importa otros componentes:

import Foto from './Foto'; // Importo Foto
import Cabecera from './Cabecera'; // Importo Cabecera

// Tarjeta le paso las propiedades nombre y url
// Esto va dentro de props pero uso destructuring
function Tarjeta({nombre, url}) {
    // En el div es donde pongo la clase, porque es elemento html
    // Uso los componentes Cabecera y Foto
    return (
        <div className="tarjeta">
            <Cabecera nombre={nombre}/>
            <Foto  descripcion={nombre} url={url}/>
        </div>
    )
}

export default Tarjeta;

Cabecera.js

function Cabecera({nombre}) {
    return <h1>{nombre}</h1>;
}

export default Cabecera;

Fotos.js

function Foto({url,descripcion}) {
    return <img className="foto" src={url} alt={descripcion} />
}

export default Foto;

Más ejemplos if

# Basándonos en el imc decir al usuario si está bien en su peso o no

peso = input("Dame tu peso ek kg ")  # pido el peso y nos devuelve una cadena
altura = input("Dame tu altura en metros ")  # pido la altura y nos devuelve una cadena
peso = float(peso)  # float es para números con decimales
altura = float(altura)  # La altura tendrá decimales

imc = peso / (altura ** 2)
print("Tu imc es ", imc)
if imc < 18.5:
    print("Bajo peso")
elif imc < 25:
    print("Peso normal")
elif imc < 35:
    print("Sobrepeso")
else:
    print("Obesidad")

anyo = input("Dime tu año de nacimiento")
anyo = int(anyo)
edad = 2024 - anyo
if edad < 18:
    print("Eres menor de edad")
else:
    print("Eres mayor de edad")

# Desarrolla un programa que pida al usuario un número entero y determine si es par o impar.
# Si es par, muestra “Es un número par”, si es impar, muestra “Es un número impar”.

numero = input("Dime un número, por favor ")
numero = int(numero)
if numero % 2 == 0:
    print("Es par")
else:
    print("Es impar")

Ejemplos if python

edad = 12

if edad >= 18:
    print("Eres mayor de edad")
    print("Puedes entrar a la discoteca")
else:  # opcional y se ejecuta si no se cumple la condición
    print("Los menores de edad no tienen permitida la entrada")

print("Esto está fuera del if")

# > >= < <= == (igual)   != (diferente)

ciudad = "Barcelona"

if ciudad == "Barcelona":
    print("Tienes descuento")

if ciudad != "Tarragona":
    print("Ven a visitarnos")

# if ... elif nos permite concatenar diferentes condiciones
# Normalmente se utiliza sobre la misma variable y se usa para
# rangos
if edad < 10:
    print("Eres un infante")
elif edad < 18:
    print("Eres menor de edad")
elif edad < 65:
    print("Eres un adulto")
else:
    print("Eres un jubilado")

if edad < 18:
    if ciudad == "Barcelona":
        print("Eres un menor de edad de Barcelona")
    else:
        print("Eres un menor de edad pero no de Barcelona")
else:
    print("Eres mayor de edad")

Ejemplos React

App.js

import logo from './logo.svg';
import './App.css';
import Foto from './componentes/Foto';

function App() {
  return (
    <div className="App">
     <Foto descripcion="Einstein" url="https://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Albert_Einstein_Head.jpg/330px-Albert_Einstein_Head.jpg"/>
     <Foto descripcion="Marie Curie" url="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQbLv9v4IWJ5tPUsHQwLsWLIPhIpznuTZGsNBfoHqXYNLxPSLHf"/>
    </div>
  );
}

export default App;

/componentes/Foto.js

function Foto({url,descripcion}) {
    return <img className="foto" src={url} alt={descripcion} />
}

export default Foto;

Más React

import logo from './logo.svg';
import './App.css';
const Saludo = ({nombre,apellidos="",edad=0}) => {
  console.log(nombre,apellidos,edad)
  return <h1>Hola {nombre+" "+apellidos}, qué tal?</h1>;
}
const gestionarClick = (evt) => {
  
  console.log("clickado",evt);
}
const Despedida = () => {
  let tipo = "compañero"
  return (
    <>
      <h2  onClick={gestionarClick} className='destacado'>Adios {tipo.toUpperCase()}</h2>
      <p >Nos vemos otro día</p>
      <br />
      <img onClick={gestionarClick} className='App-logo' src={logo} />
    </>
  );
}
function App() {
  return (
    <div className="App">
      <Saludo nombre="Juan" apellidos="Pérez" edad="30" />
      <Despedida />
      <Saludo nombre="Ana" />
    </div>
  );
}

export default App;

Ejemplos React

const Saludo = (props) => {
  console.log("Hola que tal")
  return <h1>Hola {props.nombre}, qué tal?</h1>;
}
const gestionarClick = () => {
  console.log("clickado");
}
const Despedida = () => {
  let tipo = "compañero"
  return (
    <>
      <h2 className='destacado'>Adios {tipo.toUpperCase()}</h2>
      <p onClick={gestionarClick}>Nos vemos otro día</p>
      <br />
      <img className='App-logo' src={logo} />
    </>
  );
}
function App() {
  return (
    <div className="App">
      <Saludo nombre="Juan" />
      <Despedida />
      <Saludo nombre="Ana" />
    </div>
  );
}

Solución ejercicios módulos

utiliades.js

function ordenar(a, b) {
    if (a > b) {
        return [b, a];
    } else {
        return [a, b];
    }
}

function ordenarT(a, b) {
    return a > b ? [b, a] : [a, b];
}

function iniciales(nombre,apellidos){
    return [nombre.at(0)+apellidos.at(0),apellidos.at(0)+nombre.at(0)]
}

export {ordenar,ordenarT,iniciales}

test.js

import { ordenar,iniciales } from "./utilidades.js";

let [a,b]=ordenar(1,8);

console.log(a,b)

let [ini1,ini2]=iniciales("Juan","Pérez");
console.log(ini1)
console.log(ini2)

Variables en python

# Esto es un comentario
# Lo utilizo para poner cosas para mí mismo o los demás

# variables: son como cajitas donde ponemos valores
# Python es un lenguaje no tipado
# defino las variables sin poner ningún tipo
# Python sabe de que tipo son por el valor que contienen
numero = 9  # Tipo int (numero entero)
decimales = 9.5  # tipo float (numero con decimales)
cadena = "Hola que tal"  # tipo string (cadena de texto)
booleano = True  # tipo booleano, un tip especial que almacena valores cierto o falso

print(numero)  # imprimir por la consola
numero = numero + 2
print(numero)
numero = 27
print(numero)
print(type(numero))
print(decimales)
decimales = decimales + numero
print(decimales)

# no estaría muy bien visto
numero = "Ahora soy una cadena"
print(numero)
print(type(numero))

alumno = "Ana Pi"
edad = 22
email = "ana@ana.com"
print(alumno, edad, email)

# Vamos a crear una variable sueldo con valor de 2000
# Y una variable irpf con valor de 0.15
# Y luego las imprimimos por la consola

sueldo = 2000
irpf = 0.15
print(sueldo, irpf)

edad = input("Dime tu edad: ")
print(edad)
# conversiones de tipo utilizando int, float, str, bool
edad = int(edad)
print(edad)
print(type(edad))
edad = edad + 5
print(edad)

# variables: cajitas donde poner valores
# int, float, str, bool
# Python no es tipado, la variable será del tipo de su contenido
# convertir de un tipo a otro usando int,float,str,bool
# cuidado porque hay cosas que se pueden convertir y otras que no
# cualquier cosa se puede convertir en una cadena
# pero no cualquier cadena se puede convertir en un número

a = str(5)  # correcto
# b=int("hila") # error porque no se puede convertir

# print para imprimir e input para pedir cosas por la consola
# input nos devuelve una cadena, si pedimos un número lo tendremos que convertir

a = 5  # n umero
b = "5"  # cadena
a = a + 5 # correcto
b = b + 5 # error porque uno es cadena (str) y otro número (int)

Respuesta ejercicio 1 refactorizada

// Guardo el estado del juego
let juego = {
    puntos: 0,
    preguntas: [{
        pregunta: "¿Con qué propiedad se pone el color de fondo en CSS?",
        correcta: "backgroundColor",
        incorrecta1: "color",
        incorrecta2: "bckColor",
        incorrecta3: "setColor"
    },
    {
        pregunta: "¿tipo de letra en CSS?",
        correcta: "font-family",
        incorrecta1: "fontaine",
        incorrecta2: "letter",
        incorrecta3: "pp"
    },
    {
        pregunta: "¿ocultar elemento en CSS?",
        correcta: "display:none",
        incorrecta1: "display:hide",
        incorrecta2: "shadow",
        incorrecta3: "esconding"
    }]
}

// Espero a que se cargue la página
window.onload = function () {
    let boton = document.getElementById("boton");
    // Llamo a la función jugar
    boton.addEventListener("click", jugar);
}

// Aquí está la lógica del juego
function jugar() {
    // puntos que valdrán 0
    juego.puntos = 0;
    // Recorrer el array de las preguntas
    for (let pregunta of juego.preguntas) {

        // Desordeno las respuestas
        let respuestas = getRespuestasDesordenadas(pregunta);

        // Creo una cadena numerada con las respuestas
        let cadena = getCadenaArray(respuestas);
        let respuesta = Number(prompt(pregunta.pregunta + "\n" + cadena));

        // Compruebo que la respuesta esté bien
        if (respuestas[respuesta - 1] == pregunta.correcta) {
            alert("Muy bien");
            juego.puntos++;
        } else {
            alert("Muy mal, looser");
        }

    }
    // Al acabar de recorrer le mostramos los puntos
    alert("Has sacado " + juego.puntos + " puntos");

}
function getRespuestasDesordenadas({ correcta, incorrecta1, incorrecta2, incorrecta3 }) {
    let respuestas = [correcta, incorrecta1, incorrecta2, incorrecta3];
    // Desordeno el array
    respuestas.sort(() => .5 - Math.random());
    return respuestas;
}
function getCadenaArray(respuestas, separador = "  -  ") {
    let cadena = respuestas.map((valor, indice) => (indice + 1) + ") " + valor).join(separador);
    return cadena;
}

Respuesta ejercicio 1

let preguntas = [{
    pregunta: "¿Con qué propiedad se pone el color de fondo en CSS?",
    correcta: "backgroundColor",
    incorrecta1: "color",
    incorrecta2: "bckColor",
    incorrecta3: "setColor"
},
{
    pregunta: "¿tipo de letra en CSS?",
    correcta: "font-family",
    incorrecta1: "fontaine",
    incorrecta2: "letter",
    incorrecta3: "pp"
},
{
    pregunta: "¿ocultar elemento en CSS?",
    correcta: "display:none",
    incorrecta1: "display:hide",
    incorrecta2: "shadow",
    incorrecta3: "esconding"
}];

// Al pulsar un botón se desencadena la acción
// ¿Se capturar el click de un botón?

let boton = document.getElementById("boton");

// Clásica
/*
boton.onclick=function(){
    console.log("click");
}
*/
// Moderna y normalmente ahora es la preferida porque permite añadir más capturas
boton.addEventListener("click", function () {
    // puntos que valdrán 0
    let puntos = 0;
    // Recorrer el array de las preguntas
    for (let pregunta of preguntas) {
        // Para cada pregunta
        // Mostrar un prompt con el texto de la pregunta y las respuestas desordenadas
        // La pregunta-> Acceder a la propiedad del objeto
        // respuestas-> saber como desordenar una serie de respuestas
        // Guardar las respuestas en un array y desordenarlo
        let respuestas = [pregunta.correcta, pregunta.incorrecta1, pregunta.incorrecta2, pregunta.incorrecta3];
        // Desordeno el array
        respuestas.sort(() => .5 - Math.random());
        // De un array sacar una cadena es muy fácil: recorrerlo y añadir la posición +1
        // Creo la cadena juntando las respuestas. Le pongo un número a cada respuesta
        let cadena = "";
        for (let i = 0; i < respuestas.length; i++) {
            cadena += (i + 1) + ") " + respuestas[i] + "  -  ";
        }

        // Lo mismo usando map y join
        cadena = respuestas.map((valor, indice) => (indice + 1) + ") " + valor).join("  -  ");

        let respuesta = Number(prompt(pregunta.pregunta + "\n" + cadena));

        // Cuando el usuario me de la respuesta
        // Comprobar si es correcta: coger la posición del usuario -1 y ver el valor
        console.log(respuestas[respuesta - 1]);
        // Si ese valor==correcta muy bien y puntos++ else muy mal
        if (respuestas[respuesta - 1] == pregunta.correcta) {
            alert("Muy bien");
            puntos++;
        } else {
            alert("Muy mal, looser");
        }

    }
    // Al acabar de recorrer le mostramos los puntos
    alert("Has sacado " + puntos+ " puntos");

});