https://www.smashingmagazine.com/2021/09/interactive-learning-tools-front-end-developers/#cssbattle
Categoría: JavaScript
Una API Rest que nos da un usuario
Tan sencillo como esto:
$.ajax({ url: 'https://randomuser.me/api/', dataType: 'json', success: function(data) { console.log(data); } });
REST y enlaces JS React
https://www.arquitecturajava.com/rest-url-formatos-y-buenas-practicas/
https://css-tricks.com/links-on-react-and-javascript/
Promises All y asincronía en JS
Usar import y export en JS
50 consejos para escribor mejor JS
Resolución ejercicio UF2
<div id="contenedor" class="container"> <p>Código postal: <input type="text" id="cp" placeholder="Introduzca el cp"></p> <button id="calcular" class="btn btn-success">Calcular gastos de envío</button> <h3 id="resultado"></h3> </div>
document.getElementById('calcular').addEventListener('click', calcular) function calcular () { const cp = document.getElementById('cp').value console.log(cp) // Haré los cálculos document.getElementById('resultado').innerHTML = 'Mensaje' } function gastosEnvio (cp) { /* Detectar cp Barcelona: 1 pt Detectar cp Catalunya: 3 pt Detectar cp resto: 2pt */ return 0 } function cpCorrecto (cp) { /* Detectar longitud = 5: 2 pt Detectar todo dígitos: 2 pt */ return true }
Todo resuelto:
document.getElementById('calcular').addEventListener('click', calcular) function calcular () { const cp = document.getElementById('cp').value // Haré los cálculos let mensaje = '' if (cpCorrecto(cp)) { mensaje = 'Gastos de envío: ' + gastosEnvio(cp) + ' €' } else { mensaje = 'Código incorrecto' } document.getElementById('resultado').innerHTML = mensaje } function gastosEnvio (cp) { /* Detectar cp Barcelona: 1 pt Detectar cp Catalunya: 3 pt Detectar cp resto: 2pt */ let gastos = 5 if (cp.startsWith('08')) { gastos = 0 } else if (cp.startsWith('25') || cp.startsWith('43') || cp.startsWith('17')) { gastos = 3 } return gastos } function cpCorrecto (cp) { /* Detectar longitud = 5: 2 pt cp.length==5 Detectar todo dígitos: 2 pt isNaN(cp)-> No es un número, por lo tanto la negación: !isNaN(cp) */ if (cp.length == 5 && !isNaN(cp)) { return true } else { return false } } function todoDigitos (cadena) { for (let i = 0; i < cadena.length; i++) { if (cadena.slice(i, i + 1) < '0' || cadena.slice(i, i + 1) > '9') { return false } } return true }
Ejercicio react
Vamos a hacer una tabla de multiplicar dinámica en la que tenemos dos inputs. Uno que vale 10 por defecto pero que podemos cambiar y otro que vale 1 por defecto y que también podemos cambiar.
Se nos muestra la tabla de multiplicar hasta el valor del primer número del segundo número.
Ejemplo: [__10__] [__6__]
1×6=6
2×6=12
..
10×6=60
Si cambio el valor del primero me cambia el alcance de la tabla.
Ejemplo: [__4__] [__6__]
1×6=6
2×6=12
3×6=18
4×6=24
Si cambio el valor se segundo me cambia la tabla:
Ejemplo: [__4__] [__3__]
1×3=3
2×3=6
3×3=9
4×3=12
Pista:
import React, { Component } from 'react' class Calculadora extends React.Component { constructor(props) { super(props); this.state = { numero:1,limite:10 }; } cambioValores = (event) => { let nombreInput=event.target.name; let valorInput=event.target.value; this.setState({[nombreInput]: valorInput}); } render() { let tabla=[] let limite=parseFloat(this.state.limite) for(let i=1;i<=this.state.limite;i++){ tabla.push(<p>{i}x{this.state.numero}={i*parseFloat(this.state.numero)}</p>) } return ( <div> <input type='number' name="limite" value={this.state.limite} onChange={this.cambioValores} /> <input type='number' name="numero" value={this.state.numero} onChange={this.cambioValores} /> <div>{tabla}</div> </div> ); } } export default function App() { return <Calculadora/>; }
Ejemplo React más complejo
import React, { Component } from 'react'; import logo from './logo.svg'; import './App.css'; class Form extends Component { constructor(props) { super(props) this.initialState = { nombre: '', nota: '', } this.state = this.initialState; } cambio = event => { const {name, value} = event.target; console.log(name + "|" + value); this.setState({ [name]: value }) } enviar = () => { this.props.mas(this.state.nombre, this.state.nota); this.setState(this.initialState); } render() { return ( <form> <label>Nombre</label> <input type="text" name="nombre" value={this.state.nombre} onChange={this.cambio} /> <label>Nota</label> <input type="text" name="nota" value={this.state.nota} onChange={this.cambio} /> <input type="button" onClick={this.enviar} value="Añadir"/> </form> ); } } class Cabecera extends Component { render() { return ( <tr><th>Alumno</th><th>Nota</th></tr> ); } } ; class Fila extends Component { eliminar=(e)=>{ e.stopPropagation(); this.props.menos(this.props.indice); } render() { return ( <tr onClick={() => this.props.mas(this.props.nombre, this.props.nota)}> <td>{this.props.nombre}</td><td>{this.props.nota}</td> <td><input type="button" value="Borrar" onClick={this.eliminar}/></td> </tr> ); } } ; class Tabla extends Component { constructor(props) { super(props); this.state = { alumnos: this.props.alumnos, cont: 0 }; this.mas = this.mas.bind(this); } mas(nombre, nota) { this.setState({alumnos: [...this.state.alumnos, {nombre: nombre, nota: nota}]}); } menos = (index) => { this.setState({ alumnos: this.state.alumnos.filter((alumno, i) => i != index) }); } render() { const filas = this.state.alumnos.map((fila, index) => { return (<Fila key={index} indice={index} nombre={fila.nombre} nota={fila.nota} menos={this.menos} mas={this.mas}/>); } ); return ( <div> <Form mas={this.mas}/> <button onClick={() => this.mas("Ana", 6)}>Añadir</button> <button onClick={() => this.menos(0)}>Quitar</button> <table> <thead> <Cabecera/></thead> <tbody> {filas} </tbody> </table> </div> ); } } ; class App extends Component { render() { const alumnos = [{nombre: "Ana", nota: 6}, {nombre: "Pep", nota: 4}, {nombre: "Eva", nota: 8}, {nombre: "Ot", nota: 7}]; return ( <Tabla alumnos={alumnos}/> ); } } ; export default App;
Ejercicio calculadora
Voy a hacer una calculadora super cutre con dos números y dos botones de sumar y restar.
import React, { Component } from 'react' class Calculadora extends React.Component { constructor(props) { super(props); this.state = { num1:0,num2:0,total:0 }; } cambioValores = (event) => { let nombreInput=event.target.name; let valorInput=event.target.value; this.setState({[nombreInput]: valorInput}); } suma=()=>{ let suma=parseFloat(this.state.num1)+parseFloat(this.state.num2) this.setState({total:suma}) } render() { return ( <div> <h1>Resultado: {this.state.total}</h1> <input type='number' name="num1" onChange={this.cambioValores} /> <input type='number' name="num2" onChange={this.cambioValores} /> <button onClick={this.suma}>Suma</button> </div> ); } } export default function App() { return <Calculadora/>; }