diff --git a/.gitignore b/.gitignore index 023de01..2175ac7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ _book/ *_cache/ notas.csv + +ignored/ \ No newline at end of file diff --git a/_freeze/rubriuca/execute-results/tex.json b/_freeze/rubriuca/execute-results/tex.json index 8df0a85..5005ca2 100644 --- a/_freeze/rubriuca/execute-results/tex.json +++ b/_freeze/rubriuca/execute-results/tex.json @@ -1,8 +1,8 @@ { - "hash": "4c531019abecc8cc6539dab4946a25d0", + "hash": "fc48ebabec45b3cfdc76aeaaf6efbe0a", "result": { "engine": "knitr", - "markdown": "---\ncache: false\nformat:\n pdf:\n pdf-engine: xelatex\n toc: false\n number-sections: false\nexecute:\n echo: false\n warning: false\n message: false\nheader-includes:\n - \\usepackage{array}\n - \\usepackage{colortbl}\n - \\usepackage{xcolor}\n - \\usepackage{longtable}\n - \\renewcommand{\\arraystretch}{1.4}\n---\n\n\n::: {.cell}\n\n:::\n\n\n\n::: {.cell}\n\n:::\n\n\n# Rúbrica de Evaluación\n\n**Tarea:** Web de Hyperloop II \n**Alumno:** Pau Minguet Micó\n\n\n::: {.cell}\n\n:::\n\n\n\n::: {.cell}\n\n:::\n\n\n\n::: {.cell}\n\n:::\n\n\n\n::: {.cell}\n\n:::\n\n\n\\begin{table}[!h]\n\\centering\\begingroup\\fontsize{7}{9}\\selectfont\n\n\\begin{tabular}{|>{\\centering\\arraybackslash}p{2cm}|>{\\centering\\arraybackslash}p{0.5cm}|>{\\centering\\arraybackslash}p{2.0cm}|>{\\centering\\arraybackslash}p{2.0cm}|>{\\centering\\arraybackslash}p{2.0cm}|>{\\centering\\arraybackslash}p{2.0cm}|>{\\centering\\arraybackslash}p{2.0cm}|>{\\centering\\arraybackslash}p{1.4cm}|}\n\\hline\n\\cellcolor{gray!35}{\\textbf{\\textbf{Criterio}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{N/A}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Deficiente}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Insuficiente}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Aceptable}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Bueno}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Excelente}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Puntuación}}}\\\\\n\\hline\n\\cellcolor{gray!25}{\\textbf{\\textbf{Diseño}}} & & \\footnotesize Diseño desordenado y/o con problemas de visualización funcional. & \\footnotesize Diseño básico pero con problemas de visualización o estructura. & \\footnotesize Diseño claro y ordenado, cumple los requisitos básicos. & \\cellcolor{gray!15}\\textbf{7.5}\\newline \\footnotesize Diseño cuidado, buena estética y estructura clara. & \\footnotesize Diseño profesional, limpio, pulido y sobresaliente. & \\textbf{7.5}\\\\\n\\hline\n\\cellcolor{gray!25}{\\textbf{\\textbf{Programación}}} & \\cellcolor{gray!15}\\textbf{N/A} & & & & & & —\\\\\n\\hline\n\\cellcolor{gray!25}{\\textbf{\\textbf{Esfuerzo e implicación}}} & & \\footnotesize Bajo esfuerzo o dedicación mínima. & \\footnotesize Esfuerzo adecuado pero limitado. & \\footnotesize Esfuerzo notable, cumple con lo requerido. & \\footnotesize Esfuerzo claro, trabajo más allá de lo solicitado. & \\cellcolor{gray!15}\\textbf{9.5}\\newline \\footnotesize Dedicación sobresaliente y trabajo excepcional. & \\textbf{9.5}\\\\\n\\hline\n\\cellcolor{gray!25}{\\textbf{\\textbf{Documentación / Claridad}}} & & \\footnotesize Documentación mínima o inexistente. & \\footnotesize Documentación incompleta o confusa. & \\footnotesize Documentación clara y suficiente. & \\footnotesize Documentación bien presentada y detallada. & \\cellcolor{gray!15}\\textbf{10}\\newline \\footnotesize Documentación excelente y altamente profesional. & \\textbf{10}\\\\\n\\hline\n\\cellcolor{gray!25}{\\textbf{\\textbf{Funcionalidad}}} & & \\footnotesize No funciona o no cumple objetivos. & \\footnotesize Funciona de forma parcial. & \\footnotesize Funciona correctamente. & \\footnotesize Funciona con mejoras o funcionalidades extra. & \\cellcolor{gray!15}\\textbf{9}\\newline \\footnotesize Funciona perfectamente y supera expectativas. & \\textbf{9}\\\\\n\\hline\n\\end{tabular}\n\\endgroup{}\n\\end{table}\n\n\\vspace{0.3cm}\\textbf{Puntuación final: } 9 / 10\\newline \\textbf{Equivalente sobre 60: } 54 / 60\n\n# Comentarios\n\n\n\nHas abusado mucho de la notación para redefinir el estilo predeterminado de las etiquetas. Es mejor utilizar siempre clases e ID. Muy buen uso de los selectores por propiedad y el pseudoselector de el link.\n\nNo has usado ni una clase en toda la tarea.\n\n\n---\n\nDominio completo de propiedades CSS, pero todavía tienes margen de mejora en el uso de selectores básicos.\n\n\n", + "markdown": "---\ncache: false\nformat:\n pdf:\n pdf-engine: xelatex\n toc: false\n number-sections: false\nexecute:\n echo: false\n warning: false\n message: false\nheader-includes:\n - \\usepackage{array}\n - \\usepackage{colortbl}\n - \\usepackage{xcolor}\n - \\usepackage{longtable}\n - \\renewcommand{\\arraystretch}{1.4}\n---\n\n\n::: {.cell}\n\n:::\n\n\n\n::: {.cell}\n\n:::\n\n\n# Rúbrica de Evaluación\n\n**Tarea:** Ejecicios JS \n**Alumno:** Daniel Zanon Barney\n\n\n::: {.cell}\n\n:::\n\n\n\n::: {.cell}\n\n:::\n\n\n\n::: {.cell}\n\n:::\n\n\n\n::: {.cell}\n\n:::\n\n\n\\begin{table}[!h]\n\\centering\\begingroup\\fontsize{7}{9}\\selectfont\n\n\\begin{tabular}{|>{\\centering\\arraybackslash}p{2cm}|>{\\centering\\arraybackslash}p{0.5cm}|>{\\centering\\arraybackslash}p{2.0cm}|>{\\centering\\arraybackslash}p{2.0cm}|>{\\centering\\arraybackslash}p{2.0cm}|>{\\centering\\arraybackslash}p{2.0cm}|>{\\centering\\arraybackslash}p{2.0cm}|>{\\centering\\arraybackslash}p{1.4cm}|}\n\\hline\n\\cellcolor{gray!35}{\\textbf{\\textbf{Criterio}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{N/A}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Deficiente}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Insuficiente}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Aceptable}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Bueno}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Excelente}}} & \\cellcolor{gray!35}{\\textbf{\\textbf{Puntuación}}}\\\\\n\\hline\n\\cellcolor{gray!25}{\\textbf{\\textbf{Diseño}}} & \\cellcolor{gray!15}\\textbf{N/A} & & & & & & —\\\\\n\\hline\n\\cellcolor{gray!25}{\\textbf{\\textbf{Programación}}} & & \\footnotesize Código incompleto o con errores graves. & \\footnotesize Código funcional parcialmente y/o con errores importantes. & \\cellcolor{gray!15}\\textbf{6}\\newline \\footnotesize Código funcional y adecuado a la tarea. & \\footnotesize Código bien estructurado con mejoras respecto a lo exigido. & \\footnotesize Código impecable, eficiente y muy bien organizado. & \\textbf{6}\\\\\n\\hline\n\\cellcolor{gray!25}{\\textbf{\\textbf{Esfuerzo e implicación}}} & & \\footnotesize Bajo esfuerzo o dedicación mínima. & \\footnotesize Esfuerzo adecuado pero limitado. & \\footnotesize Esfuerzo notable, cumple con lo requerido. & \\cellcolor{gray!15}\\textbf{7}\\newline \\footnotesize Esfuerzo claro, trabajo más allá de lo solicitado. & \\footnotesize Dedicación sobresaliente y trabajo excepcional. & \\textbf{7}\\\\\n\\hline\n\\cellcolor{gray!25}{\\textbf{\\textbf{Documentación / Claridad}}} & & \\footnotesize Documentación mínima o inexistente. & \\footnotesize Documentación incompleta o confusa. & \\footnotesize Documentación clara y suficiente. & \\cellcolor{gray!15}\\textbf{7}\\newline \\footnotesize Documentación bien presentada y detallada. & \\footnotesize Documentación excelente y altamente profesional. & \\textbf{7}\\\\\n\\hline\n\\cellcolor{gray!25}{\\textbf{\\textbf{Funcionalidad}}} & & \\footnotesize No funciona o no cumple objetivos. & \\footnotesize Funciona de forma parcial. & \\footnotesize Funciona correctamente. & \\cellcolor{gray!15}\\textbf{8.5}\\newline \\footnotesize Funciona con mejoras o funcionalidades extra. & \\footnotesize Funciona perfectamente y supera expectativas. & \\textbf{8.5}\\\\\n\\hline\n\\end{tabular}\n\\endgroup{}\n\\end{table}\n\n\\vspace{0.3cm}\\textbf{Puntuación final: } 7.12 / 10\\newline \\textbf{Equivalente sobre 60: } 42.8 / 60\n\n# Comentarios\n\n\n\nEn el ejercicio 3 se debeía de imprimir también el array por pantalla, en el código subido a GitHub, lo has encapsulado dentro de la función `arr2`. No se deben encapuslar los array en funciones.\n\nEl ejercicio 7 está mal: el metodo `.push()` de los arrays devuelve la nueva longitud del array. En tu código en la línea 21: `const arrFinal =arrCubosFiltrados.push(21);` está añadiendo el número `21` al array `arrCubosFiltrados` mientras que `arrFinal` se corresponde con la longitud de `arrCubosFiltrados` (incluyendo el 21). La respuesta correcta era `let arrFinal = [...arrCubosFiltrados, 21];`\n\nEn lo que respecta al formato del documento, es convención en JS insertar un espacio entre los operadores: NO `x%2==0` sino `x % 2 === 0`. \n\n---\n\nEn general bien, todavía hay margen de mejora en lo que respecta al uso de los array, muy buen uso de las funciones `filter` y `map`.\n\n", "supporting": [], "filters": [ "rmarkdown/pagebreak.lua" diff --git a/_quarto.yml b/_quarto.yml index e26bc9c..fa4635b 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -70,6 +70,12 @@ website: contents: - pages/Bloque3/ReactI.qmd - pages/Bloque3/ps.qmd + + - section: "Semana 9" + contents: + - pages/Bloque3/Intermedio.qmd + - pages/Bloque3/MARef.qmd + - text: "Próximamente..." diff --git a/docs/about.html b/docs/about.html index e7697c7..65031cc 100644 --- a/docs/about.html +++ b/docs/about.html @@ -2,7 +2,7 @@ - + @@ -37,9 +37,9 @@ - - - + + + diff --git a/docs/about.pdf b/docs/about.pdf index 263416a..fe9334c 100644 Binary files a/docs/about.pdf and b/docs/about.pdf differ diff --git a/docs/index.html b/docs/index.html index dc62c2d..ad6869c 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,7 +2,7 @@ - + @@ -37,9 +37,9 @@ - - - + + + @@ -480,6 +480,29 @@ Proyecto Subsistema + + + + diff --git a/docs/index.pdf b/docs/index.pdf index 2f42f0e..038dc75 100644 Binary files a/docs/index.pdf and b/docs/index.pdf differ diff --git a/docs/pages/Bloque1/MAcss.html b/docs/pages/Bloque1/MAcss.html index 5eb9274..e806338 100644 --- a/docs/pages/Bloque1/MAcss.html +++ b/docs/pages/Bloque1/MAcss.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -481,6 +481,29 @@ Proyecto Subsistema + + + + @@ -539,7 +562,7 @@

MA: Selectores y Pseudoselectores

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque1/MAcss.pdf b/docs/pages/Bloque1/MAcss.pdf index 369fbd0..db7d416 100644 Binary files a/docs/pages/Bloque1/MAcss.pdf and b/docs/pages/Bloque1/MAcss.pdf differ diff --git a/docs/pages/Bloque1/MAhtml2.html b/docs/pages/Bloque1/MAhtml2.html index e195efa..6fe7809 100644 --- a/docs/pages/Bloque1/MAhtml2.html +++ b/docs/pages/Bloque1/MAhtml2.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -481,6 +481,29 @@ Proyecto Subsistema + + + + @@ -539,7 +562,7 @@

MA: Mas HTML

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque1/MAhtml2.pdf b/docs/pages/Bloque1/MAhtml2.pdf index d6ac7a2..1200a72 100644 Binary files a/docs/pages/Bloque1/MAhtml2.pdf and b/docs/pages/Bloque1/MAhtml2.pdf differ diff --git a/docs/pages/Bloque1/bloque1.html b/docs/pages/Bloque1/bloque1.html index e76dffd..74040b5 100644 --- a/docs/pages/Bloque1/bloque1.html +++ b/docs/pages/Bloque1/bloque1.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -481,6 +481,29 @@ Proyecto Subsistema + + + + @@ -546,7 +569,7 @@

Bloque I Introducción

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque1/bloque1.pdf b/docs/pages/Bloque1/bloque1.pdf index 8dcd0ee..6f8c0bd 100644 Binary files a/docs/pages/Bloque1/bloque1.pdf and b/docs/pages/Bloque1/bloque1.pdf differ diff --git a/docs/pages/Bloque1/css.html b/docs/pages/Bloque1/css.html index 132d66a..c5ae889 100644 --- a/docs/pages/Bloque1/css.html +++ b/docs/pages/Bloque1/css.html @@ -2,7 +2,7 @@ - + @@ -73,9 +73,9 @@ - - - + + + @@ -516,6 +516,29 @@ Proyecto Subsistema + + + + @@ -602,7 +625,7 @@

CSS

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque1/css.pdf b/docs/pages/Bloque1/css.pdf index 0a84743..c50b9d9 100644 Binary files a/docs/pages/Bloque1/css.pdf and b/docs/pages/Bloque1/css.pdf differ diff --git a/docs/pages/Bloque1/css_p.html b/docs/pages/Bloque1/css_p.html index 871218c..09d6513 100644 --- a/docs/pages/Bloque1/css_p.html +++ b/docs/pages/Bloque1/css_p.html @@ -6,8 +6,8 @@ - - + + diff --git a/docs/pages/Bloque1/ehtml.html b/docs/pages/Bloque1/ehtml.html index 798fca3..dcfa1c6 100644 --- a/docs/pages/Bloque1/ehtml.html +++ b/docs/pages/Bloque1/ehtml.html @@ -6,8 +6,8 @@ - - + + diff --git a/docs/pages/Bloque1/entorno-reveal.html b/docs/pages/Bloque1/entorno-reveal.html index d6c306d..66e98ec 100644 --- a/docs/pages/Bloque1/entorno-reveal.html +++ b/docs/pages/Bloque1/entorno-reveal.html @@ -6,8 +6,8 @@ - - + + diff --git a/docs/pages/Bloque1/entorno.html b/docs/pages/Bloque1/entorno.html index f14ce9d..78cdec5 100644 --- a/docs/pages/Bloque1/entorno.html +++ b/docs/pages/Bloque1/entorno.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -481,6 +481,29 @@ Proyecto Subsistema + + + + @@ -576,7 +599,7 @@

Preparación del entorno de trabajo

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque1/entorno.pdf b/docs/pages/Bloque1/entorno.pdf index 6fa0454..9a62ade 100644 Binary files a/docs/pages/Bloque1/entorno.pdf and b/docs/pages/Bloque1/entorno.pdf differ diff --git a/docs/pages/Bloque1/html.html b/docs/pages/Bloque1/html.html index 0266804..b4caa4c 100644 --- a/docs/pages/Bloque1/html.html +++ b/docs/pages/Bloque1/html.html @@ -2,7 +2,7 @@ - + @@ -73,9 +73,9 @@ - - - + + + @@ -516,6 +516,29 @@ Proyecto Subsistema + + + + @@ -608,7 +631,7 @@

HTML

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque1/html.pdf b/docs/pages/Bloque1/html.pdf index bac8362..10ece12 100644 Binary files a/docs/pages/Bloque1/html.pdf and b/docs/pages/Bloque1/html.pdf differ diff --git a/docs/pages/Bloque1/t1.html b/docs/pages/Bloque1/t1.html index 3f8cd96..5389a96 100644 --- a/docs/pages/Bloque1/t1.html +++ b/docs/pages/Bloque1/t1.html @@ -2,7 +2,7 @@ - + @@ -73,9 +73,9 @@ - - - + + + @@ -516,6 +516,29 @@ Proyecto Subsistema + + + + @@ -574,7 +597,7 @@

T1: Web de HL I

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque1/t1.pdf b/docs/pages/Bloque1/t1.pdf index 585cdea..67a7e71 100644 Binary files a/docs/pages/Bloque1/t1.pdf and b/docs/pages/Bloque1/t1.pdf differ diff --git a/docs/pages/Bloque1/t1a.html b/docs/pages/Bloque1/t1a.html index ed0bc20..e667795 100644 --- a/docs/pages/Bloque1/t1a.html +++ b/docs/pages/Bloque1/t1a.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -481,6 +481,29 @@ Proyecto Subsistema + + + + @@ -539,7 +562,7 @@

TA1: Mi CV I

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque1/t1a.pdf b/docs/pages/Bloque1/t1a.pdf index f007ad4..8a109c1 100644 Binary files a/docs/pages/Bloque1/t1a.pdf and b/docs/pages/Bloque1/t1a.pdf differ diff --git a/docs/pages/Bloque1/t2.html b/docs/pages/Bloque1/t2.html index 37851c5..558fae6 100644 --- a/docs/pages/Bloque1/t2.html +++ b/docs/pages/Bloque1/t2.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -481,6 +481,29 @@ Proyecto Subsistema + + + + @@ -539,7 +562,7 @@

T2: Web de HL II

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque1/t2.pdf b/docs/pages/Bloque1/t2.pdf index 3f29080..f8f2f58 100644 Binary files a/docs/pages/Bloque1/t2.pdf and b/docs/pages/Bloque1/t2.pdf differ diff --git a/docs/pages/Bloque1/t2a.html b/docs/pages/Bloque1/t2a.html index 93cfb6d..7e058ee 100644 --- a/docs/pages/Bloque1/t2a.html +++ b/docs/pages/Bloque1/t2a.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -481,6 +481,29 @@ Proyecto Subsistema + + + + @@ -539,7 +562,7 @@

TA2: Mi CV II

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque1/t2a.pdf b/docs/pages/Bloque1/t2a.pdf index f8a9f66..0fee716 100644 Binary files a/docs/pages/Bloque1/t2a.pdf and b/docs/pages/Bloque1/t2a.pdf differ diff --git a/docs/pages/Bloque2/MAclases.html b/docs/pages/Bloque2/MAclases.html index 5bede03..61c3628 100644 --- a/docs/pages/Bloque2/MAclases.html +++ b/docs/pages/Bloque2/MAclases.html @@ -2,7 +2,7 @@ - + @@ -73,9 +73,9 @@ - - - + + + @@ -516,6 +516,29 @@ Proyecto Subsistema + + + + @@ -596,7 +619,7 @@

MA: Clases ES6

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque2/MAclases.pdf b/docs/pages/Bloque2/MAclases.pdf index 228e29c..1c2e894 100644 Binary files a/docs/pages/Bloque2/MAclases.pdf and b/docs/pages/Bloque2/MAclases.pdf differ diff --git a/docs/pages/Bloque2/intensivo.html b/docs/pages/Bloque2/intensivo.html index 9a7446d..4859f52 100644 --- a/docs/pages/Bloque2/intensivo.html +++ b/docs/pages/Bloque2/intensivo.html @@ -2,7 +2,7 @@ - + @@ -73,9 +73,9 @@ - - - + + + @@ -516,6 +516,29 @@ Proyecto Subsistema + + + + @@ -647,7 +670,7 @@

Repaso Intensivo JS

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque2/intensivo.pdf b/docs/pages/Bloque2/intensivo.pdf index a7dd13e..dfa7901 100644 Binary files a/docs/pages/Bloque2/intensivo.pdf and b/docs/pages/Bloque2/intensivo.pdf differ diff --git a/docs/pages/Bloque2/jsI-reveal.html b/docs/pages/Bloque2/jsI-reveal.html index 22b358c..730bd3a 100644 --- a/docs/pages/Bloque2/jsI-reveal.html +++ b/docs/pages/Bloque2/jsI-reveal.html @@ -6,8 +6,8 @@ - - + + diff --git a/docs/pages/Bloque2/jsI.html b/docs/pages/Bloque2/jsI.html index 4663e58..3c362a9 100644 --- a/docs/pages/Bloque2/jsI.html +++ b/docs/pages/Bloque2/jsI.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -306,7 +306,7 @@

Introducción a JS

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque2/jsI.pdf b/docs/pages/Bloque2/jsI.pdf index 5ec673c..a86934c 100644 Binary files a/docs/pages/Bloque2/jsI.pdf and b/docs/pages/Bloque2/jsI.pdf differ diff --git a/docs/pages/Bloque2/ti.html b/docs/pages/Bloque2/ti.html index 3af7f6b..ab80537 100644 --- a/docs/pages/Bloque2/ti.html +++ b/docs/pages/Bloque2/ti.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -481,6 +481,29 @@ Proyecto Subsistema + + + + @@ -555,7 +578,7 @@

TI: Ejercicios JS

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque2/ti.pdf b/docs/pages/Bloque2/ti.pdf index e6f447b..505ca1a 100644 Binary files a/docs/pages/Bloque2/ti.pdf and b/docs/pages/Bloque2/ti.pdf differ diff --git a/docs/pages/Bloque2/tia.html b/docs/pages/Bloque2/tia.html index 296d40d..3b6088e 100644 --- a/docs/pages/Bloque2/tia.html +++ b/docs/pages/Bloque2/tia.html @@ -2,7 +2,7 @@ - + @@ -73,9 +73,9 @@ - - - + + + @@ -516,6 +516,29 @@ Proyecto Subsistema + + + + @@ -598,7 +621,7 @@

TAI: La objetización de las personas

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque2/tia.pdf b/docs/pages/Bloque2/tia.pdf index 5aa7431..5386b5f 100644 Binary files a/docs/pages/Bloque2/tia.pdf and b/docs/pages/Bloque2/tia.pdf differ diff --git a/docs/pages/Bloque3/DOM.html b/docs/pages/Bloque3/DOM.html index c0ca363..1d8da61 100644 --- a/docs/pages/Bloque3/DOM.html +++ b/docs/pages/Bloque3/DOM.html @@ -2,7 +2,7 @@ - + @@ -73,9 +73,9 @@ - - - + + + @@ -516,6 +516,29 @@ Proyecto Subsistema + + + + @@ -597,7 +620,7 @@

DOM

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque3/DOM.pdf b/docs/pages/Bloque3/DOM.pdf index bbd69c9..ed37bbc 100644 Binary files a/docs/pages/Bloque3/DOM.pdf and b/docs/pages/Bloque3/DOM.pdf differ diff --git a/docs/pages/Bloque3/Intermedio.html b/docs/pages/Bloque3/Intermedio.html new file mode 100644 index 0000000..05063ba --- /dev/null +++ b/docs/pages/Bloque3/Intermedio.html @@ -0,0 +1,1465 @@ + + + + + + + + + + +React III – Training Center SW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + +
+ + + +
+ + +
+
+

React III

+

Controlled fields, useEffect

+
+ + + +
+ +
+
Autor/a
+
+

Javier Ribal del Río

+
+
+ +
+
Fecha de publicación
+
+

27 de febrero de 2026

+
+
+ +
+
Fecha de última modificación
+
+

4 de marzo de 2026

+
+
+ +
+ + + +
+ + +

Contenido

+ +
+

Controlled Inputs

+
+

Motivación

+

Hasta ahora se ha trabajado con eventos capturando acciones del usuario.

+

Sin embargo, al trabajar con formularios surge una cuestión fundamental:

+
+

¿Quién controla el valor del input?
+¿El DOM o React?

+
+

Recordemos que en HTML puro o, el valor de un <input> está gestionado directamente por el DOM.

+

En React, podemos hacer que el valor del input esté controlado por el estado del componente.

+

A esto lo llamamos controlled input.

+
+
+

¿Qué es un controlled input?

+

Un controlled input es un elemento de formulario cuyo valor:

+
    +
  • Está almacenado en el estado del componente
  • +
  • Se actualiza mediante un evento (onChange)
  • +
  • Se renderiza utilizando ese mismo estado
  • +
+

Única fuente de verdad (single source of truth).

+
+
+

Estructura del componente controlled

+
import { useState } from "react";
+function FormularioNombre() {
+
+  const [nombre, setNombre] = useState("");
+
+  function manejarCambio(event) {
+    setNombre(event.target.value);
+  }
+
+  return (
+    <div>
+      <input type="text" 
+       value={nombre}
+        onChange={manejarCambio}
+      />
+      <p>El nombre introducido es: {nombre}</p>
+    </div>
+  );
+}
+
+

Análisis del ejemplo

+

El valor del input se sincroniza con el estado

+
    +
  1. Declaramos una variable de estado: nombre
  2. +
  3. Asociamos el atributo value del input a ese estado
  4. +
  5. Capturamos el evento onChange
  6. +
  7. Actualizamos el estado con setNombre
  8. +
+

Cada vez que el estado cambia: El componente se vuelve a ejecutar El JSX se vuelve a generar El valor del input se sincroniza con el estado

+
+
+
+

Ejemplo Formulario

+
import { useState } from "react";
+
+function FormularioSimple() {
+
+  const [email, setEmail] = useState("");
+
+  function handleChange(event) {
+    setEmail(event.target.value);
+  }
+
+  function handleSubmit(event) {
+    event.preventDefault();   // Evita la recarga del navegador
+
+    console.log("Formulario enviado");
+    console.log("Email:", email);
+
+    setEmail("");  // Limpieza opcional del campo
+  }
+
+  return (
+    <form onSubmit={handleSubmit}>
+      <input 
+        type="email"
+        value={email}
+        onChange={handleChange}
+      />
+      <button type="submit">Enviar</button>
+    </form>
+  );
+}
+

Referencia: https://es.react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable

+
+
+
+

Hooks (Repaso)

+
    +
  • Función especial que permite modificar las propiedades internas de los componentes
  • +
  • Características avanzadas
  • +
  • Modificación del life-cycle
  • +
  • Normalmente forma use____
  • +
+
+
+

useEffect

+
    +
  • useEffect es un Hook que permite ejecutar efectos secundarios dentro de un componente funcional.
  • +
  • Un efecto secundario es cualquier operación que no sea simplemente devolver JSX (por ejemplo: peticiones a un servidor, temporizadores, suscripciones).
  • +
  • Se ejecuta después de que el componente se renderiza en el DOM.
  • +
+
+

Métodos de uso de useEffect

+
+

1. Sin array de dependencias

+
useEffect(() => {
+  console.log("Se ejecuta en cada render");
+});
+

Comportamiento:

+
    +
  • Se ejecuta después de cada renderizado.
  • +
  • No existe control sobre la frecuencia.
  • +
  • Puede generar bucles si modifica estado sin control.
  • +
+

Interpretación conceptual:

+

El efecto acompaña siempre al render.

+
+
+

2. Con array vacío

+
useEffect(() => {
+  console.log("Se ejecuta solo una vez");
+}, []);
+

Comportamiento:

+
    +
  • Se ejecuta únicamente tras el primer render.
  • +
  • Equivalente conceptual al “montaje” del componente.
  • +
+

Uso habitual:

+
    +
  • Peticiones a servidor
  • +
  • Inicializaciones
  • +
  • Suscripciones
  • +
+

Interpretación conceptual:

+

El efecto ocurre una única vez al crear el componente.

+
+
+

3. Con dependencias específicas

+
useEffect(() => {
+  console.log("Se ejecuta cuando cambia contador");
+}, [contador]);
+

Comportamiento:

+
    +
  • Se ejecuta tras el primer render.
  • +
  • Se vuelve a ejecutar cuando cambia alguna variable del array.
  • +
+

Interpretación conceptual:

+

El efecto depende del estado indicado.

+

React compara el valor anterior con el nuevo y decide si debe ejecutar el efecto.

+
+
+
+
+

fetch()

+

Hasta ahora nuestros componentes eran completamente locales.

+

Sin embargo, en aplicaciones reales necesitamos:

+
    +
  • Descargar datos
    +
  • +
  • Conectarnos a servidores
    +
  • +
  • Trabajar con APIs externas
  • +
+

Para ello utilizamos fetch().

+
+

Ejemplo mínimo de fetch

+
fetch("https://pokeapi.co/api/v2/pokemon/1")
+  .then(response => response.json())
+  .then(data => console.log(data));
+

Utiliza las Promises

+

Interpretación simple:

+
    +
  1. Se hace una petición a una URL
    +
  2. +
  3. Se transforma la respuesta a formato JSON
    +
  4. +
  5. Se accede a los datos
  6. +
+
+
+

fetch() dentro de useEffect

+

En React, lo habitual es realizar la descarga cuando el componente se monta.

+

Para ello:

+
    +
  • Utilizamos useEffect
  • +
  • Añadimos array vacío []
  • +
  • Guardamos los datos en el estado
  • +
+
+
+

Ejemplo integrado

+
import { useState, useEffect } from "react";
+
+function Pokemon() {
+
+  const [pokemon, setPokemon] = useState(null);
+
+  useEffect(() => {
+
+    fetch("https://pokeapi.co/api/v2/pokemon/1")
+      .then(response => response.json())
+      .then(data => setPokemon(data));
+
+  }, []);
+
+  if (!pokemon) return <p>Cargando...</p>;
+
+  return (
+    <div>
+      <h2>{pokemon.name}</h2>
+      <img 
+        src={pokemon.sprites.front_default} 
+        alt={pokemon.name} 
+      />
+    </div>
+  );
+}
+
+
+

Flujo conceptual

+
    +
  1. Render inicial
    +
  2. +
  3. Se ejecuta useEffect
    +
  4. +
  5. Se lanza la petición
    +
  6. +
  7. Se actualiza el estado
    +
  8. +
  9. Nuevo render con los datos
  10. +
+
+
+

Advertencia importante

+

Si eliminamos el array vacío:

+
useEffect(() => {
+  fetch("https://pokeapi.co/api/v2/pokemon/1")
+    .then(res => res.json())
+    .then(data => setPokemon(data));
+});
+

El efecto se ejecutará en cada render.

+

Como actualizar estado provoca render, se generará un bucle infinito.

+

useEffect conecta React con el exterior.
+fetch() permite traer datos del exterior.
+El estado vuelve a controlar el render.

+

En la siguiente sección formalizaremos esto utilizando async / await.

+
+
+
+

async y await

+

Hasta ahora hemos utilizado fetch() con encadenamiento.

+

Existe una forma más clara y estructurada de escribir código asíncrono:

+
    +
  • async
  • +
  • await
  • +
+

Su objetivo es hacer que el código sea más legible.

+
+

¿Qué significa async?

+
    +
  • Se coloca delante de una función
  • +
  • Indica que la función trabajará con operaciones asíncronas
  • +
+
async function ejemplo() {
+  console.log("Función asíncrona");
+}
+
+
+

¿Qué significa await?

+
    +
  • Solo puede utilizarse dentro de una función async
  • +
  • Detiene la ejecución hasta que la operación finaliza
  • +
  • Hace que el código se lea de forma secuencial
  • +
+
+
+

Ejemplo básico con fetch

+
async function obtenerPokemon() {
+
+  const response = await fetch(
+    "https://pokeapi.co/api/v2/pokemon/1"
+  );
+
+  const data = await response.json();
+
+  console.log(data);
+}
+

Interpretación conceptual:

+
    +
  1. Se realiza la petición
  2. +
  3. Se espera la respuesta
  4. +
  5. Se transforma a JSON
  6. +
  7. Se trabaja con los datos
  8. +
+

El código se lee de arriba hacia abajo.

+
+
+

async / await dentro de useEffect

+

En React, lo habitual es declarar una función interna y ejecutarla.

+
+
+

Ejemplo completo

+
import { useState, useEffect } from "react";
+
+function Pokemon() {
+
+  const [pokemon, setPokemon] = useState(null);
+
+  useEffect(() => {
+
+    async function fetchData() {
+
+      const response = await fetch(
+        "https://pokeapi.co/api/v2/pokemon/1"
+      );
+
+      const data = await response.json();
+
+      setPokemon(data);
+    }
+
+    fetchData();
+
+  }, []);
+
+  if (!pokemon) return <p>Cargando...</p>;
+
+  return (
+    <div>
+      <h2>{pokemon.name}</h2>
+      <img 
+        src={pokemon.sprites.front_default} 
+        alt={pokemon.name} 
+      />
+    </div>
+  );
+}
+
+
+

¿Por qué no hacer directamente?

+
useEffect(async () => {
+  ...
+}, []);
+

Porque useEffect no debe recibir una función asíncrona directamente.

+

Por eso declaramos la función dentro y luego la ejecutamos.

+
+
+

Flujo mental con async / await

+
    +
  1. Render inicial
    +
  2. +
  3. Se ejecuta useEffect
    +
  4. +
  5. Se llama a la función asíncrona
    +
  6. +
  7. await espera la respuesta
    +
  8. +
  9. Se actualiza el estado
    +
  10. +
  11. Nuevo render
  12. +
+

async / await no cambia lo que hace el programa.

+

Solo cambia la forma de escribirlo:

+

Más claro.
+Más estructurado.
+Más fácil de mantener.

+
+
+
+

Ejemplo con la Pokeapi

+

Poke-API

+

Download Code

+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/docs/pages/Bloque3/Intermedio.pdf b/docs/pages/Bloque3/Intermedio.pdf new file mode 100644 index 0000000..0e6a7f1 Binary files /dev/null and b/docs/pages/Bloque3/Intermedio.pdf differ diff --git a/docs/pages/Bloque3/MARef.html b/docs/pages/Bloque3/MARef.html new file mode 100644 index 0000000..aa506de --- /dev/null +++ b/docs/pages/Bloque3/MARef.html @@ -0,0 +1,1005 @@ + + + + + + + + + + +MA: Uncontrolled fields y useRef – Training Center SW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + +
+ + + +
+ + +
+
+

MA: Uncontrolled fields y useRef

+
+ + + +
+ +
+
Autor/a
+
+

Javier Ribal del Río

+
+
+ +
+
Fecha de publicación
+
+

2 de marzo de 2025

+
+
+ +
+
Fecha de última modificación
+
+

4 de marzo de 2026

+
+
+ +
+ + + +
+ + +

Por el momento hemos visto dos hooks useState y useEffect, pero recordemos que en React existen más tipos de hooks que por ser menos útiles y debido a la falta de tiempo no son explicados, no obstante si hay alguno digno de mención es useRef o las referencias.

+

Una ref es una referencia mutable que permite acceder directamente a un elemento del DOM o almacenar un valor persistente sin provocar un re-render del componente. El siguiente video ilustra su uso. Es un poco largo pero sirve para repasar los otros hooks.

+
+
+

Con las ref podemos introducir los uncontrolled fields que nos permiten trabajar de otra forma con los formularios.

+
+

Se prefiere la segunda implementación (la que no utiliza referencias) sobre la primera.

+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/docs/pages/Bloque3/MARef.pdf b/docs/pages/Bloque3/MARef.pdf new file mode 100644 index 0000000..7c98c9d Binary files /dev/null and b/docs/pages/Bloque3/MARef.pdf differ diff --git a/docs/pages/Bloque3/MAcss2.html b/docs/pages/Bloque3/MAcss2.html index 0ceb238..0d19686 100644 --- a/docs/pages/Bloque3/MAcss2.html +++ b/docs/pages/Bloque3/MAcss2.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -481,6 +481,29 @@ Proyecto Subsistema + + + + @@ -539,7 +562,7 @@

MA: CSS Flex y CSS

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque3/MAcss2.pdf b/docs/pages/Bloque3/MAcss2.pdf index 0690d19..785ce72 100644 Binary files a/docs/pages/Bloque3/MAcss2.pdf and b/docs/pages/Bloque3/MAcss2.pdf differ diff --git a/docs/pages/Bloque3/PokeAPI-Example.zip b/docs/pages/Bloque3/PokeAPI-Example.zip new file mode 100644 index 0000000..430af25 Binary files /dev/null and b/docs/pages/Bloque3/PokeAPI-Example.zip differ diff --git a/docs/pages/Bloque3/ReactI.html b/docs/pages/Bloque3/ReactI.html index 2f43f2e..3ed455c 100644 --- a/docs/pages/Bloque3/ReactI.html +++ b/docs/pages/Bloque3/ReactI.html @@ -2,7 +2,7 @@ - + @@ -73,9 +73,9 @@ - - - + + + @@ -516,6 +516,29 @@ Proyecto Subsistema + + + + @@ -621,7 +644,7 @@

React I

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque3/ReactI.pdf b/docs/pages/Bloque3/ReactI.pdf index 67937ce..2058a9c 100644 Binary files a/docs/pages/Bloque3/ReactI.pdf and b/docs/pages/Bloque3/ReactI.pdf differ diff --git a/docs/pages/Bloque3/dom.html b/docs/pages/Bloque3/dom.html index 3e7189b..782f064 100644 --- a/docs/pages/Bloque3/dom.html +++ b/docs/pages/Bloque3/dom.html @@ -6,8 +6,8 @@ - - + + diff --git a/docs/pages/Bloque3/intermedio.html b/docs/pages/Bloque3/intermedio.html new file mode 100644 index 0000000..803cbf9 --- /dev/null +++ b/docs/pages/Bloque3/intermedio.html @@ -0,0 +1,1039 @@ + + + + + + + + + + + + + + Training Center SW – React III + + + + + + + + + + + + + + + + +
+
+ +
+

React III

+

Controlled fields, useEffect

+ +
+
+
+Javier Ribal del Río +
+
+
+ +

2026-02-27

+
+
+ +

Contenido

+
    +
  • Controlled Inputs
  • +
  • Concepto de Hook
  • +
  • Hook useEffect
  • +
  • Introducción a API para la descarga de datos
  • +
+
+
+

Controlled Inputs

+

Motivación

+

Hasta ahora se ha trabajado con eventos capturando acciones del usuario.

+

Sin embargo, al trabajar con formularios surge una cuestión fundamental:

+
+

¿Quién controla el valor del input?
+¿El DOM o React?

+
+
+
+ +

Recordemos que en HTML puro o, el valor de un <input> está gestionado directamente por el DOM.

+

En React, podemos hacer que el valor del input esté controlado por el estado del componente.

+

A esto lo llamamos controlled input.

+
+
+ +

¿Qué es un controlled input?

+

Un controlled input es un elemento de formulario cuyo valor:

+
    +
  • Está almacenado en el estado del componente
  • +
  • Se actualiza mediante un evento (onChange)
  • +
  • Se renderiza utilizando ese mismo estado
  • +
+

Única fuente de verdad (single source of truth).

+
+
+ +

Estructura del componente controlled

+
import { useState } from "react";
+function FormularioNombre() {
+
+  const [nombre, setNombre] = useState("");
+
+  function manejarCambio(event) {
+    setNombre(event.target.value);
+  }
+
+  return (
+    <div>
+      <input type="text" 
+       value={nombre}
+        onChange={manejarCambio}
+      />
+      <p>El nombre introducido es: {nombre}</p>
+    </div>
+  );
+}
+
+
+ +

Análisis del ejemplo

+

El valor del input se sincroniza con el estado

+
    +
  1. Declaramos una variable de estado: nombre
  2. +
  3. Asociamos el atributo value del input a ese estado
  4. +
  5. Capturamos el evento onChange
  6. +
  7. Actualizamos el estado con setNombre
  8. +
+
+
+ +

Cada vez que el estado cambia: El componente se vuelve a ejecutar El JSX se vuelve a generar El valor del input se sincroniza con el estado

+
+
+ +

Ejemplo Formulario

+
import { useState } from "react";
+
+function FormularioSimple() {
+
+  const [email, setEmail] = useState("");
+
+  function handleChange(event) {
+    setEmail(event.target.value);
+  }
+
+  function handleSubmit(event) {
+    event.preventDefault();   // Evita la recarga del navegador
+
+    console.log("Formulario enviado");
+    console.log("Email:", email);
+
+    setEmail("");  // Limpieza opcional del campo
+  }
+
+  return (
+    <form onSubmit={handleSubmit}>
+      <input 
+        type="email"
+        value={email}
+        onChange={handleChange}
+      />
+      <button type="submit">Enviar</button>
+    </form>
+  );
+}
+
+
+ +

Referencia: https://es.react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable

+
+
+

Hooks (Repaso)

+
    +
  • Función especial que permite modificar las propiedades internas de los componentes
  • +
  • Características avanzadas
  • +
  • Modificación del life-cycle
  • +
  • Normalmente forma use____
  • +
+
+
+

useEffect

+
    +
  • useEffect es un Hook que permite ejecutar efectos secundarios dentro de un componente funcional.
  • +
  • Un efecto secundario es cualquier operación que no sea simplemente devolver JSX (por ejemplo: peticiones a un servidor, temporizadores, suscripciones).
  • +
  • Se ejecuta después de que el componente se renderiza en el DOM.
  • +
+
+
+ +

Métodos de uso de useEffect

+

1. Sin array de dependencias

+
useEffect(() => {
+  console.log("Se ejecuta en cada render");
+});
+

Comportamiento:

+
    +
  • Se ejecuta después de cada renderizado.
  • +
  • No existe control sobre la frecuencia.
  • +
  • Puede generar bucles si modifica estado sin control.
  • +
+

Interpretación conceptual:

+

El efecto acompaña siempre al render.

+
+
+ +

2. Con array vacío

+
useEffect(() => {
+  console.log("Se ejecuta solo una vez");
+}, []);
+

Comportamiento:

+
    +
  • Se ejecuta únicamente tras el primer render.
  • +
  • Equivalente conceptual al “montaje” del componente.
  • +
+
+
+ +

Uso habitual:

+
    +
  • Peticiones a servidor
  • +
  • Inicializaciones
  • +
  • Suscripciones
  • +
+

Interpretación conceptual:

+

El efecto ocurre una única vez al crear el componente.

+
+
+ +

3. Con dependencias específicas

+
useEffect(() => {
+  console.log("Se ejecuta cuando cambia contador");
+}, [contador]);
+

Comportamiento:

+
    +
  • Se ejecuta tras el primer render.
  • +
  • Se vuelve a ejecutar cuando cambia alguna variable del array.
  • +
+
+
+ +

Interpretación conceptual:

+

El efecto depende del estado indicado.

+

React compara el valor anterior con el nuevo y decide si debe ejecutar el efecto.

+
+
+

fetch()

+

Hasta ahora nuestros componentes eran completamente locales.

+

Sin embargo, en aplicaciones reales necesitamos:

+
    +
  • Descargar datos
    +
  • +
  • Conectarnos a servidores
    +
  • +
  • Trabajar con APIs externas
  • +
+

Para ello utilizamos fetch().

+
+
+ +

Ejemplo mínimo de fetch

+
fetch("https://pokeapi.co/api/v2/pokemon/1")
+  .then(response => response.json())
+  .then(data => console.log(data));
+

Utiliza las Promises

+
+
+ +

Interpretación simple:

+
    +
  1. Se hace una petición a una URL
    +
  2. +
  3. Se transforma la respuesta a formato JSON
    +
  4. +
  5. Se accede a los datos
  6. +
+
+
+ +

fetch() dentro de useEffect

+

En React, lo habitual es realizar la descarga cuando el componente se monta.

+

Para ello:

+
    +
  • Utilizamos useEffect
  • +
  • Añadimos array vacío []
  • +
  • Guardamos los datos en el estado
  • +
+
+
+ +

Ejemplo integrado

+
import { useState, useEffect } from "react";
+
+function Pokemon() {
+
+  const [pokemon, setPokemon] = useState(null);
+
+  useEffect(() => {
+
+    fetch("https://pokeapi.co/api/v2/pokemon/1")
+      .then(response => response.json())
+      .then(data => setPokemon(data));
+
+  }, []);
+
+  if (!pokemon) return <p>Cargando...</p>;
+
+  return (
+    <div>
+      <h2>{pokemon.name}</h2>
+      <img 
+        src={pokemon.sprites.front_default} 
+        alt={pokemon.name} 
+      />
+    </div>
+  );
+}
+
+
+ +

Flujo conceptual

+
    +
  1. Render inicial
    +
  2. +
  3. Se ejecuta useEffect
    +
  4. +
  5. Se lanza la petición
    +
  6. +
  7. Se actualiza el estado
    +
  8. +
  9. Nuevo render con los datos
  10. +
+
+
+ +

Advertencia importante

+

Si eliminamos el array vacío:

+
useEffect(() => {
+  fetch("https://pokeapi.co/api/v2/pokemon/1")
+    .then(res => res.json())
+    .then(data => setPokemon(data));
+});
+

El efecto se ejecutará en cada render.

+

Como actualizar estado provoca render, se generará un bucle infinito.

+
+
+ +

useEffect conecta React con el exterior.
+fetch() permite traer datos del exterior.
+El estado vuelve a controlar el render.

+

En la siguiente sección formalizaremos esto utilizando async / await.

+
+
+

async y await

+

Hasta ahora hemos utilizado fetch() con encadenamiento.

+

Existe una forma más clara y estructurada de escribir código asíncrono:

+
    +
  • async
  • +
  • await
  • +
+

Su objetivo es hacer que el código sea más legible.

+
+
+ +

¿Qué significa async?

+
    +
  • Se coloca delante de una función
  • +
  • Indica que la función trabajará con operaciones asíncronas
  • +
+
async function ejemplo() {
+  console.log("Función asíncrona");
+}
+
+
+ +

¿Qué significa await?

+
    +
  • Solo puede utilizarse dentro de una función async
  • +
  • Detiene la ejecución hasta que la operación finaliza
  • +
  • Hace que el código se lea de forma secuencial
  • +
+
+
+ +

Ejemplo básico con fetch

+
async function obtenerPokemon() {
+
+  const response = await fetch(
+    "https://pokeapi.co/api/v2/pokemon/1"
+  );
+
+  const data = await response.json();
+
+  console.log(data);
+}
+
+
+ +

Interpretación conceptual:

+
    +
  1. Se realiza la petición
  2. +
  3. Se espera la respuesta
  4. +
  5. Se transforma a JSON
  6. +
  7. Se trabaja con los datos
  8. +
+

El código se lee de arriba hacia abajo.

+
+
+ +

async / await dentro de useEffect

+

En React, lo habitual es declarar una función interna y ejecutarla.

+
+
+ +

Ejemplo completo

+
import { useState, useEffect } from "react";
+
+function Pokemon() {
+
+  const [pokemon, setPokemon] = useState(null);
+
+  useEffect(() => {
+
+    async function fetchData() {
+
+      const response = await fetch(
+        "https://pokeapi.co/api/v2/pokemon/1"
+      );
+
+      const data = await response.json();
+
+      setPokemon(data);
+    }
+
+    fetchData();
+
+  }, []);
+
+  if (!pokemon) return <p>Cargando...</p>;
+
+  return (
+    <div>
+      <h2>{pokemon.name}</h2>
+      <img 
+        src={pokemon.sprites.front_default} 
+        alt={pokemon.name} 
+      />
+    </div>
+  );
+}
+
+
+ +

¿Por qué no hacer directamente?

+
useEffect(async () => {
+  ...
+}, []);
+

Porque useEffect no debe recibir una función asíncrona directamente.

+

Por eso declaramos la función dentro y luego la ejecutamos.

+
+
+ +

Flujo mental con async / await

+
    +
  1. Render inicial
    +
  2. +
  3. Se ejecuta useEffect
    +
  4. +
  5. Se llama a la función asíncrona
    +
  6. +
  7. await espera la respuesta
    +
  8. +
  9. Se actualiza el estado
    +
  10. +
  11. Nuevo render
  12. +
+
+
+ +

async / await no cambia lo que hace el programa.

+

Solo cambia la forma de escribirlo:

+

Más claro.
+Más estructurado.
+Más fácil de mantener.

+
+
+

Ejemplo con la Pokeapi

+

Poke-API

+

Download Code

+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/pages/Bloque3/ps.html b/docs/pages/Bloque3/ps.html index 5c55f17..1d06ecc 100644 --- a/docs/pages/Bloque3/ps.html +++ b/docs/pages/Bloque3/ps.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -481,6 +481,29 @@ Proyecto Subsistema + + + + @@ -550,7 +573,7 @@

Proyecto Subsistema

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque3/ps.pdf b/docs/pages/Bloque3/ps.pdf index 3e86734..799b0d6 100644 Binary files a/docs/pages/Bloque3/ps.pdf and b/docs/pages/Bloque3/ps.pdf differ diff --git a/docs/pages/Bloque3/reactI.html b/docs/pages/Bloque3/reactI.html index 1c0eafb..d8fe49e 100644 --- a/docs/pages/Bloque3/reactI.html +++ b/docs/pages/Bloque3/reactI.html @@ -6,8 +6,8 @@ - - + + diff --git a/docs/pages/Bloque3/t6.html b/docs/pages/Bloque3/t6.html index a227782..39b83ab 100644 --- a/docs/pages/Bloque3/t6.html +++ b/docs/pages/Bloque3/t6.html @@ -2,7 +2,7 @@ - + @@ -73,9 +73,9 @@ - - - + + + @@ -516,6 +516,29 @@ Proyecto Subsistema + + + + @@ -607,7 +630,7 @@

T6: Romancero Gitano I

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/pages/Bloque3/t6.pdf b/docs/pages/Bloque3/t6.pdf index aceecad..95dd72b 100644 Binary files a/docs/pages/Bloque3/t6.pdf and b/docs/pages/Bloque3/t6.pdf differ diff --git a/docs/pages/rubric.html b/docs/pages/rubric.html index 3e4decd..29bc56d 100644 --- a/docs/pages/rubric.html +++ b/docs/pages/rubric.html @@ -2,7 +2,7 @@ - + @@ -38,9 +38,9 @@ - - - + + + @@ -481,6 +481,29 @@ Proyecto Subsistema + + + + @@ -539,7 +562,7 @@

Rúbrica de evaluación

Fecha de última modificación
-

15 de enero de 2026

+

4 de marzo de 2026

diff --git a/docs/rubriuca.pdf b/docs/rubriuca.pdf index c52ce86..4b88c58 100644 Binary files a/docs/rubriuca.pdf and b/docs/rubriuca.pdf differ diff --git a/docs/search.json b/docs/search.json index 986fea2..407c574 100644 --- a/docs/search.json +++ b/docs/search.json @@ -7,84 +7,214 @@ "text": "About this site" }, { - "objectID": "pages/Bloque3/ReactI.html", - "href": "pages/Bloque3/ReactI.html", - "title": "React I", + "objectID": "ignored/correcion.html", + "href": "ignored/correcion.html", + "title": "Evaluación Tareas por Subsistema", "section": "", - "text": "Contenido", + "text": "La tarea consiste en diseñar una todo app (lista de tareas) donde el usuario pueda añadir diferentes tareas especificando a qué subsistema pertenece. Estas al agregarse aparecerán en otra sección de la pantalla, en forma de lista o tabla, al hacer presionar sobre una tarea esta será eliminada.\n\nMás información https://tc-software.hyperloopupv.com/pages/Bloque3/ps.html\nComplejidad de la tarea: 5/10\nEn el curso hemos visto cómo hacer todo lo necesario para hacer la tarea, solo había dos dificultades evidentes:\n\nSi se usaba una etiqueta <form></form> utilizar el método event.preventDefault() o evitar el autoenvío del formulario con otros métodos\nDiseño y formateo de la web con CSS, en la tarea no se especifica ninguna indicación del estilo deseado, solo se invita al alumnado a demostrar su habilidad con CSS.\n\n\nPor último, se indica que lo descrito en la tarea supone las funcionalidades mínimas se espera que el alumnado agregue sus propias funcionalidades, además también se les ofreció la posibilidad de realizar la tarea con ReactJS si se veían lo suficientemente confiados. En el TC no hemos dado suficiente React para la realización de la tarea, por lo que aquellos errores causados por la inexperiencia en React, no serán tan penalizados como con los del DOM." + }, + { + "objectID": "ignored/correcion.html#destripción-de-la-tarea", + "href": "ignored/correcion.html#destripción-de-la-tarea", + "title": "Evaluación Tareas por Subsistema", + "section": "", + "text": "La tarea consiste en diseñar una todo app (lista de tareas) donde el usuario pueda añadir diferentes tareas especificando a qué subsistema pertenece. Estas al agregarse aparecerán en otra sección de la pantalla, en forma de lista o tabla, al hacer presionar sobre una tarea esta será eliminada.\n\nMás información https://tc-software.hyperloopupv.com/pages/Bloque3/ps.html\nComplejidad de la tarea: 5/10\nEn el curso hemos visto cómo hacer todo lo necesario para hacer la tarea, solo había dos dificultades evidentes:\n\nSi se usaba una etiqueta <form></form> utilizar el método event.preventDefault() o evitar el autoenvío del formulario con otros métodos\nDiseño y formateo de la web con CSS, en la tarea no se especifica ninguna indicación del estilo deseado, solo se invita al alumnado a demostrar su habilidad con CSS.\n\n\nPor último, se indica que lo descrito en la tarea supone las funcionalidades mínimas se espera que el alumnado agregue sus propias funcionalidades, además también se les ofreció la posibilidad de realizar la tarea con ReactJS si se veían lo suficientemente confiados. En el TC no hemos dado suficiente React para la realización de la tarea, por lo que aquellos errores causados por la inexperiencia en React, no serán tan penalizados como con los del DOM." + }, + { + "objectID": "ignored/correcion.html#criterios-de-corrección", + "href": "ignored/correcion.html#criterios-de-corrección", + "title": "Evaluación Tareas por Subsistema", + "section": "Criterios de corrección", + "text": "Criterios de corrección\n\n(7.5%) Diseño-Estructural: estructura general de la web y distribución de espacios. Incluye la selección de uso de las etiquetas HTML y la disposición del contenido sin importar su origen (HTML o CSS).\n(7.5%) Diseño-Formato: formato del sitio web, incluye paleta de colores, fondos, formato de letra (tamaño, color, fuente…) y otros aspectos como el uso de color, animaciones, transiciones, así como el uso del margen y el padding o margen interno. Además también incluye el uso de selectores o clases pseudoclases\n(15%) Funcionalidad: las funcionalidades que incorpora la web se valorará con un 7 aquellas que únicamente incorporen aquello mínimamente requerido. Las funcionalidades extras sumarán puntuación en función de su cantidad y el nivel de dificultad\n(20%) Programación: nivel de desempeño en la programación en JS y manejo del DOM o React, se evalúa la calidad de la programación así como la normatividad. (Recomendación: partir del 10 y descontar por errores)\n(10%) Documentación, claridad: valorar la existencia de comentarios, su calidad y su utilidad, así como documentación en un Readme aquellos alumnos que no hayan comentado nada o prácticamente nada obtendrán automáticamente un cero en este apartado. Durante el TC se ha recordado muchas veces la importancia de comentar. Incluye también el uso de Git\n(15%) Esfuerzo: compromiso que denota el alumno por la realización de la tarea.\n(10%) Exposición: calidad de la exposición del alumno durante la presentación.\n(15%) Respuesta a preguntas técnicas: con el objetivo de demostrar que los alumnos no han copiado y pegado una tarea con el uso de AI, al final de cada presentación se realizarán una serie de preguntas técnicas provenientes del código del alumno para valorar que el alumno entienda su código. Si se aprecia que un alumno no parece entenderlo que hace su código se podrá alterar la calificación global de la tarea en base a este apartado." + }, + { + "objectID": "ignored/correcion.html#descripción-de-la-evaluación", + "href": "ignored/correcion.html#descripción-de-la-evaluación", + "title": "Evaluación Tareas por Subsistema", + "section": "Descripción de la evaluación", + "text": "Descripción de la evaluación\nAULA N34 de la ETSIADI VIERNES 20 DE FEBRERO a las 17:25 (se ruega puntualidad porque después en la misma aula se realiza el TC de Mechanics & Structures)\nLa evaluación se realizará de forma individual para cada alumno (los otros no deben de estar presentes), cada evaluación constará de 4 partes\n\n\n\n\n\n\n\n\n\nNúmero\nParte\nDescripción\nTiempo max.\n\n\n\n\n1\nExposición del alumno\nEl alumno expone mostrando el código o el resultado su tarea\n4 min\n\n\n2\nPreguntas técnicas y sugerencias de mejoras\nLos evaluadores realizarán preguntas técnicas al alumno para mejorar su valoración de la tarea así como aportar pequeñas correcciones o sugerencias\n4 min\n\n\n3\nPreguntas técnicas específicas\nCon un fragmento del código determinado se le preguntará al alumno el funcionamiento de dicho fragmento de código para valorar su conocimiento de su propio código\n4 min\n\n\n4\nPreguntas de esfuerzo e implicación\nPreguntas con el objetivo de determinar las capacidades de determinar el nivel de esfuerzo e implicación del alumno\n4 min\n\n\n\nTiempo máximo por alumno 20 min.\n\nPreguntas de esfuerzo e implicación\n\n¿Qué dificultades reales encontraste durante el desarrollo de la tarea y qué hiciste de forma concreta para superarlas?\n¿Cómo organizaste tu trabajo para esta tarea? ¿Qué decisiones tomaste cuando algo no funcionaba como esperabas?\n¿Has pedido ayuda a alguien o has buscado información fuera de clase? ¿Dónde?\nSi tuvieras que mejorar algo de tu propio trabajo, ¿qué cambiarías?\n¿Te ha gustado hacer esta tarea? ¿Por qué?\n\n\n\nMaterial para la evaluación\nLas calificaciones se deben de especifiar en la siguiente hoja de cálculo, cada alumno tiene asignado dos hojas, una para las preguntas anteriores y otra para la calificación. Cada evaluador debe de rellenar sus casillas correspondientes\n\nEnlace rúbrica evaluación: https://docs.google.com/spreadsheets/d/197FOBehsNLLC2EaLQV7yCg9lXfXS2qP4SQIugoytrWg/edit?usp=sharing\nEnlace código alumnos: https://drive.google.com/file/d/1nc_WknXLHcX7PLOSx4Wi5mk_xdjJkOIb/view?usp=drive_link\nEnlace descripción del proyecto (web del TC): https://tc-software.hyperloopupv.com/pages/Bloque3/ps.html" + }, + { + "objectID": "ignored/correcion.html#evaluación-notas-generales", + "href": "ignored/correcion.html#evaluación-notas-generales", + "title": "Evaluación Tareas por Subsistema", + "section": "Evaluación Notas Generales", + "text": "Evaluación Notas Generales\nEvaluación previa realizada por el profesor antes de la presentación, la podeis leer para valorar vosotros los fallos y calificarlos según vuestro criterio\n\nIvan Martínez Enguix\nPor algún motivo tiene los tamaños de todo muy distorsionado, habrá que preguntarle durante la presentación, seguramente mientras acababa de programar modificaría el zoom de la preview\n\nDiseño Estructural\nEstéticamente está bien, gestiona el espacio de una manera correcta pero mejorable, podría haber puesto un overflow pero en general bastante bien distribuido. Destacar el uso del <footer>.\nEn relación al código en general está bastante bien aunque tiene algunos fallos importantes. Siendo estos algunos de los más destacables.\n\n<div id=\"titulo\"><h1><strong>Lista de tareas</strong></h1></div>\n\nMal uso del <form> y de la etiqueta <label>, (personalmente me sorprende que la aplicación funcione con esto tal y como está)\n <!--Div con los dos campos que rellenar-->\n <div class=\"elflex\">\n\n <!--DOS FORMS???!!!!-->\n <form class=\"losforms\">\n <label for=\"first-name\">Nombre:</label>\n <input type=\"text\" name=\"first-name\" class=\"losforms\" id=\"nomtarea\"/>\n </form>\n\n <!--Desplegable y boton-->\n <form class=\"losforms\">\n <!-- LABEL QUE APUNTA AL BOTÓN DE SUBMTI-->\n <label for=\"elinput\">Responsable: </label>\n <select name=\"Responsable:\" id=\"desplegable\" class=\"losforms\">\n <option value=\"Software\">Software</option>\n <option value=\"Hardware\">Hardware</option>\n <option value=\"Partners\">Partners</option>\n <option value=\"Otros\">Otros</option>\n </select>\n <input type=\"submit\" value=\"Añadir\" id=\"elinput\" class=\"losforms\" />\n </form>\n </div>\nPuntuación: 6.8, aunque el HTML tiene varios errores garrafales la estructura es correcta y el resto del HTML está bastante bien\n\n\nDiseño Formato\nUso muy bueno de las propiedades y de los selectores/pseudoselectores de CSS. Domina funciones avanzadas como el flex, el degradado en el fondo, así como configurar correctamente las propiedades de la foto del pie de sitio.\nUtiliza una buena paleta de colores que incluye el AZUL y el VERDE, colores complementarios siguiendo la teoría de color.\nAbusa del uso de los píxeles como unidades de medida, (aunque en el TC tampoco hemos visto más). Hubiera faltado formatear mejor los botones.\nPor último en relación a la hoja de estilos podría haber agrupados varias propiedades en una única clase y aplicarla indistintamente o haber definido una variable de CSS\nPuntuación: 7.5, muy buen diseño y uso de los selectores cosas mejorables en la hoja de estilos pero en general bien. Obiando lo del zoom está todo correcto\n\n\nFuncionalidad\nIncorpora todas las funcionalidades básicas, sin embargo presenta algunos errores, y bugs críticos:\n\nAñadir dos veces la misma tarea\nAñadir tareas sin especificar texto\nAl presionar el botón de intro en el <input> de la tarea se recarga el sitio web (esto por la mala configuración del formulario)\n\nNo mucho más que añadir.\nPuntuación 5.5: cumple con lo mínimo y presenta muchos bugs\n\n\nProgramación\nCódigo JS correcto, no maneja el DOM de la forma más eficiente, aun así parece que no acaba de comprender el paso de variables de las funiones de ES6.\nAunque el manejo del DOM no es el del todo correcto, lo ha solucionado con de una forma muy creativa jugando con selectores CSS. Aun así presenta código innecesario\n const btn = document.getElementById(\"elinput\");\nconst subsistema = document.getElementById(\"desplegable\");\nconst lista = document.getElementById(\"listado\");\nconst tarea = document.getElementById(\"nomtarea\");\n\n//Recoge la información del campo escrito y desplegable y los enseña por pantalla en la lista de tareas\nbtn.addEventListener(\"click\",(event1)=>{\n\n event1.preventDefault();\n const li = document.createElement(\"li\");\n li.textContent = tarea.value + \" (\" + subsistema.value + \")\";\n // AÑADIR NEGRITA AQUÍ\n lista.appendChild(li);\n tarea.value = null\n});\n\n//Detecta sobre que elemento de la lista estamos haciendo click y lo elimina\nlista.addEventListener(\"click\", function(event2) {\n\n if (event2.target.tagName === \"LI\") {\n event2.target.remove();\n }\n});\n\n// TODO ESTO SOBRA SE PODRÍA AÑADIR NEGRITA DIRECTAMENTE AL LI\n//Cuando se pasa por encima de una tarea \nlista.addEventListener(\"mouseover\", function(event3) {\n\n if (event3.target.tagName === \"LI\") {\n event3.target.classList.add(\"negrita\");\n }\n});\nPuntuación: 7.5: En general bien sería interesante que almacenará las tareas, aunque tal y como lo ha planteado no le hacía falta\n\n\nDocumentación\nHay comentarios en el HTML y en JS, en el CSS no. Tampoco hay documntación, pero ha usado git aunque sus mensajes de log no son los más correctos.\nPuntuación: 7\n\n\nObservaciones\nPor algún motivo hay 3 fotos en la misma carpeta que los ficheros de código (dos paisajes y una fotografía de Shrek [Sí, el ogro verde de dreamworks])\n\n\nPreguntas técnicas\n\nPreguntarle lo que es un flex\nPreguntarle a que se corresponde la variable listado de su código\n\n\n\n\nPau Minguet Micó\nHa hecho dos versiones una con DOM y otra con React, así en general evaluaremos la de React pero hay que destacar que el código JS del DOM está correcto. (Es más correcta la solución de DOM a nivel de programación pero valoaremos la de React más positivamente)\n\nDiseño Estructural\nNo se distingue lo que es HTML de lo que no, lo cual no es malo, distribuye el espacio de forma mediocre aunque no mal del todo.\nEn general está bien no utiliza la etiqueta <header/> para la cabecera y utiliza la propiedad style para introducir estilos con la sintaxis JSX, lo cual según mi criterio no es del todo correcto, sin embargo aquí lo hace dos veces por lo que podría haber introducido una clase.\n <span className=\"item-text\" style={{ textDecoration: checked ? \"line-through\" : \"none\" }}>{item.text}</span>\n <span className=\"item-responsible\" style={{ textDecoration: checked ? \"line-through\" : \"none\" }}>{item.responsible}</span>\nFaltaría añadir un label para el checkbox para que si haces click en el texto se marque la casilla Puntuación:8\n\n\nDiseño Formato\nImpresionante, luce el CSS, aunque hay cosas que no acaban de agradar, el alumno maneja correctamente las propiedades CSS juega perfectamente con los flex y trabaja los efectos y animaciones de forma sencilla, la web es casi responsive. Lo único que no me gusta es que con la imagen de fondo no podemos evaluar su totalment paleta de colores, aun así los colores mostrados son correctos.\nAdemás incorpora iconos y letras importadas de CSS, así como checkbox muy customizadas.\nMe llama especialmente la atención el uso de las propiedades CSS, le preguntaremos mucho sobre esto, hay un par de propiedades muy especificas.\nPuntuación: 9\n\n\nFuncionalidad\nIncorpora todas las funcionalidades básicas, sin embargo presenta algunos errores\n\nAñadir dos veces la misma tarea\n\nIncorpora la posibilidad de marcar una tarea sin eliminarla, así como la posibilidad de editar la tarea, lo cual no es el del todo fácil.\nPuntuación 8: incluye lo mínimo y funcionalidades\n\n\nProgramación\nUtiliza React. Buen diseño de componentes generalmente utiliza correctamente las props y el state (aun no lo hemos visto en el TC) aun así presenta algunos errores de metodología (los cuales serán trabajados en el TC posteriormente).\nEl error más destable es utilizar el DOM, pero bueno lo hace de forma correcta y en susitución de los controlled-inputs (que tampoco los hemos visto en el TC).\nimport ListItem from \"./ListItem\";\nimport EditItem from \"./EditItem\";\nimport { useState } from \"react\";\nimport \"../styles/TaskList.css\";\n\nconst TaskList = ({ items, updateList }) => {\n\n // Stores the index of the task that is being edited\n const [editIndex, setEditIndex] = useState(-1);\n\n // When the user clicks on a task, it will be removed from the list\n const handleClick = item => {\n updateList(items.filter(n => !(n.text === item.text && n.responsible === item.responsible)));\n };\n\n // When the user clicks on the save button in the EditItem component, this function will be called to update the task in the list\n const handleSave = () => {\n const text = document.querySelector(\".edit-text\").value;\n const responsible = document.querySelector(\".edit-select\").value;\n if (text !== \"\") {\n const newItems = [...items];\n newItems[editIndex] = { text, responsible };\n updateList(newItems);\n setEditIndex(-1);\n }\n }\n\n // MUY FEO ESTO\n return (\n <div className=\"task-list\">\n {items.map((item, i) => (\n // Just one of the items will be in edit mode\n editIndex === i ? (\n <EditItem key={i} item={item} onSave={handleSave} onCancel={() => setEditIndex(-1)} />\n ) : (\n <ListItem \n key={i} \n onClick={() => handleClick(item)} \n item={item} \n setEditIndex={setEditIndex} \n pos={i} \n />\n )\n ))}\n </div>\n );\n};\n\nexport default TaskList;\nPuntuación: 9\n\n\nDocumentación\nHay comentarios en JSX pero no en CSS. No hay documentación uso correcto de Git y Git Hub se ha hecho una PR a si mismo, trabaja con ramas y utiliza convenctional commits. No presenta documentación.\nPuntuación 8:\n\n\nEsfuerzo\nMe ha ido enseñando distintas versiones de la web me ha ido preguntando por mi opinión y ha ido haciendo casos de mis sugerencias\n\n\nPreguntas técnicas\n\nPreguntarle lo que es un flex y sus propiedades\nPreguntarle el diagrama de componentes de su app\n\n\n\n\nDaniel Zanón Barney\nTengo dudas respecto a este alumno sus tares han sido bastante malas y en clase me transmite la sensación de que no se ha enterado de mucho durante el TC y tengo mis sospechas de que el trabajo está hecho en una gran parte con IA, su tarea presenta un error se lo indicaremos y le diremos que lo corrija en directo.\nEl error es que no llama bien al método get de texto, utiliza una mayúscula en vez de una minúscula." + }, + { + "objectID": "pages/Bloque3/DOM.html", + "href": "pages/Bloque3/DOM.html", + "title": "DOM", + "section": "", + "text": "El DOM (Document Object Model) es la representación en memoria que el navegador crea a partir del HTML.\n\nEl HTML es estático\nEl DOM es dinámico\nJavaScript interactúa con el DOM, no con el HTML original\n\n\nEl DOM es la página web viva dentro del navegador.", "crumbs": [ "Bloque III Interacción", - "Semana 7", - "React I" + "Semana 6", + "DOM" ] }, { - "objectID": "pages/Bloque3/ReactI.html#sintaxis-jsx", - "href": "pages/Bloque3/ReactI.html#sintaxis-jsx", - "title": "React I", - "section": "Sintaxis JSX", - "text": "Sintaxis JSX\n\n¿Qué es la sintaxis JSX?\n\nJSX (JavaScript XML) es una extensión de JavaScript utilizada en React.\n\nPermite escribir estructuras similares a HTML directamente dentro del código JavaScript.\n\nFacilita la creación y lectura de interfaces de usuario, integrando lógica y presentación.\n\nAunque su apariencia es HTML, JSX se transpila a JavaScript puro antes de ejecutarse en el navegador.\nForma cómoda de almacenar etiquetas html como variables de JS\n\n\n\n¿Qué nos ofrece la sintaxis JSX?\n\nAlmacenar una etiqueta como una variable\nconst title = <h1>Web del TC de SW</h1>;\n\nconst driveIndication = (drives)? <p>Puede conducir</p> : <p>No puede conducir</p>;\nDe esta forma la variable title se corresponde con una etiqueta que contiene el título. Sin embargo, como podemos podemos utilizar está etiqueta una vez la hemos definido como una variable.\n\n\nRenderizar etiquetas dentro de etiquetas\nconst title = <h1>Web del TC de SW</h1>;\n\nconst page = <div>{title}</div>\nDe esta forma estámos encapsulando la etiqueta h1 dentro del div.\n\n\nRenderizar con el map\nconst profeAsi= [[\"Rosa\", \"Macro I\"], [\"Gabriela\", \"FSO\"],[\"Yolanda\",\"LTP\"], [\"Ferrán\", \"EM\"], [\"Pepe\", \"TCO\"]];\n\n// Array de li Asignatura: nombre profesor\nconst itemsProfAsi = profeAsi.map(x => <li>{x[1]}: {x[0]}</li>);\n\nconst listaProfesoresAsignatura = <ul>{itemsProfAsi}</ul>;\n\n\nRenderizar con el map\nconst profeAsi= [[\"Rosa\", \"Macro I\"], [\"Gabriela\", \"FSO\"], [\"Yolanda\",\"LTP\"], [\"Ferrán\", \"EM\"], [\"Pepe\", \"TCO\"]];\n\nconst listaProfesoresAsignatura = <ul>\n{profeAsi.map((x,i) => <li key={i}>{x[1]}: {x[0]}</li>)}\n</ul>;", + "objectID": "pages/Bloque3/DOM.html#qué-es-el-dom", + "href": "pages/Bloque3/DOM.html#qué-es-el-dom", + "title": "DOM", + "section": "", + "text": "El DOM (Document Object Model) es la representación en memoria que el navegador crea a partir del HTML.\n\nEl HTML es estático\nEl DOM es dinámico\nJavaScript interactúa con el DOM, no con el HTML original\n\n\nEl DOM es la página web viva dentro del navegador.", "crumbs": [ "Bloque III Interacción", - "Semana 7", - "React I" + "Semana 6", + "DOM" ] }, { - "objectID": "pages/Bloque3/ReactI.html#react", - "href": "pages/Bloque3/ReactI.html#react", - "title": "React I", - "section": "React", - "text": "React\n\nMotivación\nHasta el momento hemos trabajado únicamente con HTML5, el cual a pesar de ser muy eficaz, presenta el inconveniente de que no implementa ninguna clase de lógica. Es decir, si queremos repetir alguna estructura previamente definida deberemos copiarla y pegarla. Otro problema, de HTML puro es la complejidad que requiere el manejo del DOM, como ya se vio en la semana anterior.\nBajo este pretexto, introducimos el framework React diseñado por Meta.\n\n\nBases de React\nReact es un componente basado en la sintaxis JS y en la programación funcional introducida en ES6.\n\n\nComponente React\nLos componentes de React los definimos como unidades reutilizables y modulares que se implementan de esta forma: una función que devuelve un objeto de JSX\nfunction Saludo() {\n return <h1>Hola, mundo</h1>;\n}\nPodemos renderizar nuestro componente Saludo asumiendo que se comporta como una etiqueta html. Recordemos que no lo es.\n<main>\n <Saludo />\n</main>\nDentro de este componente podemos incluir lógica propia de JavaScript, de forma que al definir componente podemos dotarlo de lógica interna.\nfunction DivNúmeroAleatorio() {\n\n let n = Math.random();\n return <div className=\"n-random\">{n}</div>;\n}\n*Nótese que aunque JS utilice camelCase para el nombre de las funciones, con React utilizaremos PascalCase para definir los componentes puesto que a pesar de que se trata de funciones, trabajaremos con ellas como si fuesen clases.\n\n\nProps en React\nHasta ahora, los componentes definidos siempre devuelven el mismo contenido. Sin embargo, para que un componente sea realmente reutilizable, necesitamos poder pasarle información desde el exterior.\nEn React, esta información se transmite mediante props (properties).\nLas props se definen como los parámetros de entrada de un componente y permiten personalizar su comportamiento o su contenido sin modificar su definición interna.\n\nEjemplo 1: uso de props (forma explícita)\nfunction Saludo(props) {\n return <h1>Hola, {props.nombre}</h1>;\n}\nUso del componente:\n<Saludo nombre=\"Rosa\" />\n<Saludo nombre=\"Gabriela\" />\n\n\nEjemplo 2: props desestructuradas (sintaxis JavaScript)\nfunction Saludo({ nombre }) {\n return <h1>Hola, {nombre}</h1>;\n}\nUso del componente (idéntico al anterior):\n<Saludo nombre=\"Rosa\" />\n<Saludo nombre=\"Gabriela\" />\n\n\n\nEventos en React\nEn React, el manejo de eventos se basa en los eventos del DOM, pero utilizando una sintaxis propia de JSX y siguiendo el estilo de JavaScript.\n\nEjemplo básico de evento\nfunction BotonSaludo() {\n\n function manejarClick() {\n alert(\"Hola desde React\");\n }\n\n return (\n <button onClick={manejarClick}>\n Saludar\n </button>\n );\n}\n\n\nPaso de funciones como eventos\nLa función asociada al evento no se ejecuta al renderizar el componente, sino únicamente cuando ocurre el evento; es decir la pasamos como un ciudadano de primera clase.\n<button onClick={manejarClick}>Saludar</button>\nIncorrecto:\n<button onClick={manejarClick()}>Saludar</button>\n\n\nEventos más habituales en React\nReact soporta la mayoría de los eventos del DOM, adaptados a la sintaxis JSX. A continuación se listan los eventos más utilizados, clasificados por tipo.\n\nEventos de ratón\n\nonClick\nonDoubleClick\nonMouseEnter\nonMouseLeave\nonMouseMove\nonMouseDown\nonMouseUp\n\n\n\nEventos de teclado\n\nonKeyDown\nonKeyUp\nonKeyPress\n\n\n\nEventos de formularios\n\nonChange\nonSubmit\nonFocus\nonBlur\nonInput\nonReset\n\n\n\nEventos de carga y ciclo del elemento\n\nonLoad\nonError\n\n\n\nEventos de selección y portapapeles\n\nonSelect\nonCopy\nonCut\nonPaste\n\n\n\nEventos táctiles (dispositivos móviles)\n\nonTouchStart\nonTouchMove\nonTouchEnd\nonTouchCancel\n\n\n\n\n\nCiclo de vida de los componentes y renderizado en React\nEn React, los componentes no se renderizan directamente sobre el DOM real, sino que siguen un proceso intermedio que permite optimizar las actualizaciones de la interfaz.\nLa idea clave es que la interfaz se organiza como un árbol de componentes, análogo al árbol del DOM, pero a un nivel de abstracción superior.\n\nEl árbol de componentes\nCuando una aplicación React se ejecuta:\n\nCada componente genera otros componentes o elementos JSX.\nReact construye un árbol de componentes, donde:\n\nEl componente raíz suele ser App\nCada componente hijo ocupa una rama del árbol\n\n\nEste árbol de componentes se corresponde conceptualmente con el árbol del DOM, aunque no es el DOM real.\n\n\nProceso de renderizado\nEl proceso general es el siguiente:\n\nReact ejecuta un componente (función).\nEl componente devuelve JSX.\nEl JSX se transforma en una representación interna del árbol.\nReact compara este árbol con el anterior.\nSolo se actualizan en el DOM real los nodos que han cambiado.\n\nDe esta forma, React minimiza el acceso directo al DOM, que es una operación costosa.\n\n\nCiclo de vida (visión simplificada)\nDesde un punto de vista conceptual, un componente pasa por tres fases:\n\nMontaje\n\nEl componente se crea y se inserta en el DOM.\n\nActualización\n\nEl componente se vuelve a renderizar cuando cambian sus datos.\n\nDesmontaje\n\nEl componente se elimina del DOM.\n\n\nEn componentes funcionales modernos, este ciclo se gestiona de forma implícita mediante el renderizado y, más adelante, mediante hooks.\n\n\nRelación con el DOM\n\nEn JavaScript puro:\n\nSe modifica el DOM directamente.\n\nEn React:\n\nSe describe cómo debe ser la interfaz.\nReact decide el cuándo y el cómo modificar el DOM.\n\n\nEl desarrollador no recorre ni manipula el árbol del DOM, sino que trabaja sobre el árbol de componentes.", + "objectID": "pages/Bloque3/DOM.html#el-dom-como-árbol", + "href": "pages/Bloque3/DOM.html#el-dom-como-árbol", + "title": "DOM", + "section": "El DOM como árbol", + "text": "El DOM como árbol\nEl DOM tiene estructura de árbol (grafo):\n\nCada etiqueta HTML es un nodo\nLos nodos tienen relaciones (padre, hijos, hermanos)\n\nEjemplo:\n<body>\n <h1>Título</h1>\n <button>Click</button>\n</body>\nRepresentación conceptual:\ndocument\n └─ body\n ├─ h1\n └─ button", "crumbs": [ "Bloque III Interacción", - "Semana 7", - "React I" + "Semana 6", + "DOM" ] }, { - "objectID": "pages/Bloque3/ReactI.html#creación-de-una-reactjs-app", - "href": "pages/Bloque3/ReactI.html#creación-de-una-reactjs-app", - "title": "React I", - "section": "Creación de una ReactJS app", - "text": "Creación de una ReactJS app\nEl desarrollo de aplicaciones web modernas requiere coordinar múltiples elementos: estructura del proyecto, gestión de dependencias, compilación del código y ejecución en el navegador.\nUn framework de desarrollo proporciona un entorno de trabajo preconfigurado que organiza estos elementos y establece una forma estándar de trabajar.\n\n¿Para qué sirve un framework?\nUn framework permite al desarrollador:\n\nEvitar configuraciones manuales complejas\nSeguir una estructura común de proyecto\nAutomatizar tareas repetitivas\nCentrarse en la lógica de la aplicación y no en la infraestructura\n\nEn lugar de partir de un proyecto vacío, el framework ofrece una base funcional sobre la que desarrollar.\n\n\nFramework y React\nReact se encarga de definir cómo se construye la interfaz, pero no gestiona por sí mismo:\n\nLa estructura de archivos\nEl arranque de la aplicación\nLa compilación del código\nEl servidor de desarrollo\n\nPor ello, React se apoya en un framework que orquesta el entorno de ejecución.\n\n\nCreación de la aplicación\nPara crear una nueva aplicación React utilizando un framework, se ejecuta el siguiente comando en la terminal:\nnpm create vite@latest\nEste comando genera:\n\nUna estructura inicial del proyecto\nLa configuración necesaria para trabajar con React\nUn entorno listo para el desarrollo", + "objectID": "pages/Bloque3/DOM.html#acceso-al-dom-desde-javascript", + "href": "pages/Bloque3/DOM.html#acceso-al-dom-desde-javascript", + "title": "DOM", + "section": "Acceso al DOM desde JavaScript", + "text": "Acceso al DOM desde JavaScript\nEl navegador nos proporciona el objeto global document, que permite:\n\nBuscar elementos\nLeer su contenido\nModificar la interfaz\n\ndocument\ndocument.body", "crumbs": [ "Bloque III Interacción", - "Semana 7", - "React I" + "Semana 6", + "DOM" ] }, { - "objectID": "pages/Bloque3/reactI.html#sintaxis-jsx", - "href": "pages/Bloque3/reactI.html#sintaxis-jsx", - "title": "React I", - "section": "Sintaxis JSX", - "text": "Sintaxis JSX\n¿Qué es la sintaxis JSX?\n\nJSX (JavaScript XML) es una extensión de JavaScript utilizada en React.\n\nPermite escribir estructuras similares a HTML directamente dentro del código JavaScript.\n\nFacilita la creación y lectura de interfaces de usuario, integrando lógica y presentación.\n\nAunque su apariencia es HTML, JSX se transpila a JavaScript puro antes de ejecutarse en el navegador.\nForma cómoda de almacenar etiquetas html como variables de JS" + "objectID": "pages/Bloque3/DOM.html#selectores", + "href": "pages/Bloque3/DOM.html#selectores", + "title": "DOM", + "section": "Selectores", + "text": "Selectores\n\nPor ID\ndocument.getElementById(\"count\")\ndocument.querySelector(\"#count\")\n\n\nPor etiqueta\ndocument.querySelector(\"button\")\n\n\nPor clase\ndocument.querySelector(\".item\")\ndocument.querySelectorAll(\".item\")\nNotas: - querySelector devuelve el primer elemento - querySelectorAll devuelve una lista - Usan la misma sintaxis que CSS", + "crumbs": [ + "Bloque III Interacción", + "Semana 6", + "DOM" + ] }, { - "objectID": "pages/Bloque3/reactI.html#react", - "href": "pages/Bloque3/reactI.html#react", - "title": "React I", - "section": "React", - "text": "React\nMotivación\nHasta el momento hemos trabajado únicamente con HTML5, el cual a pesar de ser muy eficaz, presenta el inconveniente de que no implementa ninguna clase de lógica. Es decir, si queremos repetir alguna estructura previamente definida deberemos copiarla y pegarla. Otro problema, de HTML puro es la complejidad que requiere el manejo del DOM, como ya se vio en la semana anterior.\nBajo este pretexto, introducimos el framework React diseñado por Meta." + "objectID": "pages/Bloque3/DOM.html#leer-y-modificar-elementos", + "href": "pages/Bloque3/DOM.html#leer-y-modificar-elementos", + "title": "DOM", + "section": "Leer y modificar elementos", + "text": "Leer y modificar elementos\nelement.textContent\nelement.textContent = \"Nuevo texto\"\nelement.classList.add(\"active\")\nelement.classList.remove(\"active\")", + "crumbs": [ + "Bloque III Interacción", + "Semana 6", + "DOM" + ] }, { - "objectID": "pages/Bloque3/reactI.html#creación-de-una-reactjs-app", - "href": "pages/Bloque3/reactI.html#creación-de-una-reactjs-app", - "title": "React I", - "section": "Creación de una ReactJS app", - "text": "Creación de una ReactJS app\nEl desarrollo de aplicaciones web modernas requiere coordinar múltiples elementos: estructura del proyecto, gestión de dependencias, compilación del código y ejecución en el navegador.\nUn framework de desarrollo proporciona un entorno de trabajo preconfigurado que organiza estos elementos y establece una forma estándar de trabajar." + "objectID": "pages/Bloque3/DOM.html#eventos", + "href": "pages/Bloque3/DOM.html#eventos", + "title": "DOM", + "section": "Eventos", + "text": "Eventos\nEl DOM permite reaccionar a acciones del usuario mediante eventos.\nbutton.addEventListener(\"click\", () => {\n // código a ejecutar\n});\nFlujo típico:\nUsuario → Evento → JavaScript → DOM actualizado", + "crumbs": [ + "Bloque III Interacción", + "Semana 6", + "DOM" + ] }, { - "objectID": "pages/Bloque3/MAcss2.html", - "href": "pages/Bloque3/MAcss2.html", - "title": "MA: CSS Flex y CSS", - "section": "", - "text": "Además de las propiedades estudiadas de CSS también hay algunas críticas que debido a la falta de tiempo no se han podido explicar como es el caso de display a continuación estos dos vídeos profundizan en los modos flex y grid formas diferentes de diseñar la estructura de la página", + "objectID": "pages/Bloque3/DOM.html#ejemplo-contador-con-botón", + "href": "pages/Bloque3/DOM.html#ejemplo-contador-con-botón", + "title": "DOM", + "section": "Ejemplo: contador con botón", + "text": "Ejemplo: contador con botón\n\nHTML\n<h1 id=\"count\">0</h1>\n<button id=\"btn\">Sumar 1</button>\n\n\nJavaScript\nlet count = 0;\n\nconst countEl = document.querySelector(\"#count\");\nconst btn = document.querySelector(\"#btn\");\n\nbtn.addEventListener(\"click\", () => {\n count++;\n countEl.textContent = count;\n});", "crumbs": [ "Bloque III Interacción", "Semana 6", - "MA: CSS Flex y CSS" + "DOM" + ] + }, + { + "objectID": "pages/Bloque3/DOM.html#más-ejemplos", + "href": "pages/Bloque3/DOM.html#más-ejemplos", + "title": "DOM", + "section": "Más ejemplos", + "text": "Más ejemplos\nEj1: Show input\nEj2: Par e Impar\nEj3: Toggle\nEj4: Creación dinámica\nEj5: Validación básica", + "crumbs": [ + "Bloque III Interacción", + "Semana 6", + "DOM" + ] + }, + { + "objectID": "pages/Bloque3/dom.html#qué-es-el-dom", + "href": "pages/Bloque3/dom.html#qué-es-el-dom", + "title": "DOM", + "section": "¿Qué es el DOM?", + "text": "¿Qué es el DOM?\nEl DOM (Document Object Model) es la representación en memoria que el navegador crea a partir del HTML.\n\nEl HTML es estático\nEl DOM es dinámico\nJavaScript interactúa con el DOM, no con el HTML original\n\n\nEl DOM es la página web viva dentro del navegador." + }, + { + "objectID": "pages/Bloque3/dom.html#el-dom-como-árbol", + "href": "pages/Bloque3/dom.html#el-dom-como-árbol", + "title": "DOM", + "section": "El DOM como árbol", + "text": "El DOM como árbol\nEl DOM tiene estructura de árbol (grafo):\n\nCada etiqueta HTML es un nodo\nLos nodos tienen relaciones (padre, hijos, hermanos)\n\nEjemplo:\n<body>\n <h1>Título</h1>\n <button>Click</button>\n</body>" + }, + { + "objectID": "pages/Bloque3/dom.html#acceso-al-dom-desde-javascript", + "href": "pages/Bloque3/dom.html#acceso-al-dom-desde-javascript", + "title": "DOM", + "section": "Acceso al DOM desde JavaScript", + "text": "Acceso al DOM desde JavaScript\nEl navegador nos proporciona el objeto global document, que permite:\n\nBuscar elementos\nLeer su contenido\nModificar la interfaz\n\ndocument\ndocument.body" + }, + { + "objectID": "pages/Bloque3/dom.html#selectores", + "href": "pages/Bloque3/dom.html#selectores", + "title": "DOM", + "section": "Selectores", + "text": "Selectores\nPor ID\ndocument.getElementById(\"count\")\ndocument.querySelector(\"#count\")\nPor etiqueta\ndocument.querySelector(\"button\")" + }, + { + "objectID": "pages/Bloque3/dom.html#leer-y-modificar-elementos", + "href": "pages/Bloque3/dom.html#leer-y-modificar-elementos", + "title": "DOM", + "section": "Leer y modificar elementos", + "text": "Leer y modificar elementos\nelement.textContent\nelement.textContent = \"Nuevo texto\"\nelement.classList.add(\"active\")\nelement.classList.remove(\"active\")" + }, + { + "objectID": "pages/Bloque3/dom.html#eventos", + "href": "pages/Bloque3/dom.html#eventos", + "title": "DOM", + "section": "Eventos", + "text": "Eventos\nEl DOM permite reaccionar a acciones del usuario mediante eventos.\nbutton.addEventListener(\"click\", () => {\n // código a ejecutar\n});\nFlujo típico:\nUsuario → Evento → JavaScript → DOM actualizado" + }, + { + "objectID": "pages/Bloque3/dom.html#ejemplo-contador-con-botón", + "href": "pages/Bloque3/dom.html#ejemplo-contador-con-botón", + "title": "DOM", + "section": "Ejemplo: contador con botón", + "text": "Ejemplo: contador con botón\nHTML\n<h1 id=\"count\">0</h1>\n<button id=\"btn\">Sumar 1</button>\nJavaScript\nlet count = 0;\n\nconst countEl = document.querySelector(\"#count\");\nconst btn = document.querySelector(\"#btn\");\n\nbtn.addEventListener(\"click\", () => {\n count++;\n countEl.textContent = count;\n});" + }, + { + "objectID": "pages/Bloque3/dom.html#más-ejemplos", + "href": "pages/Bloque3/dom.html#más-ejemplos", + "title": "DOM", + "section": "Más ejemplos", + "text": "Más ejemplos\nEj1: Show input\nEj2: Par e Impar\nEj3: Toggle\nEj4: Creación dinámica\nEj5: Validación básica" + }, + { + "objectID": "pages/Bloque3/MARef.html", + "href": "pages/Bloque3/MARef.html", + "title": "MA: Uncontrolled fields y useRef", + "section": "", + "text": "Por el momento hemos visto dos hooks useState y useEffect, pero recordemos que en React existen más tipos de hooks que por ser menos útiles y debido a la falta de tiempo no son explicados, no obstante si hay alguno digno de mención es useRef o las referencias.\nUna ref es una referencia mutable que permite acceder directamente a un elemento del DOM o almacenar un valor persistente sin provocar un re-render del componente. El siguiente video ilustra su uso. Es un poco largo pero sirve para repasar los otros hooks.\n\n\nCon las ref podemos introducir los uncontrolled fields que nos permiten trabajar de otra forma con los formularios.\n\nSe prefiere la segunda implementación (la que no utiliza referencias) sobre la primera.", + "crumbs": [ + "Bloque III Interacción", + "Semana 9", + "MA: *Uncontrolled fields* y `useRef`" ] }, { @@ -172,394 +302,444 @@ ] }, { - "objectID": "pages/Bloque2/intensivo.html", - "href": "pages/Bloque2/intensivo.html", - "title": "Repaso Intensivo JS", + "objectID": "pages/Bloque2/MAclases.html", + "href": "pages/Bloque2/MAclases.html", + "title": "MA: Clases ES6", "section": "", - "text": "Contenido\nRepaso intensivo de JavaScript, tiene como objetivo dar una introducción del lenguaje, a usuarios que ya tengan experiencia previa programando.\nDescargar archivo de código (click derecho guardar enlace como)", + "text": "Contenido\nRepaso intensivo de clases en JavaScript (ES6+), orientado a usuarios con experiencia previa en programación y familiarizados con funciones, objetos y arrays.", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "Repaso Intensivo JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/intensivo.html#variables-y-tipos-básicos", - "href": "pages/Bloque2/intensivo.html#variables-y-tipos-básicos", - "title": "Repaso Intensivo JS", - "section": "Variables y tipos básicos", - "text": "Variables y tipos básicos\n\nDeclaración de variables\nEn JavaScript moderno se utilizan let y const (evitar var).\n\nlet: permite reasignación\nconst: no permite reasignación\nconst NO significa inmutable\nJavaScript es de tipado dinámico\nEl tipo depende del valor, no de la variable\n\nTipos primitivos:\n\nstring\nnumber\nboolean\nnull\nundefined\n\nlet edad = 12; // number\nlet altura = 1.8; // number\nlet nombre = \"Javier\"; // string\nlet casado = false; // boolean\n\nlet ordenador = null; // ausencia intencionada de valor\nlet direccion; // undefined\n\n\nUso de const\nconst dni = \"1235678L\";\ndni = \"23\"; // Error\n\nconst no significa inmutable\nconst dni = \"12345678L\";\ndni = \"87654321X\"; // Error\nPero:\nconst arr = [1, 2, 3];\narr.push(4); // permitido\n\n\n\nTipado dinámico\n\nJavaScript es de tipado dinámico\nEl tipo depende del valor, no de la variable\nUna variable puede cambiar de tipo durante la ejecución\n\nlet x = \"hola\";\nx = 42; // válido\nx = true; // válido\nEste comportamiento se conoce como shadowing o cambio dinámico de tipo. En el ejemplo anterior solo existe una variable X cuyo tipo pasa de Number a boolean", + "objectID": "pages/Bloque2/MAclases.html#programación-orientada-a-objetos-en-javascript", + "href": "pages/Bloque2/MAclases.html#programación-orientada-a-objetos-en-javascript", + "title": "MA: Clases ES6", + "section": "Programación orientada a objetos en JavaScript", + "text": "Programación orientada a objetos en JavaScript\nJavaScript es un lenguaje basado en prototipos, pero desde ES6 introduce la sintaxis class, que:\n\nEs azúcar sintáctico sobre el sistema de prototipos\nFacilita la escritura y lectura de código OO\nNo convierte a JS en un lenguaje basado en clases clásicas", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "Repaso Intensivo JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/intensivo.html#null-vs-undefined", - "href": "pages/Bloque2/intensivo.html#null-vs-undefined", - "title": "Repaso Intensivo JS", - "section": "null vs undefined", - "text": "null vs undefined\n\nundefined: variable declarada pero sin valor\nnull: ausencia intencionada de valor\n\nJavaScript distingue entre:\n\n“todavía no hay valor” y “no hay valor”\n\nconsole.log(ordenador); // null\nconsole.log(direccion); // undefined", + "objectID": "pages/Bloque2/MAclases.html#definición-de-una-clase", + "href": "pages/Bloque2/MAclases.html#definición-de-una-clase", + "title": "MA: Clases ES6", + "section": "Definición de una clase", + "text": "Definición de una clase\n\nSintaxis básica\nclass Persona {\n constructor(nombre, edad) {\n this.nombre = nombre;\n this.edad = edad;\n }\n}\n\nclass: palabra clave\nconstructor: método especial de inicialización\nthis: referencia a la instancia actual", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "Repaso Intensivo JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/intensivo.html#aritmética-y-operadores", - "href": "pages/Bloque2/intensivo.html#aritmética-y-operadores", - "title": "Repaso Intensivo JS", - "section": "Aritmética y operadores", - "text": "Aritmética y operadores\n\nOperadores aritméticos\nlet a = 12, b = 4;\n\na + b\na - b\na * b\na / b\na % b\na = a + b;\na += b;\na -= b;\na *= b;\n\nPotencias\na**b // Power\nIncrementos:\nb--; b++;\n--b; ++b;\n\n\n\nStrings y concatenación\na = \"hola \";\nb = \"mundo\";\na + b;\n\n\nComparación\n\n== compara valor (evitar)\n=== compara valor y tipo (usar)\n\n\n\nOperadores lógicos\n\n&& AND\n|| OR\n! NOT\n\n\n\nComparaciones\n\n== compara solo valor (evitar)\n=== compara valor y tipo (usar siempre, aunque sea innecesario)\n\n5 == \"5\"; // true\n5 === \"5\"; // false\n\n\nOperadores lógicos\n\n&& AND\n|| OR\n! NOT\n\n(a > 0) && (b < 10)", + "objectID": "pages/Bloque2/MAclases.html#creación-de-instancias", + "href": "pages/Bloque2/MAclases.html#creación-de-instancias", + "title": "MA: Clases ES6", + "section": "Creación de instancias", + "text": "Creación de instancias\nconst p1 = new Persona(\"Javier\", 45);\nconst p2 = new Persona(\"Ana\", 32);\n\nnew crea un nuevo objeto\nEjecuta automáticamente constructor", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "Repaso Intensivo JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/intensivo.html#estructuras-de-control", - "href": "pages/Bloque2/intensivo.html#estructuras-de-control", - "title": "Repaso Intensivo JS", - "section": "Estructuras de control", - "text": "Estructuras de control\n\nCondicionales\nif (a === b) {\n\n} else if (a > b) {\n\n} else {\n\n}\n\n\nBucles\n\nwhile\nlet x = 20;\nwhile (x < 50) {\n x += 10;\n}\n\n\nfor\nfor (let i = 0; i < 10; i++) {\n // iteración\n}", + "objectID": "pages/Bloque2/MAclases.html#métodos-de-instancia", + "href": "pages/Bloque2/MAclases.html#métodos-de-instancia", + "title": "MA: Clases ES6", + "section": "Métodos de instancia", + "text": "Métodos de instancia\nLos métodos se definen sin function y se comparten vía prototipo.\nclass Persona {\n constructor(nombre, edad) {\n this.nombre = nombre;\n this.edad = edad;\n }\n\n saludar() {\n return `Hola, soy ${this.nombre}`;\n }\n\n cumple() {\n this.edad++;\n }\n}\nUso:\np1.saludar();\np1.cumple();", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "Repaso Intensivo JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/intensivo.html#funciones", - "href": "pages/Bloque2/intensivo.html#funciones", - "title": "Repaso Intensivo JS", - "section": "Funciones", - "text": "Funciones\n\nEncapsulan lógica reutilizable\nPueden recibir parámetros\nPueden devolver valores\nSon ciudadanos de primera clase\n\n\nFunción clásica\nfunction sumar2(num, num2 = 2) {\n num += num2;\n return num;\n}\nPaso de variables por valor:\nlet a = 7;\nlet b = sumar2(a, a); // 14\na; // 7\n\n\nFunciones flecha y orden superior\nconst concatenarHola = input => input + \" Hola\";\nconcatenarHola(\"sdf\");\nfunction ejecuta(fun) {\n fun();\n}\n\nejecuta(() => { console.log(\"hola\"); });\n\n\nFunciones propias de strings\nlet a = \"jsadfsadf \";\na.trim(); // Suprimir espacios adicionales\na.split('a'); // Divide el string en un array c\na.length;\n\n\nFunciones flecha\nconst cuadrado = n => n ** 2;\nForma extendida:\nconst cuadrado = (n) => {\n return n ** 2;\n};\n\n\nFunciones como ciudadanos de primera clase\nLas funciones pueden:\n\nAsignarse a variables\nPasarse como argumentos\nDevolverse como resultado\n\nfunction ejecutar(f) {\n f();\n}\n\nejecutar(() => console.log(\"Hola\"));", + "objectID": "pages/Bloque2/MAclases.html#métodos-vs-funciones-flecha", + "href": "pages/Bloque2/MAclases.html#métodos-vs-funciones-flecha", + "title": "MA: Clases ES6", + "section": "Métodos vs funciones flecha", + "text": "Métodos vs funciones flecha\nNo usar arrow functions como métodos de clase (salvo casos concretos):\nclass MalEjemplo {\n metodo = () => {\n console.log(this);\n };\n}\n\nRompe el modelo prototípico\nMayor consumo de memoria", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "Repaso Intensivo JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/intensivo.html#arrays-base", - "href": "pages/Bloque2/intensivo.html#arrays-base", - "title": "Repaso Intensivo JS", - "section": "Arrays (base)", - "text": "Arrays (base)\n\nLista ordenada\nÍndices empiezan en 0\nPropiedad length\n\nlet cajon = [8, \"hola\", true, () => { return 7 }];\n\nAcceso\ncajon[0] // 8\ncajon[2] = \"rino\"; // modificamos la entrada 2 \n\n\nAdiciones\ncajon.push(false);\ncajon.unshift(0);\n\n\nEliminaciones\ncajon.pop();\ncajon.shift();\ncajon.length;", + "objectID": "pages/Bloque2/MAclases.html#propiedades-públicas", + "href": "pages/Bloque2/MAclases.html#propiedades-públicas", + "title": "MA: Clases ES6", + "section": "Propiedades públicas", + "text": "Propiedades públicas\nLas propiedades se suelen declarar en el constructor:\nclass Coche {\n constructor(marca, km = 0) {\n this.marca = marca;\n this.km = km;\n }\n}\nUso:\nconst c = new Coche(\"Toyota\");\nc.km += 100;", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "Repaso Intensivo JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/intensivo.html#objetos", - "href": "pages/Bloque2/intensivo.html#objetos", - "title": "Repaso Intensivo JS", - "section": "Objetos", - "text": "Objetos\nUn objeto representa una entidad mediante estructura clave–valor.\nlet gente = { pepe: 7, juanes: 8, andreas: 10, fran: [4, 2] };\n\nModificación\ngente.andreas = 32;\ngente.pepe++;\n\n\nAcceso dinámico\nlet nombre = \"pablo\";\n\ngente.nombre; // undefined\ngente[nombre] = 2; // añade propiedad", + "objectID": "pages/Bloque2/MAclases.html#getters-y-setters", + "href": "pages/Bloque2/MAclases.html#getters-y-setters", + "title": "MA: Clases ES6", + "section": "Getters y setters", + "text": "Getters y setters\nPermiten acceder como propiedades a lógica encapsulada.\nclass Rectangulo {\n constructor(ancho, alto) {\n this.ancho = ancho;\n this.alto = alto;\n }\n\n get area() {\n return this.ancho * this.alto;\n }\n\n set escala(factor) {\n this.ancho *= factor;\n this.alto *= factor;\n }\n}\nUso:\nconst r = new Rectangulo(2, 3);\nr.area; // 6\nr.escala = 2;\nr.area; // 24", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "Repaso Intensivo JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/intensivo.html#referencias-vs-valores", - "href": "pages/Bloque2/intensivo.html#referencias-vs-valores", - "title": "Repaso Intensivo JS", - "section": "Referencias vs valores", - "text": "Referencias vs valores\n\nCopia por valor\nlet a = 5;\nlet b = a;\nb++;\na no cambia.\n\n\nCopia por referencia\nlet e3 = [\"juan\", \"pepe\"];\nlet d = e3;\n\nd.push(\"andrés\");\nAmbas variables apuntan al mismo array.\nconst poblacion = gente;\npoblacion[\"julio\"] = 8;\nLa copia por refencia se aplica a objetos y arrays\nlet x = [\"juan\", \"pepe\"];\nlet y = x;\n\ny.push(\"andrés\"); // Se añade en x e y pues son el mismo objeto\nAmbas variables apuntan al mismo objeto.", + "objectID": "pages/Bloque2/MAclases.html#herencia-extends", + "href": "pages/Bloque2/MAclases.html#herencia-extends", + "title": "MA: Clases ES6", + "section": "Herencia (extends)", + "text": "Herencia (extends)\nJavaScript soporta herencia simple.\nclass Empleado extends Persona {\n constructor(nombre, edad, salario) {\n super(nombre, edad);\n this.salario = salario;\n }\n\n salarioAnual() {\n return this.salario * 12;\n }\n}\n\nextends: herencia\nsuper(): llama al constructor padre (obligatorio)", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "Repaso Intensivo JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/intensivo.html#spread-operator-...", - "href": "pages/Bloque2/intensivo.html#spread-operator-...", - "title": "Repaso Intensivo JS", - "section": "Spread operator (...)", - "text": "Spread operator (...)\n\nExpande arrays u objetos\nPermite copiar y combinar\nCopia superficial\n\n\nArrays\nJavier es añadido a arr2, pero no a arr.\nlet arr = [\"Alice\", \"Bob\", \"Kevin\"];\nlet arr2 = [...arr, \"Javier\"];\n\n\nObjetos\nOcurre lo mismo con los objetos\nconst sociedad = { ...poblacion, julia: 12 };", + "objectID": "pages/Bloque2/MAclases.html#sobrescritura-de-métodos", + "href": "pages/Bloque2/MAclases.html#sobrescritura-de-métodos", + "title": "MA: Clases ES6", + "section": "Sobrescritura de métodos", + "text": "Sobrescritura de métodos\nclass Empleado extends Persona {\n saludar() {\n return `Empleado: ${this.nombre}`;\n }\n}\n\nSi el método existe en la clase hija, sobrescribe al del padre", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "Repaso Intensivo JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/intensivo.html#funciones-de-array-js-moderno", - "href": "pages/Bloque2/intensivo.html#funciones-de-array-js-moderno", - "title": "Repaso Intensivo JS", - "section": "Funciones de array (JS moderno)", - "text": "Funciones de array (JS moderno)\nVamos a trabajar con un ejemplo completo, típico en programación funcional.\n\nDatos de partida\nlet y = [2, 4, 6, 7];\n\n\nFunción cuadrado\nDefinimos una función que, dado un número, devuelve su cuadrado:\nconst cuadrado = n => n ** 2;\nEs equivalente a:\nconst cuadrado = (n) => {\n return n ** 2;\n};\n\n\nmap: transformar elementos\nAplicamos map para obtener un nuevo array con los cuadrados:\nconst y2 = y.map(cuadrado);\nResultado:\n[4, 16, 36, 49]\n\n\nfilter: seleccionar elementos\nDefinimos una función que comprueba si un número es par:\nconst even = n => n % 2 === 0;\nLa usamos con filter:\nconst yEven = y.filter(even);\n\n\nEncadenamiento (estilo declarativo)\nPodemos encadenar ambas operaciones:\ny\n .map(n => n ** 2)\n .filter(n => n % 2 === 0);\n\nEste estilo es declarativo: describimos qué queremos hacer con los datos, no cómo recorrerlos.", + "objectID": "pages/Bloque2/MAclases.html#uso-de-super-en-métodos", + "href": "pages/Bloque2/MAclases.html#uso-de-super-en-métodos", + "title": "MA: Clases ES6", + "section": "Uso de super en métodos", + "text": "Uso de super en métodos\nclass Empleado extends Persona {\n saludar() {\n return super.saludar() + \" (empleado)\";\n }\n}\nPermite reutilizar lógica del padre.", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "Repaso Intensivo JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/ti.html", - "href": "pages/Bloque2/ti.html", - "title": "TI: Ejercicios JS", - "section": "", - "text": "El objetivo de estos ejercicios es repasar aquellas funcionalidades de JavaScript que difieren del resto de lenguajes de programación empirica, por lo que los siguentes ejercicios de DEBEN DE RESOLVER SIN UTILIZAR NINGUNA CONDICIONAL NI NINGÚN BUCLE.\nPrincipalmente trabajarás con:\nDebe de realizar la tarea enun archivo js, para comprobar el resultado debe de ejecutar desde la terminal con node nombreArchivo.js.", + "objectID": "pages/Bloque2/MAclases.html#métodos-estáticos", + "href": "pages/Bloque2/MAclases.html#métodos-estáticos", + "title": "MA: Clases ES6", + "section": "Métodos estáticos", + "text": "Métodos estáticos\nPertenecen a la clase, no a las instancias.\nclass Utilidades {\n static suma(a, b) {\n return a + b;\n }\n}\nUso:\nUtilidades.suma(2, 3);\nNo accesible desde instancias:\nnew Utilidades().suma; // undefined", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TI: Ejercicios JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/ti.html#ejercicio-1", - "href": "pages/Bloque2/ti.html#ejercicio-1", - "title": "TI: Ejercicios JS", - "section": "Ejercicio 1", - "text": "Ejercicio 1\nDefina un array llamado arrOriginal con el siguiente contenido numérico. Este array será el origen de datos para los ejercicios posteriores, salvo que se indique lo contrario.\n3, 4, 2, 4, 4, 5, 12, 24, 3, 23, 232, 2, -3, -9, 2, -23, 200, -23, 12, 43, 4, -32, -32, 0, 23, 23", + "objectID": "pages/Bloque2/MAclases.html#campos-privados", + "href": "pages/Bloque2/MAclases.html#campos-privados", + "title": "MA: Clases ES6", + "section": "Campos privados (#)", + "text": "Campos privados (#)\nIntroducidos en ES2022.\nclass Cuenta {\n #saldo = 0;\n\n ingresar(cantidad) {\n this.#saldo += cantidad;\n }\n\n getSaldo() {\n return this.#saldo;\n }\n}\n\n#saldo es realmente privado\nNo accesible fuera de la clase", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TI: Ejercicios JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/ti.html#ejercicio-2", - "href": "pages/Bloque2/ti.html#ejercicio-2", - "title": "TI: Ejercicios JS", - "section": "Ejercicio 2", - "text": "Ejercicio 2\nPartiendo del array arrOriginal, imprima por pantalla la siguiente frase:\n\n\"En el subsistema de software somos x miembros\"\n\ndonde x debe tomar, sucesivamente, cada uno de los valores de arrOriginal.\nImprima por pantalla el resultado.\n\nSalida esperada (ejemplo):\n\nEn el subsistema de software somos 3 miembros\nEn el subsistema de software somos 4 miembros\nEn el subsistema de software somos 2 miembros", + "objectID": "pages/Bloque2/MAclases.html#clases-y-objetos-literales", + "href": "pages/Bloque2/MAclases.html#clases-y-objetos-literales", + "title": "MA: Clases ES6", + "section": "Clases y objetos literales", + "text": "Clases y objetos literales\nEsto:\nconst a = {\n x: 1,\n inc() { this.x++; }\n};\nEs equivalente conceptualmente a una instancia única.\nUsar class cuando:\n\nHay múltiples instancias\nExiste estado y comportamiento común\nSe necesita herencia o abstracción", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TI: Ejercicios JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/ti.html#ejercicio-3", - "href": "pages/Bloque2/ti.html#ejercicio-3", - "title": "TI: Ejercicios JS", - "section": "Ejercicio 3", - "text": "Ejercicio 3\nPartiendo de arrOriginal, cree un nuevo array llamado arrPositivos que contenga únicamente números positivos.\nUtilice arrPositivos para imprimir por pantalla las frases correspondientes.", + "objectID": "pages/Bloque2/MAclases.html#clases-prototípicas-pre-es6", + "href": "pages/Bloque2/MAclases.html#clases-prototípicas-pre-es6", + "title": "MA: Clases ES6", + "section": "Clases prototípicas (pre-ES6)", + "text": "Clases prototípicas (pre-ES6)\nJavaScript siempre ha sido un lenguaje basado en prototipos. Antes de ES6, la creación de objetos y herencia se realizaba mediante funciones constructoras y el prototipo.\nEn este repaso no entraremos en detalle en este modelo.\nBasta con saber que:\n\nLas clases ES6 no sustituyen al modelo prototípico\nSon una capa de abstracción sobre él\nTodo el comportamiento sigue resolviéndose vía prototipos\n\nPara profundizar:\n\nhttps://developer.mozilla.org/es/docs/Web/JavaScript/Inheritance_and_the_prototype_chain\n\nfunction Persona(nombre) {\nthis.nombre = nombre;\n}\n\nPersona.prototype.saludar = function () {\nreturn this.nombre;\n};\nvs\nclass Persona {\n constructor(nombre) {\n this.nombre = nombre;\n }\n\n saludar() {\n return this.nombre;\n }\n}", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TI: Ejercicios JS" + "MA: Clases ES6" ] }, { - "objectID": "pages/Bloque2/ti.html#ejercicio-4", - "href": "pages/Bloque2/ti.html#ejercicio-4", - "title": "TI: Ejercicios JS", - "section": "Ejercicio 4", - "text": "Ejercicio 4\nPartiendo de arrPositivos, cree un nuevo array llamado arrValidos que cumpla además el siguiente criterio:\n\nEl número máximo de personas es 10\n\nImprima por pantalla las frases correspondientes a arrValidos.", + "objectID": "pages/Bloque2/tia.html", + "href": "pages/Bloque2/tia.html", + "title": "TAI: La objetización de las personas", + "section": "", + "text": "El objetivo de esta tarea es aplicar los conocimientos básicos de programación orientada a objetos en JavaScript, haciendo uso de las clases definidas en ES6. En particular, se evaluará el uso de:\n\nherencia entre clases\nencapsulación mediante propiedades privadas\ngetters y setters usando las palabras clave get y set\nmétodos estáticos\nvalidación de datos\n\nPara ello se definirá una jerarquía de clases que represente un equipo de Hyperloop.", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TI: Ejercicios JS" + "TAI: La objetización de las personas" ] }, { - "objectID": "pages/Bloque2/ti.html#ejercicio-5", - "href": "pages/Bloque2/ti.html#ejercicio-5", - "title": "TI: Ejercicios JS", - "section": "Ejercicio 5", - "text": "Ejercicio 5\nPartiendo nuevamente de arrOriginal, cree un nuevo array llamado arrFiltrado que contenga únicamente aquellos elementos que cumplan todas las siguientes condiciones:\n\nSean positivos\n\nSean pares\n\nSean menores que 100", + "objectID": "pages/Bloque2/tia.html#objetivo-de-la-tarea", + "href": "pages/Bloque2/tia.html#objetivo-de-la-tarea", + "title": "TAI: La objetización de las personas", + "section": "", + "text": "El objetivo de esta tarea es aplicar los conocimientos básicos de programación orientada a objetos en JavaScript, haciendo uso de las clases definidas en ES6. En particular, se evaluará el uso de:\n\nherencia entre clases\nencapsulación mediante propiedades privadas\ngetters y setters usando las palabras clave get y set\nmétodos estáticos\nvalidación de datos\n\nPara ello se definirá una jerarquía de clases que represente un equipo de Hyperloop.", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TI: Ejercicios JS" + "TAI: La objetización de las personas" ] }, { - "objectID": "pages/Bloque2/ti.html#ejercicio-6", - "href": "pages/Bloque2/ti.html#ejercicio-6", - "title": "TI: Ejercicios JS", - "section": "Ejercicio 6", - "text": "Ejercicio 6\nPartiendo de arrFiltrado:\n\nCree un nuevo array llamado arrCubos elevando al cubo cada uno de sus elementos\n\nA partir de arrCubos, cree un nuevo array llamado arrCubosFiltrados que contenga únicamente aquellos valores cuyo resultado termine en 0.", + "objectID": "pages/Bloque2/tia.html#entregar", + "href": "pages/Bloque2/tia.html#entregar", + "title": "TAI: La objetización de las personas", + "section": "Entregar", + "text": "Entregar\nSe debe entregar un único archivo de JavaScript (.js) que contenga la solución completa a la tarea.", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TI: Ejercicios JS" + "TAI: La objetización de las personas" ] }, { - "objectID": "pages/Bloque2/ti.html#ejercicio-7", - "href": "pages/Bloque2/ti.html#ejercicio-7", - "title": "TI: Ejercicios JS", - "section": "Ejercicio 7", - "text": "Ejercicio 7\nPartiendo de arrCubosFiltrados, cree un nuevo array llamado arrFinal añadiendo el valor 21.", + "objectID": "pages/Bloque2/tia.html#realización-de-la-tarea", + "href": "pages/Bloque2/tia.html#realización-de-la-tarea", + "title": "TAI: La objetización de las personas", + "section": "Realización de la tarea", + "text": "Realización de la tarea\nEl archivo JavaScript debe estar claramente dividido en dos partes:\n\nla implementación de clases, donde se definirán todas las clases necesarias\n\nla zona de uso, donde se utilizarán las clases previamente definidas\n\n\nImplementación de clases\nTodas las clases deberán definirse utilizando la sintaxis de clases ES6, haciendo uso correcto de:\n\nclass\nextends\nsuper\npropiedades privadas (usando #)\ngetters y setters (get y set)\nmétodos estáticos\n\n\nClase Person\nDebe contener:\n\npropiedad privada name\npropiedad privada dni\nSe puede obtener tanto el nombre como el DNI, pero solo se puede modificar el nombre\nEl constructor recibirá:\n\nun nombre\nun NÚMERO de DNI\n\nEl constructor deberá calcular automáticamente la letra del DNI siguiendo el algoritmo oficial:\nhttps://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/dni/calculo-del-digito-de-control-del-nif-nie/\nMétodos y accesos:\n\ngetter name\nsetter name\ngetter dni\nmétodo getInfo() que devuelva un string con el nombre y el DNI completo\n\nSi los datos introducidos no son válidos, se lanzará un Error\n\n\n\nClase Member (clase hija de Person)\nRepresenta a un miembro del equipo de Hyperloop.\nDebe contener:\n\npropiedad privada department\npropiedad privada yearsExperience\n\n\nDepartamentos válidos\nLos únicos departamentos permitidos son:\n\n\"Managment\"\n\"Operaciones\"\n\"Avionics\"\n\"Electromagnetics\"\n\"Mechanics\"\n\nNo se permitirá ningún otro valor.\n\n\nRequisitos adicionales\n\nLa propiedad department:\n\nse accederá mediante:\n\ngetter department\nsetter department\n\n\nEl setter validará que el departamento sea válido\nyearsExperience debe ser un número mayor o igual que 0\n\n\n\nMétodo estático obligatorio\nLa clase Member debe incluir el siguiente método estático:\n\nisValidDepartment(department)\n\ndevuelve true si el departamento es válido\ndevuelve false en caso contrario\ndeberá utilizarse tanto en el constructor como en el setter de department\n\n\n\n\nMétodos públicos\n\ngetter yearsExperience\nmétodo getInfo():\n\nsobrescribe el método de Person\nincluye el departamento y los años de experiencia\n\n\n\n\n\nClase Engineer (clase hija de Member)\nRepresenta a un ingeniero del equipo.\nDebe contener:\n\npropiedad privada specialty\nLa especialidad será un string no vacío\n\n\nAccesos y métodos\n\ngetter specialty\nmétodo getInfo():\n\nsobrescribe el método anterior\nincluye la especialidad del ingeniero\n\n\n\n\n\nClase Team\nRepresenta el equipo completo de Hyperloop.\nDebe contener:\n\npropiedad privada members, que será un array de objetos Member\n\n\nMétodos públicos\n\naddMember(member)\n\nsolo permite añadir objetos que sean instancia de Member\n\nremoveMemberByDni(dni)\nlistMembers()\n\nmuestra por consola la información de todos los miembros del equipo\n\ncountMembersByDepartment(department)\n\ndevuelve cuántos miembros pertenecen a un determinado departamento\n\n\n\n\n\n\nZona de uso\nEn la zona de uso del archivo JavaScript se debe:\n\nCrear al menos:\n\n2 objetos Engineer de departamentos distintos\n1 objeto Member que no sea ingeniero\n\nCrear un objeto Team\nAñadir los miembros al equipo\nUtilizar explícitamente:\n\ngetters\nsetters\nel método estático de validación\n\nMostrar por consola:\n\nel listado completo del equipo\nel número de miembros por departamento\n\nProbar al menos un caso incorrecto:\n\npor ejemplo, asignar un departamento no válido\no intentar añadir un objeto que no sea Member\n\nDemostrar que el error se gestiona correctamente", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TI: Ejercicios JS" + "TAI: La objetización de las personas" ] }, { - "objectID": "pages/Bloque2/ti.html#ejercicio-8", - "href": "pages/Bloque2/ti.html#ejercicio-8", - "title": "TI: Ejercicios JS", - "section": "Ejercicio 8", - "text": "Ejercicio 8\nPartiendo de arrFinal, cree un nuevo array independiente llamado arrCopia, de forma que cualquier modificación posterior no afecte a arrFinal.", + "objectID": "pages/Bloque2/tia.html#apéndice-comprobaciones-y-errores-en-javascript-necesario-para-la-tarea", + "href": "pages/Bloque2/tia.html#apéndice-comprobaciones-y-errores-en-javascript-necesario-para-la-tarea", + "title": "TAI: La objetización de las personas", + "section": "Apéndice: comprobaciones y errores en JavaScript (NECESARIO PARA LA TAREA)", + "text": "Apéndice: comprobaciones y errores en JavaScript (NECESARIO PARA LA TAREA)\nEn el desarrollo de la tarea pueden aparecer algunas comprobaciones y mecanismos de control de errores que es necesario saber implementar por cuenta propia. Su inclusión tiene como objetivo facilitar la robustez del código, y forman parte de los contenidos evaluables de la tarea.\n\nUso de Error\nCuando se detecta una situación incorrecta (por ejemplo, un valor no válido o un uso indebido de una clase), se puede lanzar un error utilizando:\nthrow new Error(\"Mensaje de error\");\nEsto indica claramente que algo no es correcto y detiene la ejecución normal del programa.\n\n\nUso de instanceof\nEl operador instanceof se utiliza para comprobar si un objeto ha sido creado a partir de una clase concreta.\nobjeto instanceof Clase\nDevuelve true si el objeto pertenece a esa clase y false en caso contrario.\n\n\nUso de typeof\nEl operador typeof permite comprobar el tipo de datos simples como strings o números.\ntypeof variable\nEjemplos:\ntypeof \"texto\" // \"string\"\ntypeof 10 // \"number\"\nSe utiliza para validar los datos recibidos por constructores o setters. Para comprobar clases u objetos personalizados debe usarse instanceof, no typeof.", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TI: Ejercicios JS" + "TAI: La objetización de las personas" ] }, { - "objectID": "pages/rubric.html", - "href": "pages/rubric.html", - "title": "Rúbrica de evaluación", + "objectID": "pages/Bloque2/jsI.html", + "href": "pages/Bloque2/jsI.html", + "title": "Introducción a JS", "section": "", - "text": "Durante el curso seguiremos la siguiente rúbrica para la calificación de las tareas. A pesar de que las calificaciones no son importantes, la rúbrica es un buen recordatorio de que aspectos hay que tener en cuenta en la programación web.\n\n\n\nPuntuación\n\n\nNo aplica\n\n\nDeficiente(0–4)\n\n\nInsuficiente(4–5)\n\n\nAceptable(5–7)\n\n\nBueno(7–9)\n\n\nExcelente(9–10)\n\n\n\n\nDiseño\n\n\nNo aplica.\n\n\nDiseño desordenado y/o con problemas de visualización funcional.\n\n\nDiseño básico pero con problemas de visualización o estructura.\n\n\nDiseño claro y ordenado, cumple los requisitos básicos.\n\n\nDiseño cuidado, buena estética y estructura clara.\n\n\nDiseño profesional, limpio, pulido y sobresaliente.\n\n\n\n\nProgramación\n\n\nNo aplica.\n\n\nCódigo incompleto o con errores graves.\n\n\nCódigo funcional parcialmente y/o con errores importantes.\n\n\nCódigo funcional y adecuado a la tarea.\n\n\nCódigo bien estructurado con mejoras respecto a lo exigido.\n\n\nCódigo impecable, eficiente y muy bien organizado.\n\n\n\n\nEsfuerzo e implicación\n\n\nNo aplica.\n\n\nBajo esfuerzo o dedicación mínima.\n\n\nEsfuerzo adecuado pero limitado.\n\n\nEsfuerzo notable, cumple con lo requerido.\n\n\nEsfuerzo claro, trabajo más allá de lo solicitado.\n\n\nDedicación sobresaliente y trabajo excepcional.\n\n\n\n\nDocumentación / Claridad\n\n\nNo aplica.\n\n\nDocumentación mínima o inexistente.\n\n\nDocumentación incompleta o confusa.\n\n\nDocumentación clara y suficiente.\n\n\nDocumentación bien presentada y detallada.\n\n\nDocumentación excelente y altamente profesional.\n\n\n\n\nFuncionalidad\n\n\nNo aplica.\n\n\nNo funciona o no cumple objetivos.\n\n\nFunciona de forma parcial.\n\n\nFunciona correctamente.\n\n\nFunciona con mejoras o funcionalidades extra.\n\n\nFunciona perfectamente y supera expectativas.\n\n\n\n\nInnovación\n\n\n(Nota extra)\n\n\n\n\nTOTAL:\n\n\n\n\n/60\n\n\n\n\nObservaciones:\n\n\n\n\n\nLa nota total será sobre 60 si hay algun criterio que no se aplique, se modificará la nota para que esté sobre base 60.", + "text": "Contenido" + }, + { + "objectID": "pages/Bloque2/jsI.html#introducción-a-js", + "href": "pages/Bloque2/jsI.html#introducción-a-js", + "title": "Introducción a JS", + "section": "Introducción a JS", + "text": "Introducción a JS\n\n¿Qué es JavaScript?\n\nEs el lenguaje de programación del navegador.\nCreado en 1995 por Brendan Eich\nPermite crear comportamientos dinámicos: responder a clics, validar formularios, mostrar u ocultar elementos, generar contenido nuevo, etc.\nSe ejecuta directamente en el navegador, sin necesidad de instalación.\nJunto con HTML y CSS forma el trinomio esencial del desarrollo web\n\nLa siguiente tabla recuerda las difrencias entre HTML, CSS y JS:\n\n\n\nCapa\nLenguaje\nFunción principal\n\n\n\n\nContenido\nHTML\nEstructura del documento\n\n\nPresentación\nCSS\nApariencia y diseño\n\n\nComportamiento\nJavaScript\nInteractividad y lógica" + }, + { + "objectID": "pages/Bloque2/jsI.html#programación-en-js", + "href": "pages/Bloque2/jsI.html#programación-en-js", + "title": "Introducción a JS", + "section": "Programación en JS", + "text": "Programación en JS\n\nCaracterísticas generales de JS\n\nTipado dinámico\n\nTipado débil Coerción Implicita\n\nMultiparadigma\n\nÁmbito léxico (estático)\n\nModelo basado en prototipos (polimorfismo de inclusión por composición)\n\nFunciones de primera clase\n\nFunciones de orden superior\n\n\nClosures / Copia viva\nReflexión (Reflect, Proxy, descriptores)\n\nMetaprogramación\nSin Polimorfismo Ad-hoc de sobrecarga, ni Polimorfismo universal genérico\n\n\nEjecución single-threaded\n\nAsincronía no bloqueante\n\nPromises / async–await\n\nGarbage collection\nInteroperabilidad con JSON\n\n\n\nTipos\n\nPrimitivos\n\nstring — cadenas de texto\n\nnumber — números (enteros y decimales)\nboolean — verdadero o falso\n\nnull — ausencia intencional de valor\n\nundefined — valor no inicializado\n\nsymbol\nbigint\n\n\n\nTipos de referencia\n\nObject\n\nArray\n\nFunc tion\n\nMap / Set\n\nDate\n\n\n\n\nCaracterísticas del sistema de tipos\n\nTipado dinámico\n\nTipado débil\n\nLos primitivos se copian por valor\n\nLos objetos se copian por referencia\n\n\n\nVariables\n\nlet\n\nTipado: dinámico\nAlcance: estático\nMutables\nHoisting\nNo globales\nShadowing permitido\n\n\n\nconst\nNo son verdaderamente constantes\n\nTipado: dinámico\nAlcance: estático\nInmutables en la referencia (no permiten reasignación)\nHoisting\nNo globales\nShadowing permitido\n\n\n\nvar\nNo se usa\n\nTipado: dinámico\nAlcance: de función (no de bloque)\nMutables\nHoisting (inicializadas como undefined)\nGlobales si se declaran en el ámbito global (propiedad de window/globalThis)\nShadowing permitido, pero con reglas inconsistentes (puede causar illegal shadowing en combinación con let/const)" + }, + { + "objectID": "pages/Bloque2/jsI-reveal.html#introducción-a-js", + "href": "pages/Bloque2/jsI-reveal.html#introducción-a-js", + "title": "Introducción a JS", + "section": "Introducción a JS", + "text": "Introducción a JS\n¿Qué es JavaScript?\n\nEs el lenguaje de programación del navegador.\nCreado en 1995 por Brendan Eich\nPermite crear comportamientos dinámicos: responder a clics, validar formularios, mostrar u ocultar elementos, generar contenido nuevo, etc.\nSe ejecuta directamente en el navegador, sin necesidad de instalación.\nJunto con HTML y CSS forma el trinomio esencial del desarrollo web\n\nLa siguiente tabla recuerda las difrencias entre HTML, CSS y JS:" + }, + { + "objectID": "pages/Bloque2/jsI-reveal.html#programación-en-js", + "href": "pages/Bloque2/jsI-reveal.html#programación-en-js", + "title": "Introducción a JS", + "section": "Programación en JS", + "text": "Programación en JS\nCaracterísticas generales de JS\n\nTipado dinámico\n\nTipado débil Coerción Implicita\n\nMultiparadigma\n\nÁmbito léxico (estático)\n\nModelo basado en prototipos (polimorfismo de inclusión por composición)\n\nFunciones de primera clase\n\nFunciones de orden superior" + }, + { + "objectID": "pages/Bloque1/t2.html", + "href": "pages/Bloque1/t2.html", + "title": "T2: Web de HL II", + "section": "", + "text": "El objetivo de esta tarea, es poner en práctica lo aprendido en clase para ello vamos a formatear la web de nuestro equipo de Hyperloop, (tarea de la semana pasada).\nSe debe formatear para que quede como está Web, cuanto más se parezca mejor.\nNotas:\nLa hoja de estilos debe de estar incluida en el la etiqueta <style> del <head>.\nPara conseguir que los bordes de la table, td, tr… colapsen (que solo haya un borde y no dos) se debe utilizar la propiedad border-collapse.\nSi no se realizó la T1, puede utilizar este archivo html como base (click derechao guardar enlace como).", "crumbs": [ - "Rúbrica de evaluación" + "Bloque I Introducción", + "Semana 2", + "T2: Web de HL II" ] }, { - "objectID": "pages/Bloque1/entorno.html", - "href": "pages/Bloque1/entorno.html", - "title": "Preparación del entorno de trabajo", + "objectID": "pages/Bloque1/css.html", + "href": "pages/Bloque1/css.html", + "title": "CSS", "section": "", "text": "Contenido", "crumbs": [ "Bloque I Introducción", - "Semana 0", - "Preparación del entorno de trabajo" + "Semana 2", + "CSS" ] }, { - "objectID": "pages/Bloque1/entorno.html#ide", - "href": "pages/Bloque1/entorno.html#ide", - "title": "Preparación del entorno de trabajo", - "section": "IDE", - "text": "IDE\n\n¿Qué es una IDE?\nLas Integrated development environment (IDE) son aplicaciones diseñadas para facilitar la programación a los programadores.\nAunque no hay una lista de características propias de las IDE, suelen tener características comunes, por ejemplo:\n\nDebugger integrado en la interfaz\nGestor de archivos\nEditor de código inteligente: autocompletados\n\n\n\n¿Cuántas IDE existen?\n\nAndroid Studio\nRStudio\nEclipse\n\n\n\n¿Qué IDE utilizaremos nosotros?\nPrincipalmente trabajaremos con VSCode una IDE de proposito general que configuraremos para el desarrollo frontend\n\nInstalación de VScode\n\nEnlace\n\n\nFamiliarizarse con VSCode\n\nBarra lateral:\n\nExplorador de archivos\nMenú de Git\nMenú de extensiones\nBuscar\nDebugger\n\nEditor o área de edición: componente más importante de la IDE, lugar donde se escribe el código.\n\n\n\nExtensiones\nLas extensiones son aplicaciones software desarolladas por empresas o por particulares para modificar o agregar una nueva funcionalidad a las IDE. Pueden ir desde pequeñas modificaciones del tema o de la UI, o incorporar nuevas funcionalidades como la interacción con bases de datos.\n\nLiveServer\nNosotros para el transcurso del curso utilizaremos la extensión Liveserver que nos permitirá desplegar comodamente un pequeño servidor para la programación con HTML (Ahondaremos más la próxima semana)\n\nInstalación de LiveServer\n\n\nEntrar en el menú de extensiones\nBuscar por liveserver\nSeleccionar extensión\nInstalar\n\n\nAl concluir la instalación debería de aparecer en la parte derecha de la barra de estado (barra interior)", + "objectID": "pages/Bloque1/css.html#problemas-de-html", + "href": "pages/Bloque1/css.html#problemas-de-html", + "title": "CSS", + "section": "Problemas de HTML", + "text": "Problemas de HTML\nHasta el momento hemos trabajado con HTML, que a pesar de ser muy práctico para la creación de la estructura interna de la web, presenta ciertas limitaciones a la hora de modificar el formato de la web, para ello se introduce CSS, una herramienta que nos va a permitir modificar el formato cómodamente.", "crumbs": [ "Bloque I Introducción", - "Semana 0", - "Preparación del entorno de trabajo" + "Semana 2", + "CSS" ] }, { - "objectID": "pages/Bloque1/entorno.html#node.js-y-npm", - "href": "pages/Bloque1/entorno.html#node.js-y-npm", - "title": "Preparación del entorno de trabajo", - "section": "Node.JS y NPM", - "text": "Node.JS y NPM\n\n¿Qué es node JS?\nNode.js es un entorno de ejecución de JavaScript basado en el motor V8 de Google Chrome.\nPermite ejecutar código JavaScript directamente en el sistema operativo, sin depender de un navegador.\nDe este modo, el mismo lenguaje puede usarse tanto en el frontend como en el backend.\n\n\n¿Qué es NPM?\nNPM (Node Package Manager) es el gestor de paquetes de Node.js.\nFacilita la instalación, actualización y gestión de librerías que amplían las funcionalidades de los proyectos.\nDescarga node y npm nodejs.org", - "crumbs": [ + "objectID": "pages/Bloque1/css.html#formato-con-css", + "href": "pages/Bloque1/css.html#formato-con-css", + "title": "CSS", + "section": "Formato con CSS", + "text": "Formato con CSS\n\nAtributo style\nSupongamos que tenemos el siguiente elemento\n<p> Hola Mundo<p>. Por ahora el texto se mostrará en color negro, el color predeterminado de HTML para las etiquetas <p>\n\n\nHola mundo\n\n\nSi se desea modificar el formato intrínseco de esta etiqueta <p> debemos incluir la propiedad style que, como su nombre indica nos permitirá modificar su estilo. Dentro de este atributo se ha de insertar propiedad CSS (no confundir con los atributos html). La propiedad CSS especifica que aspecto visual del contenido de la etiqueta. Por ejemplo, si se desea modificar el color de la letra se debe de utilizar la propiedad color (nótese que no lleva u).\n<p style=\"color:red\">Hola Mundo</p>\n\n<!-- Equivalente en Hexadecimal -->\n\n<p style=\"color:#ff0000\">Hola Mundo</p>\n\n\nHola Mundo\n\n\nSí deseamos modificar más de una propiedad CSS deberemos de serparalas dentro de la etiqueta con un punto y coma\n<p style=\"color:#ff0000; font-size: 44px\">Hola Mundo</p>\n\n\nHola Mundo\n\n\n\nProblemas del atributo style\nEl atributo style resulta útil para formatear una etiqueta individualmente, pero resulta tedioso y repetitivo para más de una etiqueta. Observe el siguiente ejemplo\n<p>Autores del culteranismo marcados en rojo<p>\n\n<ul>\n <li>Francisco de Quevedo</li>\n <li style=\"color:red; text-decoration: underline; font-size:30px;\">Luis de Góngora</li>\n <li>Baltasar Gracián</li>\n <li style=\"color:red; text-decoration: underline; font-size:30px;\">Pedro Soto de Rojas</li>\n <li>Tirso de Molina</li>\n <li>Calderón de la Barca</li>\n</ul>\n\n\nAutores del culteranismo marcados en rojo\n\n\n\nFrancisco de Quevedo\n\n\nLuis de Góngora\n\n\nBaltasar Gracián\n\n\nPedro Soto de Rojas\n\n\nTirso de Molina\n\n\nCalderón de la Barca\n\n\n\nProblemas:\n\nRepetición de mucho código\nAlta posibilidad error\nPoca escalabilidad\n\nSi añadimos por ejempo a Luis Carrillo y Sotomayor (autor culteranista) hay que volver a repetir todo el atributo\nSi deseasemos cambiar el color de rojo a verde deberemos modificar cada uno de los atributos\n\n\n\n\n\nClases e ID\n\nClases\nLa solución a este problema son las clases que nos permiten identificar aquellos componentes con características de formato similares. Se agregan como atributos a cada etiqueta\n<p>Autores del culteranismo marcados en rojo<p> <!--En este caso no se marcan en rojo-->\n\n<ul>\n <li>Francisco de Quevedo</li>\n <li class=\"culteranista\">Luis de Góngora</li>\n <li>Baltasar Gracián</li>\n <li class=\"culteranista\">Pedro Soto de Rojas</li>\n <li>Tirso de Molina</li>\n <li>Calderón de la Barca</li>\n</ul>\n\nEtiqueta <style>\nAhora para marcar en rojo los culterantistas se ha de indicar el formato de todos en la class culteranista, para ello nos definiremos una hoja de estilo que será común para todo el documento. La hoja de estilos se define en el <head> de la siguiente forma:\n<head>\n<!-- Fragemento HTML -->\n<style>\n /*Fragmento CSS*/\n .culteranistas{ /*Nótese el punto*/\n color: red;\n text-size: 40px;\n background-color: blue;\n text-decoration: underline; /*Este último ';' no es obligatorio como tal, pero es recomendable, en HTML3 y CSS2 daba error si se incluía*/\n }\n</style> \n<!--Fin de la etiqueta Style, seguimos con html-->\n</head>\nAhora se visualizará correctamente, además se añadirá el fondo azul\n\n\nComposición de clases\nSuponga que tenemos dos clases, una primera clase que modifica el tipo de letra a monospace que aplicaremos a los autores culteranistas y una segunda que modifica el grosor de la letra que se aplicará sobre los autores de lírica.\n<head><style>\n .culteranista {\n font-family: monospace;\n }\n .lirica {\n font-weight: bold;\n }\n .autores {\n list-style: square;\n }\n</style></head>\n\n<body>\n <ul class=\"autores\">\n <li class=\"lirica\">Fray Luis de León</li>\n <li class=\"culteranista\">Hortensio Félix de Paravicino</li>\n <li class=\"culteranista lirica\">Lope de Vega</li>\n <li class=\"lirica\">San Juan de la Cruz</li>\n </ul>\n</body>\n\n\n\nFray Luis de León\n\n\nHortensio Félix de Paravicino\n\n\nLope de Vega\n\n\nSan Juan de la Cruz\n\n\n\n\n\n\nID\nLos ID son como las clases pero solo se pueden utlizar una vez por sitio web. Es útil para cosas que no se deben repetir más de una vez por sitio web.\n<style>\n#principal{\n text-align: center\n color:blue\n}\n</style>\n<!--[...]-->\n<div id=\"principal\">\n <h4>Teatro Romántico></h4>\n <p>El retablo romántico se caracteriza por exaltar la libertad creadora,\n la expresión intensa de los sentimientos individuales, el gusto por lo\n misterioso y lo sublime, y la reivindicación de la imaginación frente a\n las reglas clásicas.</p>\n</div>\n\n\nTeatro Romántico\n\n\nEl retablo romántico se caracteriza por exaltar la libertad creadora, la expresión intensa de los sentimientos individuales, el gusto por lo misterioso y lo sublime, y la reivindicación de la imaginación frente a las reglas clásicas.\n\n\n\n\n\nPropiedades CSS\n\nborder y border-radius\nLa propiedad border es una propiedad abreviada (shorthand) que en realidad combina tres propiedades más pequeñas:\n\nborder-width → grosor del borde\n\nborder-style → estilo del borde (solid, dashed, dotted, etc.)\n\nborder-color → color del borde\n\nPor ejemplo, estas dos definiciones son equivalentes:\n/* Forma abreviada */\n.caja {\n border: 2px solid red;\n}\n\n/* Forma “desdoblada” en 3 mini propiedades */\n.caja-desdoblada {\n border-width: 2px;\n border-style: solid;\n border-color: red;\n}\n Lope de Vega\n\n\nborder-top, border-right, border-bottom, border-left\nCSS permite aplicar bordes distintos en cada lado. Cada uno funciona igual que border pero aplicado a un solo lado:\nborder-top\nborder-right\nborder-bottom\nborder-left\n.caja-bordes {\n border-top: 3px solid red;\n border-right: 2px dashed blue;\n border-bottom: 4px dotted green;\n border-left: 5px double orange;\n}\nTambién pueden desdoblarse:\n.caja-top-desdoblado {\n border-top-width: 4px;\n border-top-style: solid;\n border-top-color: purple;\n}\n\n\nmargin y padding\nLas propiedades margin y padding controlan el espacio alrededor de los elementos, pero cada una actúa en una zona distinta:\n\nmargin → espacio externo, fuera del borde del elemento\n\npadding → espacio interno, entre el contenido y el borde\n\nVisualmente:\n\n\n \n\n\n\n CONTENT\n\n\n\n\n<div style=\"background:#f0f0f0; padding:20px;\">\n <!-- MARGIN (gris claro alrededor del borde) -->\n <!-- BORDER -->\n <div style=\"border:3px solid black\">\n <!-- PADDING (espacio interno) -->\n <div style=\"background:#d0ffd0; padding:15px;\">\n <!-- CONTENT -->\n <span style=\"background-color:white\">CONTENT</span>\n </div>\n </div>\n</div>\n\nRegla Trouble\nCuando margin o padding usan 4 valores, el orden siempre es el mismo:\ntop, right, bottom, left\nPara recordarlo fácilmente se utiliza la regla mnemotécnica Trouble:\n\nT → Top (arriba)\n\nR → Right (derecha)\n\nB → Bottom (abajo)\n\nL → Left (izquierda)\n\nEs decir:\nmargin: top right bottom left;\npadding: top right bottom left;\n\n\n\n\n\n\nTipTruco para los ingenieros: La regla de la mano derecha\n\n\n\nEl orden de los margin y de los padding siempre es en sentido horario.\nPor lo que podemos utilizar la regla de la mano derecha de la inducción electro magnética asumiendo que el vector intensidad apunta hacia la pantalla\n\n\n\n\n\n\nArchivos externos CSS\nIncluir en la cabecerá el CSS presenta ventajas como tener la página web en un único archivo. Sin embargo en la práctica normalmente trabajaremos con más de 2 archivos por lo que incluir uno más o uno menos no marca la diferencia. Por lo que podemos separar el css en un archivo externo .css. De esta forma podremos reutilizar las hojas de estilos.\n<head>\n <title>Mi Página</title>\n <link rel=\"stylesheet\" href=\"styles.css\">\n</head>", + "crumbs": [ "Bloque I Introducción", - "Semana 0", - "Preparación del entorno de trabajo" + "Semana 2", + "CSS" ] }, { - "objectID": "pages/Bloque1/entorno.html#git-y-github", - "href": "pages/Bloque1/entorno.html#git-y-github", - "title": "Preparación del entorno de trabajo", - "section": "Git y GitHub", - "text": "Git y GitHub\n\n¿Qué es Git?\nGit es un sistema de control de versiones distribuido. Permite registrar los cambios de un proyecto, volver a versiones anteriores y trabajar de forma colaborativa sin sobrescribir el trabajo de otros. Cada usuario dispone de una copia completa del repositorio, lo que facilita el trabajo sin conexión.\n\n\n¿Qué es GitHub?\nGitHub es una plataforma en la nube que utiliza Git para almacenar y gestionar proyectos. Permite compartir código, colaborar con otros desarrolladores y mantener un control de versiones centralizado.\n\n\nGit frente GitHub\n\nGit es la herramienta de control de versiones.(Software Libre, Linux Fundation)\nGitHub es la plataforma online donde se alojan los repositorios y se facilita el trabajo en equipo. (Coporativa Microsoft)\n\n\n\nUso de Git y GitHub\nEn Hyperloop UPV, tanto en los subsistemas de Software y Firmware utilizamos GitHub como herramienta de gestión de código.\nNosotros en el TC, también trataremos de facilitarnos con esta herramienta\n\n\nInstalación de Git y Cuenta de GitHub\n\nInstalación de Git\nCuenta de GitHub\n\n\n\nDiagrama de trabajo de Git\n\n\nGit en VScode", + "objectID": "pages/Bloque1/css.html#etiqueta-meta", + "href": "pages/Bloque1/css.html#etiqueta-meta", + "title": "CSS", + "section": "Etiqueta ", + "text": "Etiqueta <meta>\nLas etiquetas <meta> en HTML sirven para proporcionar metadatos sobre la página web. Estos metadatos no se muestran al usuario, pero son importantes para navegadores, buscadores, redes sociales y dispositivos.\n<head>\n <meta charset=\"UTF-8\"> <!-- Selecciona el conjunto de caracteres -->\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> <!-- \"Hace la web Responsive\" -->\n <title>Mi Página</title>\n <link rel=\"stylesheet\" href=\"styles.css\">\n</head>", "crumbs": [ "Bloque I Introducción", - "Semana 0", - "Preparación del entorno de trabajo" + "Semana 2", + "CSS" ] }, { - "objectID": "pages/Bloque1/entorno-reveal.html#ide", - "href": "pages/Bloque1/entorno-reveal.html#ide", - "title": "Preparación del entorno de trabajo", - "section": "IDE", - "text": "IDE\n¿Qué es una IDE?\nLas Integrated development environment (IDE) son aplicaciones diseñadas para facilitar la programación a los programadores.\nAunque no hay una lista de características propias de las IDE, suelen tener características comunes, por ejemplo:\n\nDebugger integrado en la interfaz\nGestor de archivos\nEditor de código inteligente: autocompletados" + "objectID": "pages/Bloque1/css.html#git-github", + "href": "pages/Bloque1/css.html#git-github", + "title": "CSS", + "section": "Git & GitHub:", + "text": "Git & GitHub:\nLos comandos de git nos permiten utilizar la cli para gestionar nuestro repositorio\ngit init # Incializa repositorio (= crear repo con GitHub)\ngit clone <url-repo> \n\ngit add <files> # Añade los archivos a la stagging area\ngit commit -m \"<mensaje de commit>\" # commit\n\ngit push # push\ngit pull # pull\n\ngit status # estado actual del repo\ngit log # historia reciente del log con poco detalle de profundidad\n\ngit diff <file> # muestra la diferencia entre la versión modificada ente un archivo y otro", + "crumbs": [ + "Bloque I Introducción", + "Semana 2", + "CSS" + ] }, { - "objectID": "pages/Bloque1/entorno-reveal.html#node.js-y-npm", - "href": "pages/Bloque1/entorno-reveal.html#node.js-y-npm", - "title": "Preparación del entorno de trabajo", - "section": "Node.JS y NPM", - "text": "Node.JS y NPM\n¿Qué es node JS?\nNode.js es un entorno de ejecución de JavaScript basado en el motor V8 de Google Chrome.\nPermite ejecutar código JavaScript directamente en el sistema operativo, sin depender de un navegador.\nDe este modo, el mismo lenguaje puede usarse tanto en el frontend como en el backend." + "objectID": "pages/Bloque1/css_p.html#problemas-de-html", + "href": "pages/Bloque1/css_p.html#problemas-de-html", + "title": "CSS", + "section": "Problemas de HTML", + "text": "Problemas de HTML\nHasta el momento hemos trabajado con HTML, que a pesar de ser muy práctico para la creación de la estructura interna de la web, presenta ciertas limitaciones a la hora de modificar el formato de la web, para ello se introduce CSS, una herramienta que nos va a permitir modificar el formato cómodamente." }, { - "objectID": "pages/Bloque1/entorno-reveal.html#git-y-github", - "href": "pages/Bloque1/entorno-reveal.html#git-y-github", - "title": "Preparación del entorno de trabajo", - "section": "Git y GitHub", - "text": "Git y GitHub\n¿Qué es Git?\nGit es un sistema de control de versiones distribuido. Permite registrar los cambios de un proyecto, volver a versiones anteriores y trabajar de forma colaborativa sin sobrescribir el trabajo de otros. Cada usuario dispone de una copia completa del repositorio, lo que facilita el trabajo sin conexión." + "objectID": "pages/Bloque1/css_p.html#formato-con-css", + "href": "pages/Bloque1/css_p.html#formato-con-css", + "title": "CSS", + "section": "Formato con CSS", + "text": "Formato con CSS\nAtributo style\nSupongamos que tenemos el siguiente elemento\n<p> Hola Mundo<p>. Por ahora el texto se mostrará en color negro, el color predeterminado de HTML para las etiquetas <p>\n\n\nHola mundo" }, { - "objectID": "pages/Bloque1/MAhtml2.html", - "href": "pages/Bloque1/MAhtml2.html", - "title": "MA: Mas HTML", + "objectID": "pages/Bloque1/css_p.html#etiqueta-meta", + "href": "pages/Bloque1/css_p.html#etiqueta-meta", + "title": "CSS", + "section": "Etiqueta ", + "text": "Etiqueta <meta>\nLas etiquetas <meta> en HTML sirven para proporcionar metadatos sobre la página web. Estos metadatos no se muestran al usuario, pero son importantes para navegadores, buscadores, redes sociales y dispositivos.\n<head>\n <meta charset=\"UTF-8\"> <!-- Selecciona el conjunto de caracteres -->\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> <!-- \"Hace la web Responsive\" -->\n <title>Mi Página</title>\n <link rel=\"stylesheet\" href=\"styles.css\">\n</head>" + }, + { + "objectID": "pages/Bloque1/css_p.html#git-github", + "href": "pages/Bloque1/css_p.html#git-github", + "title": "CSS", + "section": "Git & GitHub:", + "text": "Git & GitHub:\nLos comandos de git nos permiten utilizar la cli para gestionar nuestro repositorio\ngit init # Incializa repositorio (= crear repo con GitHub)\ngit clone <url-repo> \n\ngit add <files> # Añade los archivos a la stagging area\ngit commit -m \"<mensaje de commit>\" # commit\n\ngit push # push\ngit pull # pull\n\ngit status # estado actual del repo\ngit log # historia reciente del log con poco detalle de profundidad\n\ngit diff <file> # muestra la diferencia entre la versión modificada ente un archivo y otro" + }, + { + "objectID": "pages/Bloque1/MAcss.html", + "href": "pages/Bloque1/MAcss.html", + "title": "MA: Selectores y Pseudoselectores", "section": "", - "text": "Durante la explicación de teoría vista esta semana en clase nos hemos introducido en las etiquetas básicas de HTML.\nA continuación una selección de etiquetas que no hemos visto en clase, pero resulta interesante conocer, puesto que en determinadas ocasiones son útiles. Cada ítem de la lista es un enlace a la documentación de Mozilla donde está explicado el funcionamiento de la etiqueta de forma exhaustiva. No hay que conocer todos los aspectos de cada etiqueta, basta con tener una idea general de como funcionan.\n\ninput types. Muy importante conocer todos los tipos de inputs\ncode\niframe. Útil y ampliamente extendida\nhr. Línea horizontal\nfigure y figcaption. Permite insertar figura y pie de figura.\naudio. Insertar un audio en la página web.\nvideo. Insertar un audio en la página web.\nheader, main, footer. Son como <div> pero ya con usos por defecto preasignados.", + "text": "Además del id y las class, existen más selectores que son ampliamente utilizados en la programación web. El siguiente video los explica muy detallados y sirve como repaso para lo que se ha visto esta semana de CSS. El vídeo está en Inglés y dura 20 minutos.", "crumbs": [ "Bloque I Introducción", - "Semana 1", - "MA: Mas HTML" + "Semana 2", + "MA: Selectores y Pseudoselectores" ] }, { - "objectID": "pages/Bloque1/t1.html", - "href": "pages/Bloque1/t1.html", - "title": "T1: Web de HL I", + "objectID": "pages/Bloque1/t1a.html", + "href": "pages/Bloque1/t1a.html", + "title": "TA1: Mi CV I", "section": "", - "text": "La primera tarea de esta semana consiste en diseñar una página web para el equipo de generación espontánea llamado Hyperloop UPV, la web debe de ser realizada en un archivo HTML y debe de constar por lo menos de los siguientes apartados y estructura\n\nTítulo principal de la página <h1>\nVarios secciones cada una introducida por un título <h2> (si es necesario hacer <h3>)\n\nDescripción del equipo\nLista desordenada de los subsistemas\nLista de Partners por orden de importancia (UPV, )\nUn día en Hyperloop (nótese el título del apartado en cursiva)\n\nBreve descripción de lo que hacemos en el equipo, alguna foto\n\nMiembros\n\nUna tabla de miembros por subsistema (inventarse los datos)\n\nFormulario para solicitar unirse al equipo que solicite\n\nNombre\nApellido\nCurso (radius button)\nBotón de enviar\n\nLink a la web del TC de SW y a la oficial del equipo\n\nCada sección debe de estar contenido en un div de la siguiente forma\n\n<div>\n\n <h2>Títlo de sección</h2>\n\n <Contenido de la sección />\n\n</div>\nBase: Web", + "text": "A día de hoy es muy importante tener una imagen digital, por ello la tarea extra consite en crearte tu propia página web básica usando html.\nPuedes usar el CV de Antonio Machado como referencia.\nBase: Ejemplo", "crumbs": [ "Bloque I Introducción", "Semana 1", - "T1: Web de HL I" + "TA1: Mi CV I" ] }, { - "objectID": "pages/Bloque1/html.html", - "href": "pages/Bloque1/html.html", - "title": "HTML", + "objectID": "pages/Bloque1/bloque1.html", + "href": "pages/Bloque1/bloque1.html", + "title": "Bloque I Introducción", "section": "", - "text": "Contenido", + "text": "El objetivo del bloque 1 es sentar la base para la realización del curso, aprendiendo las competencias mínimas para realizar el curso.\nEn este bloque se hará una introducción: las herramientas de trabajo, el lenguaje de marcado HTML que permite crear páginas web estáticas y el lenguaje de programación de CSS que nos permite formatear webs previamente construidas.\nEste bloque se compone de 3 semanas, 2 tareas de clase y dos tareas voluntarias.", "crumbs": [ - "Bloque I Introducción", - "Semana 1", - "HTML" + "Bloque I Introducción" ] }, { - "objectID": "pages/Bloque1/html.html#estructura-básica-de-las-páginas-web", - "href": "pages/Bloque1/html.html#estructura-básica-de-las-páginas-web", - "title": "HTML", - "section": "Estructura básica de las páginas web", - "text": "Estructura básica de las páginas web\n\n¿Qué es una página web?\nUna página web es un documento digital accesible desde un navegador, compuesto por HTML, CSS y, cuando es necesario, JavaScript. Representa la unidad básica de contenido o interacción dentro de un sitio web y puede integrar tanto información estática como elementos dinámicos.\n\n\n¿Qué partes tiene una página web? (externas)", + "objectID": "pages/Bloque1/bloque1.html#contenido", + "href": "pages/Bloque1/bloque1.html#contenido", + "title": "Bloque I Introducción", + "section": "Contenido", + "text": "Contenido\n\n\n\n\n\n\n\n\n\n\n\n\nSemana\nFecha\nContenido\nContenido de la clase\nTarea Clase\nMaterial Extra\nTarea Extra\n\n\n\n\n0\n21/11/2025\nIntroducción\nPresentación TC, VSCode, Git, LiveShare y GitHub\n-\n-\n-\n\n\n1\n28/11/2025\nHTML\nEstructura básica, links, listas, tablas, form, img, div, span\nWeb HL I\nEtiquetas: HTML5, video, iframe\nMi porfolio I\n\n\n2\n05/12/2025\nCSS\nEstilos básicos, clases, id, archivos externos\nWeb HL II\nSelectores y Pseudoclases\nMi porfolio II", "crumbs": [ - "Bloque I Introducción", - "Semana 1", - "HTML" + "Bloque I Introducción" ] }, { - "objectID": "pages/Bloque1/html.html#html5", - "href": "pages/Bloque1/html.html#html5", - "title": "HTML", - "section": "HTML5", - "text": "HTML5\n\n¿Qué es HTML?\nHTML es un lenguaje de marcas que permite definir la estructura y el contenido de un documento para la web. Mediante un conjunto de etiquetas, el desarrollador describe elementos como textos, imágenes, enlaces o formularios, indicando su función dentro de la página. Es la base sobre la que posteriormente se aplican estilos (CSS) y comportamientos dinámicos (JavaScript).\n\n\nEstructura básica\n<!DOCTYPE html>\n<html>\n<head>\n\n</head>\n\n<body>\n\n <p>Clase 1 del TC</p>\n \n</body>\n</html>\nEn el código aparecen varias etiquetas HTML, y cada una tiene una etiqueta de apertura y una etiqueta de cierre (por ejemplo, <p> y </p>).\nEstas etiquetas delimitan y organizan el contenido del documento:\n- <head> agrupa la información del documento,\n- <body> contiene lo que verá el usuario,\n- <p> define un párrafo.\nLa función de las etiquetas es indicar al navegador qué es cada parte del documento y cómo debe interpretarla.\n\n\nHead\nSe corresponde con la cabecera de la pestaña, principalmente solo se modifica el logotipo y el contenido de esta.\nTambién se utiliza para almacenar los metadatos de la web, así como scripts de JavaScript y hojas de estilo de CSS.\n<!DOCTYPE html>\n<html>\n<head>\n\n <title> Web del TC </title>\n\n</head>\n\n<body>\n\n <p>Clase 1 del TC</p>\n \n</body>\n</html>\n\n\nBody\nSe corresponde con todo el contenido de la página dentro podemos utilizar multitud de etiquetas, acontinuación expondremos las más importantes.\nHasta el momento hemos trabajado únicamente con etiquietas invividuales, pero pronto veremos como podemos juntar varias etiquetas simples para obtener estructuras más complejas como tablas o formularios.\nTodo el código mostrado a partir de ahora se asume que esta correctamente ubicado dentro de una etiqueta body\n\n<p> Paragraph\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n<p>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n</p>\n\n\n<br> Break Line\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation\nullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n<p>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n <br></br>\n ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n</p>\n\n\n<ul> Unordered list\n\nFrancisco de Quevedo\nLope de Vega\nGóngora\n\n<ul>\n <li>Francisco de Quevedo</li>\n <li>Lope de Vega</li>\n <li>Góngora</li>\n</ul>\n\n\n<ol> Ordered list\n\nRecepción\nDiscurso del Rector\nDespedida\n\n<ol>\n <li>Recepción </li>\n <li>Discruso del Rector</li>\n <li>Despedida</li>\n</ol>\n\n\n<h#> Headings\n<h1>Título 1</h1>\n<h2>Título 2</h2>\n<h3>Título 3</h3>\n<h4>Título 4</h4>\n<h5>Título 5</h5>\n<h6>Título 6</h6>\n\n\n<div> Divisor y <span> Span\nEtiquetas contenedores, utilizadas para agrupar otras etiquetas, no presentan ningún efecto visible intrínsico, salvo que tras utilizar <div> se produce un salto de línea. Por lo que utilizaremos <div> para agrupar grandes grupos de etiquetas y <span> para fragementos más pequeños\n\n<div>\n<div>\n <h2>Capítulo 2 </h2>\n <p>\n Mio Cid Ruy Díaz por Burgos entró,<br></br>\n en su conpaña sessaenta pendones.<br></br>\n Exiénlo ver mugieres e varones,<br></br>\n burgeses e burgesas por las finiestras son,<br></br>\n plorando de los ojos, tanto avién el dolor,<br></br>\n de las sus bocas todos dizían una razón:<br></br>\n — ¡Dios, qué buen vassallo, si oviesse buen señor!—\n </p>\n</div>\n\n\n\n<strong> Strong, <i> Italic\nNegrita Itálica Negrita e Itálica\n<strong>Negrita</strong>\n<i>Itálica</i>\n<strong><i> Negrita e Itálica</i></strong>\n\n\nComentario\nEtiqueta invisible\n<p>Etiqueta invisible</p>\n\n<!-- Soy un comenario -->\n\n\nTablas\n\n\n\n\nProducto\n\n\nCantidad\n\n\nPrecio (€)\n\n\n\n\n\n\nManzanas\n\n\n10\n\n\n3,50\n\n\n\n\nNaranjas\n\n\n8\n\n\n4,00\n\n\n\n\nPlátanos\n\n\n6\n\n\n2,80\n\n\n\n\n\n\nTotal\n\n\n24\n\n\n10,30\n\n\n\n\n<table>\n <thead>\n <tr>\n <th>Producto</th>\n <th>Cantidad</th>\n <th>Precio (€)</th>\n </tr>\n </thead>\n\n <tbody>\n <tr>\n <td>Manzanas</td>\n <td>10</td>\n <td>3,50</td>\n </tr>\n <tr>\n <td>Naranjas</td>\n <td>8</td>\n <td>4,00</td>\n </tr>\n <tr>\n <td>Plátanos</td>\n <td>6</td>\n <td>2,80</td>\n </tr>\n </tbody>\n\n <tfoot>\n <tr>\n <td>Total</td>\n <td>24</td>\n <td>10,30</td>\n </tr>\n </tfoot>\n</table>\n\n\n<a> Link\nHyperloopUPV\n<!-- ¿Qué pasa con la URL -->\n<a>Hyperloop UPV</a>\n\nPropiedades HTML\nLas etiquetas o elementos html disponen de atributos que nos permiten modificar su comportamiento interno.\nEn el caso de las etiquetas <a> debemos de especificar en los atributos la referncia en cuestión\n <a href=\"https://hyperloopupv.com/\"> HyperloopUPV </a>\n\n\n\n<img> Image\n\n\n\n“Plaza de la Reina”\n\n\n<img src=\"../pr.jpg\" alt=\"Plaza con una fuente en el centro alrdedor casetas y fincas\">\n\n\n<form> Forms\nAmpliamente utilizados en HTML, trabajan sobre la etiqueta <input> la cual tiene muchos tipos.\n\n<input type=\"text\">\n\nNombre: \n\n<form>\n\n <label for=\"first-name\">Nombre:</label>\n\n <input type=\"text\" name=\"first-name\"/>\n</form>\n\n\n<input type=\"number\">\n\nEdad: \n\n<form>\n\n <label for=\"age\">Edad:</label>\n\n <input type=\"number\" name=\"age\" />\n</form>\n\n\n<input type=\"radio\">\n\nSubsistema: Software Firmware \n\n<form>\n\n <label for=\"sub\">Subsistema: </label><br />\n <input type=\"radio\" name=\"sub\" value=\"software\" /> Software <br />\n <input type=\"radio\" name=\"sub\" value=\"firmware\" /> Firmware <br />\n\n</form>\n\n\n<input type=\"submit\">\n\nNombre: \n\n\n<form>\n\n <label for=\"first-name\">Nombre:</label>\n <input type=\"text\" name=\"first-name\"/>\n\n <br/>\n\n <input type=\"submit\"/>\n</form>\n\n\n\n<button> Button\nPor ahora no los utilizaremos, pero es importante saber que existen\n\nSuscribirse\n\n<button>Suscribirse</button>", + "objectID": "pages/Bloque1/bloque1.html#material", + "href": "pages/Bloque1/bloque1.html#material", + "title": "Bloque I Introducción", + "section": "Material", + "text": "Material\n\nMDN (Mozilla Developer Network), HTML y CSS\nW3Schools HTML y CSS\nVisual Studio Code Manual VSCode\nCSS tricks CSS Avanzado", "crumbs": [ - "Bloque I Introducción", - "Semana 1", - "HTML" + "Bloque I Introducción" ] }, { - "objectID": "pages/Bloque1/html.html#primer-repo-de-git", - "href": "pages/Bloque1/html.html#primer-repo-de-git", - "title": "HTML", - "section": "Primer repo de Git", - "text": "Primer repo de Git\n\nIniciar sesión en cuenta de GitHub\nBarra superior derecha, Símbolo + > New Repo\nRepository Name\nDescription of the repo\nVisibility\nAdd README\nCrear repositorio\n\n\n\nDesde la ventana del repositorio creado\nCode <> > Clone > HTTPS > Copiar URL\nDesde VScode\nClonar repositorio (si no aparece F1, paleta de comandos Clonar Repositorio)\nPegar la URL del repo\nPresionar intro (equivalente a git clone)\n\n\n\nRealizar cambios\nDesde la barra derecha seleccionar menú de Git (3 nodos interconectados por dos aristas)\nAgregar presionando el + los archivos a la staging area (equivalente a git add <file>)\nEscribir mensaje de commit y presionar botón de confirmación (equivalente a git commit)\n\n\nUna vez se hayan realizados todos los commits deseados presionar la rueda de sincronización en la barra de estado. Este último cambio es equivalente a ejecutar git pull y git push.\npush sube los cambios al repositorio remoto pull actualiza los cambios de repositorio remoto por el local", + "objectID": "pages/Bloque1/t2a.html", + "href": "pages/Bloque1/t2a.html", + "title": "TA2: Mi CV II", + "section": "", + "text": "En la tarea previa definimos nuestra identidad digital, ahora es un buen momento dándole un toque personal con ayuda de CSS.\nSi no se realizó la T1A puede utilizar el CV de Antonio Machado como base sobre la que trabajar. (Click derecho guadrar enlace como)\nImportante: la hoja de estilos debe ser definida como un archivo externo.\nEl objetivo de esta tarea es evaluar, las habilidades de diseño y de investigación, por lo que no hay ningún ejemplo al que imitar. Siguiendo ese objetivo se le recomienda al alumno que investigue y descubrá el máximo número de propiedades CSS.", "crumbs": [ "Bloque I Introducción", - "Semana 1", - "HTML" + "Semana 2", + "TA2: Mi CV II" ] }, { @@ -584,444 +764,520 @@ "text": "Primer repo de Git\n\nIniciar sesión en cuenta de GitHub\nBarra superior derecha, Símbolo + > New Repo\nRepository Name\nDescription of the repo\nVisibility\nAdd README\nCrear repositorio" }, { - "objectID": "pages/Bloque1/t2a.html", - "href": "pages/Bloque1/t2a.html", - "title": "TA2: Mi CV II", + "objectID": "pages/Bloque1/html.html", + "href": "pages/Bloque1/html.html", + "title": "HTML", "section": "", - "text": "En la tarea previa definimos nuestra identidad digital, ahora es un buen momento dándole un toque personal con ayuda de CSS.\nSi no se realizó la T1A puede utilizar el CV de Antonio Machado como base sobre la que trabajar. (Click derecho guadrar enlace como)\nImportante: la hoja de estilos debe ser definida como un archivo externo.\nEl objetivo de esta tarea es evaluar, las habilidades de diseño y de investigación, por lo que no hay ningún ejemplo al que imitar. Siguiendo ese objetivo se le recomienda al alumno que investigue y descubrá el máximo número de propiedades CSS.", + "text": "Contenido", "crumbs": [ "Bloque I Introducción", - "Semana 2", - "TA2: Mi CV II" + "Semana 1", + "HTML" ] }, { - "objectID": "pages/Bloque1/bloque1.html", - "href": "pages/Bloque1/bloque1.html", - "title": "Bloque I Introducción", - "section": "", - "text": "El objetivo del bloque 1 es sentar la base para la realización del curso, aprendiendo las competencias mínimas para realizar el curso.\nEn este bloque se hará una introducción: las herramientas de trabajo, el lenguaje de marcado HTML que permite crear páginas web estáticas y el lenguaje de programación de CSS que nos permite formatear webs previamente construidas.\nEste bloque se compone de 3 semanas, 2 tareas de clase y dos tareas voluntarias.", + "objectID": "pages/Bloque1/html.html#estructura-básica-de-las-páginas-web", + "href": "pages/Bloque1/html.html#estructura-básica-de-las-páginas-web", + "title": "HTML", + "section": "Estructura básica de las páginas web", + "text": "Estructura básica de las páginas web\n\n¿Qué es una página web?\nUna página web es un documento digital accesible desde un navegador, compuesto por HTML, CSS y, cuando es necesario, JavaScript. Representa la unidad básica de contenido o interacción dentro de un sitio web y puede integrar tanto información estática como elementos dinámicos.\n\n\n¿Qué partes tiene una página web? (externas)", "crumbs": [ - "Bloque I Introducción" + "Bloque I Introducción", + "Semana 1", + "HTML" ] }, { - "objectID": "pages/Bloque1/bloque1.html#contenido", - "href": "pages/Bloque1/bloque1.html#contenido", - "title": "Bloque I Introducción", - "section": "Contenido", - "text": "Contenido\n\n\n\n\n\n\n\n\n\n\n\n\nSemana\nFecha\nContenido\nContenido de la clase\nTarea Clase\nMaterial Extra\nTarea Extra\n\n\n\n\n0\n21/11/2025\nIntroducción\nPresentación TC, VSCode, Git, LiveShare y GitHub\n-\n-\n-\n\n\n1\n28/11/2025\nHTML\nEstructura básica, links, listas, tablas, form, img, div, span\nWeb HL I\nEtiquetas: HTML5, video, iframe\nMi porfolio I\n\n\n2\n05/12/2025\nCSS\nEstilos básicos, clases, id, archivos externos\nWeb HL II\nSelectores y Pseudoclases\nMi porfolio II", + "objectID": "pages/Bloque1/html.html#html5", + "href": "pages/Bloque1/html.html#html5", + "title": "HTML", + "section": "HTML5", + "text": "HTML5\n\n¿Qué es HTML?\nHTML es un lenguaje de marcas que permite definir la estructura y el contenido de un documento para la web. Mediante un conjunto de etiquetas, el desarrollador describe elementos como textos, imágenes, enlaces o formularios, indicando su función dentro de la página. Es la base sobre la que posteriormente se aplican estilos (CSS) y comportamientos dinámicos (JavaScript).\n\n\nEstructura básica\n<!DOCTYPE html>\n<html>\n<head>\n\n</head>\n\n<body>\n\n <p>Clase 1 del TC</p>\n \n</body>\n</html>\nEn el código aparecen varias etiquetas HTML, y cada una tiene una etiqueta de apertura y una etiqueta de cierre (por ejemplo, <p> y </p>).\nEstas etiquetas delimitan y organizan el contenido del documento:\n- <head> agrupa la información del documento,\n- <body> contiene lo que verá el usuario,\n- <p> define un párrafo.\nLa función de las etiquetas es indicar al navegador qué es cada parte del documento y cómo debe interpretarla.\n\n\nHead\nSe corresponde con la cabecera de la pestaña, principalmente solo se modifica el logotipo y el contenido de esta.\nTambién se utiliza para almacenar los metadatos de la web, así como scripts de JavaScript y hojas de estilo de CSS.\n<!DOCTYPE html>\n<html>\n<head>\n\n <title> Web del TC </title>\n\n</head>\n\n<body>\n\n <p>Clase 1 del TC</p>\n \n</body>\n</html>\n\n\nBody\nSe corresponde con todo el contenido de la página dentro podemos utilizar multitud de etiquetas, acontinuación expondremos las más importantes.\nHasta el momento hemos trabajado únicamente con etiquietas invividuales, pero pronto veremos como podemos juntar varias etiquetas simples para obtener estructuras más complejas como tablas o formularios.\nTodo el código mostrado a partir de ahora se asume que esta correctamente ubicado dentro de una etiqueta body\n\n<p> Paragraph\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n<p>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n</p>\n\n\n<br> Break Line\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation\nullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n<p>\n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n <br></br>\n ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n</p>\n\n\n<ul> Unordered list\n\nFrancisco de Quevedo\nLope de Vega\nGóngora\n\n<ul>\n <li>Francisco de Quevedo</li>\n <li>Lope de Vega</li>\n <li>Góngora</li>\n</ul>\n\n\n<ol> Ordered list\n\nRecepción\nDiscurso del Rector\nDespedida\n\n<ol>\n <li>Recepción </li>\n <li>Discruso del Rector</li>\n <li>Despedida</li>\n</ol>\n\n\n<h#> Headings\n<h1>Título 1</h1>\n<h2>Título 2</h2>\n<h3>Título 3</h3>\n<h4>Título 4</h4>\n<h5>Título 5</h5>\n<h6>Título 6</h6>\n\n\n<div> Divisor y <span> Span\nEtiquetas contenedores, utilizadas para agrupar otras etiquetas, no presentan ningún efecto visible intrínsico, salvo que tras utilizar <div> se produce un salto de línea. Por lo que utilizaremos <div> para agrupar grandes grupos de etiquetas y <span> para fragementos más pequeños\n\n<div>\n<div>\n <h2>Capítulo 2 </h2>\n <p>\n Mio Cid Ruy Díaz por Burgos entró,<br></br>\n en su conpaña sessaenta pendones.<br></br>\n Exiénlo ver mugieres e varones,<br></br>\n burgeses e burgesas por las finiestras son,<br></br>\n plorando de los ojos, tanto avién el dolor,<br></br>\n de las sus bocas todos dizían una razón:<br></br>\n — ¡Dios, qué buen vassallo, si oviesse buen señor!—\n </p>\n</div>\n\n\n\n<strong> Strong, <i> Italic\nNegrita Itálica Negrita e Itálica\n<strong>Negrita</strong>\n<i>Itálica</i>\n<strong><i> Negrita e Itálica</i></strong>\n\n\nComentario\nEtiqueta invisible\n<p>Etiqueta invisible</p>\n\n<!-- Soy un comenario -->\n\n\nTablas\n\n\n\n\nProducto\n\n\nCantidad\n\n\nPrecio (€)\n\n\n\n\n\n\nManzanas\n\n\n10\n\n\n3,50\n\n\n\n\nNaranjas\n\n\n8\n\n\n4,00\n\n\n\n\nPlátanos\n\n\n6\n\n\n2,80\n\n\n\n\n\n\nTotal\n\n\n24\n\n\n10,30\n\n\n\n\n<table>\n <thead>\n <tr>\n <th>Producto</th>\n <th>Cantidad</th>\n <th>Precio (€)</th>\n </tr>\n </thead>\n\n <tbody>\n <tr>\n <td>Manzanas</td>\n <td>10</td>\n <td>3,50</td>\n </tr>\n <tr>\n <td>Naranjas</td>\n <td>8</td>\n <td>4,00</td>\n </tr>\n <tr>\n <td>Plátanos</td>\n <td>6</td>\n <td>2,80</td>\n </tr>\n </tbody>\n\n <tfoot>\n <tr>\n <td>Total</td>\n <td>24</td>\n <td>10,30</td>\n </tr>\n </tfoot>\n</table>\n\n\n<a> Link\nHyperloopUPV\n<!-- ¿Qué pasa con la URL -->\n<a>Hyperloop UPV</a>\n\nPropiedades HTML\nLas etiquetas o elementos html disponen de atributos que nos permiten modificar su comportamiento interno.\nEn el caso de las etiquetas <a> debemos de especificar en los atributos la referncia en cuestión\n <a href=\"https://hyperloopupv.com/\"> HyperloopUPV </a>\n\n\n\n<img> Image\n\n\n\n“Plaza de la Reina”\n\n\n<img src=\"../pr.jpg\" alt=\"Plaza con una fuente en el centro alrdedor casetas y fincas\">\n\n\n<form> Forms\nAmpliamente utilizados en HTML, trabajan sobre la etiqueta <input> la cual tiene muchos tipos.\n\n<input type=\"text\">\n\nNombre: \n\n<form>\n\n <label for=\"first-name\">Nombre:</label>\n\n <input type=\"text\" name=\"first-name\"/>\n</form>\n\n\n<input type=\"number\">\n\nEdad: \n\n<form>\n\n <label for=\"age\">Edad:</label>\n\n <input type=\"number\" name=\"age\" />\n</form>\n\n\n<input type=\"radio\">\n\nSubsistema: Software Firmware \n\n<form>\n\n <label for=\"sub\">Subsistema: </label><br />\n <input type=\"radio\" name=\"sub\" value=\"software\" /> Software <br />\n <input type=\"radio\" name=\"sub\" value=\"firmware\" /> Firmware <br />\n\n</form>\n\n\n<input type=\"submit\">\n\nNombre: \n\n\n<form>\n\n <label for=\"first-name\">Nombre:</label>\n <input type=\"text\" name=\"first-name\"/>\n\n <br/>\n\n <input type=\"submit\"/>\n</form>\n\n\n\n<button> Button\nPor ahora no los utilizaremos, pero es importante saber que existen\n\nSuscribirse\n\n<button>Suscribirse</button>", "crumbs": [ - "Bloque I Introducción" + "Bloque I Introducción", + "Semana 1", + "HTML" ] }, { - "objectID": "pages/Bloque1/bloque1.html#material", - "href": "pages/Bloque1/bloque1.html#material", - "title": "Bloque I Introducción", - "section": "Material", - "text": "Material\n\nMDN (Mozilla Developer Network), HTML y CSS\nW3Schools HTML y CSS\nVisual Studio Code Manual VSCode\nCSS tricks CSS Avanzado", + "objectID": "pages/Bloque1/html.html#primer-repo-de-git", + "href": "pages/Bloque1/html.html#primer-repo-de-git", + "title": "HTML", + "section": "Primer repo de Git", + "text": "Primer repo de Git\n\nIniciar sesión en cuenta de GitHub\nBarra superior derecha, Símbolo + > New Repo\nRepository Name\nDescription of the repo\nVisibility\nAdd README\nCrear repositorio\n\n\n\nDesde la ventana del repositorio creado\nCode <> > Clone > HTTPS > Copiar URL\nDesde VScode\nClonar repositorio (si no aparece F1, paleta de comandos Clonar Repositorio)\nPegar la URL del repo\nPresionar intro (equivalente a git clone)\n\n\n\nRealizar cambios\nDesde la barra derecha seleccionar menú de Git (3 nodos interconectados por dos aristas)\nAgregar presionando el + los archivos a la staging area (equivalente a git add <file>)\nEscribir mensaje de commit y presionar botón de confirmación (equivalente a git commit)\n\n\nUna vez se hayan realizados todos los commits deseados presionar la rueda de sincronización en la barra de estado. Este último cambio es equivalente a ejecutar git pull y git push.\npush sube los cambios al repositorio remoto pull actualiza los cambios de repositorio remoto por el local", "crumbs": [ - "Bloque I Introducción" + "Bloque I Introducción", + "Semana 1", + "HTML" ] }, { - "objectID": "pages/Bloque1/t1a.html", - "href": "pages/Bloque1/t1a.html", - "title": "TA1: Mi CV I", + "objectID": "pages/Bloque1/t1.html", + "href": "pages/Bloque1/t1.html", + "title": "T1: Web de HL I", "section": "", - "text": "A día de hoy es muy importante tener una imagen digital, por ello la tarea extra consite en crearte tu propia página web básica usando html.\nPuedes usar el CV de Antonio Machado como referencia.\nBase: Ejemplo", + "text": "La primera tarea de esta semana consiste en diseñar una página web para el equipo de generación espontánea llamado Hyperloop UPV, la web debe de ser realizada en un archivo HTML y debe de constar por lo menos de los siguientes apartados y estructura\n\nTítulo principal de la página <h1>\nVarios secciones cada una introducida por un título <h2> (si es necesario hacer <h3>)\n\nDescripción del equipo\nLista desordenada de los subsistemas\nLista de Partners por orden de importancia (UPV, )\nUn día en Hyperloop (nótese el título del apartado en cursiva)\n\nBreve descripción de lo que hacemos en el equipo, alguna foto\n\nMiembros\n\nUna tabla de miembros por subsistema (inventarse los datos)\n\nFormulario para solicitar unirse al equipo que solicite\n\nNombre\nApellido\nCurso (radius button)\nBotón de enviar\n\nLink a la web del TC de SW y a la oficial del equipo\n\nCada sección debe de estar contenido en un div de la siguiente forma\n\n<div>\n\n <h2>Títlo de sección</h2>\n\n <Contenido de la sección />\n\n</div>\nBase: Web", "crumbs": [ "Bloque I Introducción", "Semana 1", - "TA1: Mi CV I" + "T1: Web de HL I" ] }, { - "objectID": "pages/Bloque1/MAcss.html", - "href": "pages/Bloque1/MAcss.html", - "title": "MA: Selectores y Pseudoselectores", + "objectID": "pages/Bloque1/MAhtml2.html", + "href": "pages/Bloque1/MAhtml2.html", + "title": "MA: Mas HTML", "section": "", - "text": "Además del id y las class, existen más selectores que son ampliamente utilizados en la programación web. El siguiente video los explica muy detallados y sirve como repaso para lo que se ha visto esta semana de CSS. El vídeo está en Inglés y dura 20 minutos.", + "text": "Durante la explicación de teoría vista esta semana en clase nos hemos introducido en las etiquetas básicas de HTML.\nA continuación una selección de etiquetas que no hemos visto en clase, pero resulta interesante conocer, puesto que en determinadas ocasiones son útiles. Cada ítem de la lista es un enlace a la documentación de Mozilla donde está explicado el funcionamiento de la etiqueta de forma exhaustiva. No hay que conocer todos los aspectos de cada etiqueta, basta con tener una idea general de como funcionan.\n\ninput types. Muy importante conocer todos los tipos de inputs\ncode\niframe. Útil y ampliamente extendida\nhr. Línea horizontal\nfigure y figcaption. Permite insertar figura y pie de figura.\naudio. Insertar un audio en la página web.\nvideo. Insertar un audio en la página web.\nheader, main, footer. Son como <div> pero ya con usos por defecto preasignados.", "crumbs": [ "Bloque I Introducción", - "Semana 2", - "MA: Selectores y Pseudoselectores" + "Semana 1", + "MA: Mas HTML" ] }, { - "objectID": "pages/Bloque1/css_p.html#problemas-de-html", - "href": "pages/Bloque1/css_p.html#problemas-de-html", - "title": "CSS", - "section": "Problemas de HTML", - "text": "Problemas de HTML\nHasta el momento hemos trabajado con HTML, que a pesar de ser muy práctico para la creación de la estructura interna de la web, presenta ciertas limitaciones a la hora de modificar el formato de la web, para ello se introduce CSS, una herramienta que nos va a permitir modificar el formato cómodamente." + "objectID": "pages/Bloque1/entorno-reveal.html#ide", + "href": "pages/Bloque1/entorno-reveal.html#ide", + "title": "Preparación del entorno de trabajo", + "section": "IDE", + "text": "IDE\n¿Qué es una IDE?\nLas Integrated development environment (IDE) son aplicaciones diseñadas para facilitar la programación a los programadores.\nAunque no hay una lista de características propias de las IDE, suelen tener características comunes, por ejemplo:\n\nDebugger integrado en la interfaz\nGestor de archivos\nEditor de código inteligente: autocompletados" }, { - "objectID": "pages/Bloque1/css_p.html#formato-con-css", - "href": "pages/Bloque1/css_p.html#formato-con-css", - "title": "CSS", - "section": "Formato con CSS", - "text": "Formato con CSS\nAtributo style\nSupongamos que tenemos el siguiente elemento\n<p> Hola Mundo<p>. Por ahora el texto se mostrará en color negro, el color predeterminado de HTML para las etiquetas <p>\n\n\nHola mundo" + "objectID": "pages/Bloque1/entorno-reveal.html#node.js-y-npm", + "href": "pages/Bloque1/entorno-reveal.html#node.js-y-npm", + "title": "Preparación del entorno de trabajo", + "section": "Node.JS y NPM", + "text": "Node.JS y NPM\n¿Qué es node JS?\nNode.js es un entorno de ejecución de JavaScript basado en el motor V8 de Google Chrome.\nPermite ejecutar código JavaScript directamente en el sistema operativo, sin depender de un navegador.\nDe este modo, el mismo lenguaje puede usarse tanto en el frontend como en el backend." }, { - "objectID": "pages/Bloque1/css_p.html#etiqueta-meta", - "href": "pages/Bloque1/css_p.html#etiqueta-meta", - "title": "CSS", - "section": "Etiqueta ", - "text": "Etiqueta <meta>\nLas etiquetas <meta> en HTML sirven para proporcionar metadatos sobre la página web. Estos metadatos no se muestran al usuario, pero son importantes para navegadores, buscadores, redes sociales y dispositivos.\n<head>\n <meta charset=\"UTF-8\"> <!-- Selecciona el conjunto de caracteres -->\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> <!-- \"Hace la web Responsive\" -->\n <title>Mi Página</title>\n <link rel=\"stylesheet\" href=\"styles.css\">\n</head>" + "objectID": "pages/Bloque1/entorno-reveal.html#git-y-github", + "href": "pages/Bloque1/entorno-reveal.html#git-y-github", + "title": "Preparación del entorno de trabajo", + "section": "Git y GitHub", + "text": "Git y GitHub\n¿Qué es Git?\nGit es un sistema de control de versiones distribuido. Permite registrar los cambios de un proyecto, volver a versiones anteriores y trabajar de forma colaborativa sin sobrescribir el trabajo de otros. Cada usuario dispone de una copia completa del repositorio, lo que facilita el trabajo sin conexión." }, { - "objectID": "pages/Bloque1/css_p.html#git-github", - "href": "pages/Bloque1/css_p.html#git-github", - "title": "CSS", - "section": "Git & GitHub:", - "text": "Git & GitHub:\nLos comandos de git nos permiten utilizar la cli para gestionar nuestro repositorio\ngit init # Incializa repositorio (= crear repo con GitHub)\ngit clone <url-repo> \n\ngit add <files> # Añade los archivos a la stagging area\ngit commit -m \"<mensaje de commit>\" # commit\n\ngit push # push\ngit pull # pull\n\ngit status # estado actual del repo\ngit log # historia reciente del log con poco detalle de profundidad\n\ngit diff <file> # muestra la diferencia entre la versión modificada ente un archivo y otro" - }, - { - "objectID": "pages/Bloque1/css.html", - "href": "pages/Bloque1/css.html", - "title": "CSS", + "objectID": "pages/Bloque1/entorno.html", + "href": "pages/Bloque1/entorno.html", + "title": "Preparación del entorno de trabajo", "section": "", "text": "Contenido", "crumbs": [ "Bloque I Introducción", - "Semana 2", - "CSS" + "Semana 0", + "Preparación del entorno de trabajo" ] }, { - "objectID": "pages/Bloque1/css.html#problemas-de-html", - "href": "pages/Bloque1/css.html#problemas-de-html", - "title": "CSS", - "section": "Problemas de HTML", - "text": "Problemas de HTML\nHasta el momento hemos trabajado con HTML, que a pesar de ser muy práctico para la creación de la estructura interna de la web, presenta ciertas limitaciones a la hora de modificar el formato de la web, para ello se introduce CSS, una herramienta que nos va a permitir modificar el formato cómodamente.", + "objectID": "pages/Bloque1/entorno.html#ide", + "href": "pages/Bloque1/entorno.html#ide", + "title": "Preparación del entorno de trabajo", + "section": "IDE", + "text": "IDE\n\n¿Qué es una IDE?\nLas Integrated development environment (IDE) son aplicaciones diseñadas para facilitar la programación a los programadores.\nAunque no hay una lista de características propias de las IDE, suelen tener características comunes, por ejemplo:\n\nDebugger integrado en la interfaz\nGestor de archivos\nEditor de código inteligente: autocompletados\n\n\n\n¿Cuántas IDE existen?\n\nAndroid Studio\nRStudio\nEclipse\n\n\n\n¿Qué IDE utilizaremos nosotros?\nPrincipalmente trabajaremos con VSCode una IDE de proposito general que configuraremos para el desarrollo frontend\n\nInstalación de VScode\n\nEnlace\n\n\nFamiliarizarse con VSCode\n\nBarra lateral:\n\nExplorador de archivos\nMenú de Git\nMenú de extensiones\nBuscar\nDebugger\n\nEditor o área de edición: componente más importante de la IDE, lugar donde se escribe el código.\n\n\n\nExtensiones\nLas extensiones son aplicaciones software desarolladas por empresas o por particulares para modificar o agregar una nueva funcionalidad a las IDE. Pueden ir desde pequeñas modificaciones del tema o de la UI, o incorporar nuevas funcionalidades como la interacción con bases de datos.\n\nLiveServer\nNosotros para el transcurso del curso utilizaremos la extensión Liveserver que nos permitirá desplegar comodamente un pequeño servidor para la programación con HTML (Ahondaremos más la próxima semana)\n\nInstalación de LiveServer\n\n\nEntrar en el menú de extensiones\nBuscar por liveserver\nSeleccionar extensión\nInstalar\n\n\nAl concluir la instalación debería de aparecer en la parte derecha de la barra de estado (barra interior)", "crumbs": [ "Bloque I Introducción", - "Semana 2", - "CSS" + "Semana 0", + "Preparación del entorno de trabajo" ] }, { - "objectID": "pages/Bloque1/css.html#formato-con-css", - "href": "pages/Bloque1/css.html#formato-con-css", - "title": "CSS", - "section": "Formato con CSS", - "text": "Formato con CSS\n\nAtributo style\nSupongamos que tenemos el siguiente elemento\n<p> Hola Mundo<p>. Por ahora el texto se mostrará en color negro, el color predeterminado de HTML para las etiquetas <p>\n\n\nHola mundo\n\n\nSi se desea modificar el formato intrínseco de esta etiqueta <p> debemos incluir la propiedad style que, como su nombre indica nos permitirá modificar su estilo. Dentro de este atributo se ha de insertar propiedad CSS (no confundir con los atributos html). La propiedad CSS especifica que aspecto visual del contenido de la etiqueta. Por ejemplo, si se desea modificar el color de la letra se debe de utilizar la propiedad color (nótese que no lleva u).\n<p style=\"color:red\">Hola Mundo</p>\n\n<!-- Equivalente en Hexadecimal -->\n\n<p style=\"color:#ff0000\">Hola Mundo</p>\n\n\nHola Mundo\n\n\nSí deseamos modificar más de una propiedad CSS deberemos de serparalas dentro de la etiqueta con un punto y coma\n<p style=\"color:#ff0000; font-size: 44px\">Hola Mundo</p>\n\n\nHola Mundo\n\n\n\nProblemas del atributo style\nEl atributo style resulta útil para formatear una etiqueta individualmente, pero resulta tedioso y repetitivo para más de una etiqueta. Observe el siguiente ejemplo\n<p>Autores del culteranismo marcados en rojo<p>\n\n<ul>\n <li>Francisco de Quevedo</li>\n <li style=\"color:red; text-decoration: underline; font-size:30px;\">Luis de Góngora</li>\n <li>Baltasar Gracián</li>\n <li style=\"color:red; text-decoration: underline; font-size:30px;\">Pedro Soto de Rojas</li>\n <li>Tirso de Molina</li>\n <li>Calderón de la Barca</li>\n</ul>\n\n\nAutores del culteranismo marcados en rojo\n\n\n\nFrancisco de Quevedo\n\n\nLuis de Góngora\n\n\nBaltasar Gracián\n\n\nPedro Soto de Rojas\n\n\nTirso de Molina\n\n\nCalderón de la Barca\n\n\n\nProblemas:\n\nRepetición de mucho código\nAlta posibilidad error\nPoca escalabilidad\n\nSi añadimos por ejempo a Luis Carrillo y Sotomayor (autor culteranista) hay que volver a repetir todo el atributo\nSi deseasemos cambiar el color de rojo a verde deberemos modificar cada uno de los atributos\n\n\n\n\n\nClases e ID\n\nClases\nLa solución a este problema son las clases que nos permiten identificar aquellos componentes con características de formato similares. Se agregan como atributos a cada etiqueta\n<p>Autores del culteranismo marcados en rojo<p> <!--En este caso no se marcan en rojo-->\n\n<ul>\n <li>Francisco de Quevedo</li>\n <li class=\"culteranista\">Luis de Góngora</li>\n <li>Baltasar Gracián</li>\n <li class=\"culteranista\">Pedro Soto de Rojas</li>\n <li>Tirso de Molina</li>\n <li>Calderón de la Barca</li>\n</ul>\n\nEtiqueta <style>\nAhora para marcar en rojo los culterantistas se ha de indicar el formato de todos en la class culteranista, para ello nos definiremos una hoja de estilo que será común para todo el documento. La hoja de estilos se define en el <head> de la siguiente forma:\n<head>\n<!-- Fragemento HTML -->\n<style>\n /*Fragmento CSS*/\n .culteranistas{ /*Nótese el punto*/\n color: red;\n text-size: 40px;\n background-color: blue;\n text-decoration: underline; /*Este último ';' no es obligatorio como tal, pero es recomendable, en HTML3 y CSS2 daba error si se incluía*/\n }\n</style> \n<!--Fin de la etiqueta Style, seguimos con html-->\n</head>\nAhora se visualizará correctamente, además se añadirá el fondo azul\n\n\nComposición de clases\nSuponga que tenemos dos clases, una primera clase que modifica el tipo de letra a monospace que aplicaremos a los autores culteranistas y una segunda que modifica el grosor de la letra que se aplicará sobre los autores de lírica.\n<head><style>\n .culteranista {\n font-family: monospace;\n }\n .lirica {\n font-weight: bold;\n }\n .autores {\n list-style: square;\n }\n</style></head>\n\n<body>\n <ul class=\"autores\">\n <li class=\"lirica\">Fray Luis de León</li>\n <li class=\"culteranista\">Hortensio Félix de Paravicino</li>\n <li class=\"culteranista lirica\">Lope de Vega</li>\n <li class=\"lirica\">San Juan de la Cruz</li>\n </ul>\n</body>\n\n\n\nFray Luis de León\n\n\nHortensio Félix de Paravicino\n\n\nLope de Vega\n\n\nSan Juan de la Cruz\n\n\n\n\n\n\nID\nLos ID son como las clases pero solo se pueden utlizar una vez por sitio web. Es útil para cosas que no se deben repetir más de una vez por sitio web.\n<style>\n#principal{\n text-align: center\n color:blue\n}\n</style>\n<!--[...]-->\n<div id=\"principal\">\n <h4>Teatro Romántico></h4>\n <p>El retablo romántico se caracteriza por exaltar la libertad creadora,\n la expresión intensa de los sentimientos individuales, el gusto por lo\n misterioso y lo sublime, y la reivindicación de la imaginación frente a\n las reglas clásicas.</p>\n</div>\n\n\nTeatro Romántico\n\n\nEl retablo romántico se caracteriza por exaltar la libertad creadora, la expresión intensa de los sentimientos individuales, el gusto por lo misterioso y lo sublime, y la reivindicación de la imaginación frente a las reglas clásicas.\n\n\n\n\n\nPropiedades CSS\n\nborder y border-radius\nLa propiedad border es una propiedad abreviada (shorthand) que en realidad combina tres propiedades más pequeñas:\n\nborder-width → grosor del borde\n\nborder-style → estilo del borde (solid, dashed, dotted, etc.)\n\nborder-color → color del borde\n\nPor ejemplo, estas dos definiciones son equivalentes:\n/* Forma abreviada */\n.caja {\n border: 2px solid red;\n}\n\n/* Forma “desdoblada” en 3 mini propiedades */\n.caja-desdoblada {\n border-width: 2px;\n border-style: solid;\n border-color: red;\n}\n Lope de Vega\n\n\nborder-top, border-right, border-bottom, border-left\nCSS permite aplicar bordes distintos en cada lado. Cada uno funciona igual que border pero aplicado a un solo lado:\nborder-top\nborder-right\nborder-bottom\nborder-left\n.caja-bordes {\n border-top: 3px solid red;\n border-right: 2px dashed blue;\n border-bottom: 4px dotted green;\n border-left: 5px double orange;\n}\nTambién pueden desdoblarse:\n.caja-top-desdoblado {\n border-top-width: 4px;\n border-top-style: solid;\n border-top-color: purple;\n}\n\n\nmargin y padding\nLas propiedades margin y padding controlan el espacio alrededor de los elementos, pero cada una actúa en una zona distinta:\n\nmargin → espacio externo, fuera del borde del elemento\n\npadding → espacio interno, entre el contenido y el borde\n\nVisualmente:\n\n\n \n\n\n\n CONTENT\n\n\n\n\n<div style=\"background:#f0f0f0; padding:20px;\">\n <!-- MARGIN (gris claro alrededor del borde) -->\n <!-- BORDER -->\n <div style=\"border:3px solid black\">\n <!-- PADDING (espacio interno) -->\n <div style=\"background:#d0ffd0; padding:15px;\">\n <!-- CONTENT -->\n <span style=\"background-color:white\">CONTENT</span>\n </div>\n </div>\n</div>\n\nRegla Trouble\nCuando margin o padding usan 4 valores, el orden siempre es el mismo:\ntop, right, bottom, left\nPara recordarlo fácilmente se utiliza la regla mnemotécnica Trouble:\n\nT → Top (arriba)\n\nR → Right (derecha)\n\nB → Bottom (abajo)\n\nL → Left (izquierda)\n\nEs decir:\nmargin: top right bottom left;\npadding: top right bottom left;\n\n\n\n\n\n\nTipTruco para los ingenieros: La regla de la mano derecha\n\n\n\nEl orden de los margin y de los padding siempre es en sentido horario.\nPor lo que podemos utilizar la regla de la mano derecha de la inducción electro magnética asumiendo que el vector intensidad apunta hacia la pantalla\n\n\n\n\n\n\nArchivos externos CSS\nIncluir en la cabecerá el CSS presenta ventajas como tener la página web en un único archivo. Sin embargo en la práctica normalmente trabajaremos con más de 2 archivos por lo que incluir uno más o uno menos no marca la diferencia. Por lo que podemos separar el css en un archivo externo .css. De esta forma podremos reutilizar las hojas de estilos.\n<head>\n <title>Mi Página</title>\n <link rel=\"stylesheet\" href=\"styles.css\">\n</head>", + "objectID": "pages/Bloque1/entorno.html#node.js-y-npm", + "href": "pages/Bloque1/entorno.html#node.js-y-npm", + "title": "Preparación del entorno de trabajo", + "section": "Node.JS y NPM", + "text": "Node.JS y NPM\n\n¿Qué es node JS?\nNode.js es un entorno de ejecución de JavaScript basado en el motor V8 de Google Chrome.\nPermite ejecutar código JavaScript directamente en el sistema operativo, sin depender de un navegador.\nDe este modo, el mismo lenguaje puede usarse tanto en el frontend como en el backend.\n\n\n¿Qué es NPM?\nNPM (Node Package Manager) es el gestor de paquetes de Node.js.\nFacilita la instalación, actualización y gestión de librerías que amplían las funcionalidades de los proyectos.\nDescarga node y npm nodejs.org", "crumbs": [ "Bloque I Introducción", - "Semana 2", - "CSS" + "Semana 0", + "Preparación del entorno de trabajo" ] }, { - "objectID": "pages/Bloque1/css.html#etiqueta-meta", - "href": "pages/Bloque1/css.html#etiqueta-meta", - "title": "CSS", - "section": "Etiqueta ", - "text": "Etiqueta <meta>\nLas etiquetas <meta> en HTML sirven para proporcionar metadatos sobre la página web. Estos metadatos no se muestran al usuario, pero son importantes para navegadores, buscadores, redes sociales y dispositivos.\n<head>\n <meta charset=\"UTF-8\"> <!-- Selecciona el conjunto de caracteres -->\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> <!-- \"Hace la web Responsive\" -->\n <title>Mi Página</title>\n <link rel=\"stylesheet\" href=\"styles.css\">\n</head>", + "objectID": "pages/Bloque1/entorno.html#git-y-github", + "href": "pages/Bloque1/entorno.html#git-y-github", + "title": "Preparación del entorno de trabajo", + "section": "Git y GitHub", + "text": "Git y GitHub\n\n¿Qué es Git?\nGit es un sistema de control de versiones distribuido. Permite registrar los cambios de un proyecto, volver a versiones anteriores y trabajar de forma colaborativa sin sobrescribir el trabajo de otros. Cada usuario dispone de una copia completa del repositorio, lo que facilita el trabajo sin conexión.\n\n\n¿Qué es GitHub?\nGitHub es una plataforma en la nube que utiliza Git para almacenar y gestionar proyectos. Permite compartir código, colaborar con otros desarrolladores y mantener un control de versiones centralizado.\n\n\nGit frente GitHub\n\nGit es la herramienta de control de versiones.(Software Libre, Linux Fundation)\nGitHub es la plataforma online donde se alojan los repositorios y se facilita el trabajo en equipo. (Coporativa Microsoft)\n\n\n\nUso de Git y GitHub\nEn Hyperloop UPV, tanto en los subsistemas de Software y Firmware utilizamos GitHub como herramienta de gestión de código.\nNosotros en el TC, también trataremos de facilitarnos con esta herramienta\n\n\nInstalación de Git y Cuenta de GitHub\n\nInstalación de Git\nCuenta de GitHub\n\n\n\nDiagrama de trabajo de Git\n\n\nGit en VScode", "crumbs": [ "Bloque I Introducción", - "Semana 2", - "CSS" + "Semana 0", + "Preparación del entorno de trabajo" ] }, { - "objectID": "pages/Bloque1/css.html#git-github", - "href": "pages/Bloque1/css.html#git-github", - "title": "CSS", - "section": "Git & GitHub:", - "text": "Git & GitHub:\nLos comandos de git nos permiten utilizar la cli para gestionar nuestro repositorio\ngit init # Incializa repositorio (= crear repo con GitHub)\ngit clone <url-repo> \n\ngit add <files> # Añade los archivos a la stagging area\ngit commit -m \"<mensaje de commit>\" # commit\n\ngit push # push\ngit pull # pull\n\ngit status # estado actual del repo\ngit log # historia reciente del log con poco detalle de profundidad\n\ngit diff <file> # muestra la diferencia entre la versión modificada ente un archivo y otro", + "objectID": "pages/rubric.html", + "href": "pages/rubric.html", + "title": "Rúbrica de evaluación", + "section": "", + "text": "Durante el curso seguiremos la siguiente rúbrica para la calificación de las tareas. A pesar de que las calificaciones no son importantes, la rúbrica es un buen recordatorio de que aspectos hay que tener en cuenta en la programación web.\n\n\n\nPuntuación\n\n\nNo aplica\n\n\nDeficiente(0–4)\n\n\nInsuficiente(4–5)\n\n\nAceptable(5–7)\n\n\nBueno(7–9)\n\n\nExcelente(9–10)\n\n\n\n\nDiseño\n\n\nNo aplica.\n\n\nDiseño desordenado y/o con problemas de visualización funcional.\n\n\nDiseño básico pero con problemas de visualización o estructura.\n\n\nDiseño claro y ordenado, cumple los requisitos básicos.\n\n\nDiseño cuidado, buena estética y estructura clara.\n\n\nDiseño profesional, limpio, pulido y sobresaliente.\n\n\n\n\nProgramación\n\n\nNo aplica.\n\n\nCódigo incompleto o con errores graves.\n\n\nCódigo funcional parcialmente y/o con errores importantes.\n\n\nCódigo funcional y adecuado a la tarea.\n\n\nCódigo bien estructurado con mejoras respecto a lo exigido.\n\n\nCódigo impecable, eficiente y muy bien organizado.\n\n\n\n\nEsfuerzo e implicación\n\n\nNo aplica.\n\n\nBajo esfuerzo o dedicación mínima.\n\n\nEsfuerzo adecuado pero limitado.\n\n\nEsfuerzo notable, cumple con lo requerido.\n\n\nEsfuerzo claro, trabajo más allá de lo solicitado.\n\n\nDedicación sobresaliente y trabajo excepcional.\n\n\n\n\nDocumentación / Claridad\n\n\nNo aplica.\n\n\nDocumentación mínima o inexistente.\n\n\nDocumentación incompleta o confusa.\n\n\nDocumentación clara y suficiente.\n\n\nDocumentación bien presentada y detallada.\n\n\nDocumentación excelente y altamente profesional.\n\n\n\n\nFuncionalidad\n\n\nNo aplica.\n\n\nNo funciona o no cumple objetivos.\n\n\nFunciona de forma parcial.\n\n\nFunciona correctamente.\n\n\nFunciona con mejoras o funcionalidades extra.\n\n\nFunciona perfectamente y supera expectativas.\n\n\n\n\nInnovación\n\n\n(Nota extra)\n\n\n\n\nTOTAL:\n\n\n\n\n/60\n\n\n\n\nObservaciones:\n\n\n\n\n\nLa nota total será sobre 60 si hay algun criterio que no se aplique, se modificará la nota para que esté sobre base 60.", "crumbs": [ - "Bloque I Introducción", - "Semana 2", - "CSS" + "Rúbrica de evaluación" ] }, { - "objectID": "pages/Bloque1/t2.html", - "href": "pages/Bloque1/t2.html", - "title": "T2: Web de HL II", + "objectID": "pages/Bloque2/ti.html", + "href": "pages/Bloque2/ti.html", + "title": "TI: Ejercicios JS", "section": "", - "text": "El objetivo de esta tarea, es poner en práctica lo aprendido en clase para ello vamos a formatear la web de nuestro equipo de Hyperloop, (tarea de la semana pasada).\nSe debe formatear para que quede como está Web, cuanto más se parezca mejor.\nNotas:\nLa hoja de estilos debe de estar incluida en el la etiqueta <style> del <head>.\nPara conseguir que los bordes de la table, td, tr… colapsen (que solo haya un borde y no dos) se debe utilizar la propiedad border-collapse.\nSi no se realizó la T1, puede utilizar este archivo html como base (click derechao guardar enlace como).", + "text": "El objetivo de estos ejercicios es repasar aquellas funcionalidades de JavaScript que difieren del resto de lenguajes de programación empirica, por lo que los siguentes ejercicios de DEBEN DE RESOLVER SIN UTILIZAR NINGUNA CONDICIONAL NI NINGÚN BUCLE.\nPrincipalmente trabajarás con:\nDebe de realizar la tarea enun archivo js, para comprobar el resultado debe de ejecutar desde la terminal con node nombreArchivo.js.", "crumbs": [ - "Bloque I Introducción", - "Semana 2", - "T2: Web de HL II" + "Bloque II Programación", + "Repaso Intensivo", + "TI: Ejercicios JS" ] }, { - "objectID": "pages/Bloque2/jsI-reveal.html#introducción-a-js", - "href": "pages/Bloque2/jsI-reveal.html#introducción-a-js", - "title": "Introducción a JS", - "section": "Introducción a JS", - "text": "Introducción a JS\n¿Qué es JavaScript?\n\nEs el lenguaje de programación del navegador.\nCreado en 1995 por Brendan Eich\nPermite crear comportamientos dinámicos: responder a clics, validar formularios, mostrar u ocultar elementos, generar contenido nuevo, etc.\nSe ejecuta directamente en el navegador, sin necesidad de instalación.\nJunto con HTML y CSS forma el trinomio esencial del desarrollo web\n\nLa siguiente tabla recuerda las difrencias entre HTML, CSS y JS:" + "objectID": "pages/Bloque2/ti.html#ejercicio-1", + "href": "pages/Bloque2/ti.html#ejercicio-1", + "title": "TI: Ejercicios JS", + "section": "Ejercicio 1", + "text": "Ejercicio 1\nDefina un array llamado arrOriginal con el siguiente contenido numérico. Este array será el origen de datos para los ejercicios posteriores, salvo que se indique lo contrario.\n3, 4, 2, 4, 4, 5, 12, 24, 3, 23, 232, 2, -3, -9, 2, -23, 200, -23, 12, 43, 4, -32, -32, 0, 23, 23", + "crumbs": [ + "Bloque II Programación", + "Repaso Intensivo", + "TI: Ejercicios JS" + ] }, { - "objectID": "pages/Bloque2/jsI-reveal.html#programación-en-js", - "href": "pages/Bloque2/jsI-reveal.html#programación-en-js", - "title": "Introducción a JS", - "section": "Programación en JS", - "text": "Programación en JS\nCaracterísticas generales de JS\n\nTipado dinámico\n\nTipado débil Coerción Implicita\n\nMultiparadigma\n\nÁmbito léxico (estático)\n\nModelo basado en prototipos (polimorfismo de inclusión por composición)\n\nFunciones de primera clase\n\nFunciones de orden superior" + "objectID": "pages/Bloque2/ti.html#ejercicio-2", + "href": "pages/Bloque2/ti.html#ejercicio-2", + "title": "TI: Ejercicios JS", + "section": "Ejercicio 2", + "text": "Ejercicio 2\nPartiendo del array arrOriginal, imprima por pantalla la siguiente frase:\n\n\"En el subsistema de software somos x miembros\"\n\ndonde x debe tomar, sucesivamente, cada uno de los valores de arrOriginal.\nImprima por pantalla el resultado.\n\nSalida esperada (ejemplo):\n\nEn el subsistema de software somos 3 miembros\nEn el subsistema de software somos 4 miembros\nEn el subsistema de software somos 2 miembros", + "crumbs": [ + "Bloque II Programación", + "Repaso Intensivo", + "TI: Ejercicios JS" + ] }, { - "objectID": "pages/Bloque2/jsI.html", - "href": "pages/Bloque2/jsI.html", - "title": "Introducción a JS", - "section": "", - "text": "Contenido" + "objectID": "pages/Bloque2/ti.html#ejercicio-3", + "href": "pages/Bloque2/ti.html#ejercicio-3", + "title": "TI: Ejercicios JS", + "section": "Ejercicio 3", + "text": "Ejercicio 3\nPartiendo de arrOriginal, cree un nuevo array llamado arrPositivos que contenga únicamente números positivos.\nUtilice arrPositivos para imprimir por pantalla las frases correspondientes.", + "crumbs": [ + "Bloque II Programación", + "Repaso Intensivo", + "TI: Ejercicios JS" + ] }, { - "objectID": "pages/Bloque2/jsI.html#introducción-a-js", - "href": "pages/Bloque2/jsI.html#introducción-a-js", - "title": "Introducción a JS", - "section": "Introducción a JS", - "text": "Introducción a JS\n\n¿Qué es JavaScript?\n\nEs el lenguaje de programación del navegador.\nCreado en 1995 por Brendan Eich\nPermite crear comportamientos dinámicos: responder a clics, validar formularios, mostrar u ocultar elementos, generar contenido nuevo, etc.\nSe ejecuta directamente en el navegador, sin necesidad de instalación.\nJunto con HTML y CSS forma el trinomio esencial del desarrollo web\n\nLa siguiente tabla recuerda las difrencias entre HTML, CSS y JS:\n\n\n\nCapa\nLenguaje\nFunción principal\n\n\n\n\nContenido\nHTML\nEstructura del documento\n\n\nPresentación\nCSS\nApariencia y diseño\n\n\nComportamiento\nJavaScript\nInteractividad y lógica" + "objectID": "pages/Bloque2/ti.html#ejercicio-4", + "href": "pages/Bloque2/ti.html#ejercicio-4", + "title": "TI: Ejercicios JS", + "section": "Ejercicio 4", + "text": "Ejercicio 4\nPartiendo de arrPositivos, cree un nuevo array llamado arrValidos que cumpla además el siguiente criterio:\n\nEl número máximo de personas es 10\n\nImprima por pantalla las frases correspondientes a arrValidos.", + "crumbs": [ + "Bloque II Programación", + "Repaso Intensivo", + "TI: Ejercicios JS" + ] }, { - "objectID": "pages/Bloque2/jsI.html#programación-en-js", - "href": "pages/Bloque2/jsI.html#programación-en-js", - "title": "Introducción a JS", - "section": "Programación en JS", - "text": "Programación en JS\n\nCaracterísticas generales de JS\n\nTipado dinámico\n\nTipado débil Coerción Implicita\n\nMultiparadigma\n\nÁmbito léxico (estático)\n\nModelo basado en prototipos (polimorfismo de inclusión por composición)\n\nFunciones de primera clase\n\nFunciones de orden superior\n\n\nClosures / Copia viva\nReflexión (Reflect, Proxy, descriptores)\n\nMetaprogramación\nSin Polimorfismo Ad-hoc de sobrecarga, ni Polimorfismo universal genérico\n\n\nEjecución single-threaded\n\nAsincronía no bloqueante\n\nPromises / async–await\n\nGarbage collection\nInteroperabilidad con JSON\n\n\n\nTipos\n\nPrimitivos\n\nstring — cadenas de texto\n\nnumber — números (enteros y decimales)\nboolean — verdadero o falso\n\nnull — ausencia intencional de valor\n\nundefined — valor no inicializado\n\nsymbol\nbigint\n\n\n\nTipos de referencia\n\nObject\n\nArray\n\nFunc tion\n\nMap / Set\n\nDate\n\n\n\n\nCaracterísticas del sistema de tipos\n\nTipado dinámico\n\nTipado débil\n\nLos primitivos se copian por valor\n\nLos objetos se copian por referencia\n\n\n\nVariables\n\nlet\n\nTipado: dinámico\nAlcance: estático\nMutables\nHoisting\nNo globales\nShadowing permitido\n\n\n\nconst\nNo son verdaderamente constantes\n\nTipado: dinámico\nAlcance: estático\nInmutables en la referencia (no permiten reasignación)\nHoisting\nNo globales\nShadowing permitido\n\n\n\nvar\nNo se usa\n\nTipado: dinámico\nAlcance: de función (no de bloque)\nMutables\nHoisting (inicializadas como undefined)\nGlobales si se declaran en el ámbito global (propiedad de window/globalThis)\nShadowing permitido, pero con reglas inconsistentes (puede causar illegal shadowing en combinación con let/const)" + "objectID": "pages/Bloque2/ti.html#ejercicio-5", + "href": "pages/Bloque2/ti.html#ejercicio-5", + "title": "TI: Ejercicios JS", + "section": "Ejercicio 5", + "text": "Ejercicio 5\nPartiendo nuevamente de arrOriginal, cree un nuevo array llamado arrFiltrado que contenga únicamente aquellos elementos que cumplan todas las siguientes condiciones:\n\nSean positivos\n\nSean pares\n\nSean menores que 100", + "crumbs": [ + "Bloque II Programación", + "Repaso Intensivo", + "TI: Ejercicios JS" + ] }, { - "objectID": "pages/Bloque2/tia.html", - "href": "pages/Bloque2/tia.html", - "title": "TAI: La objetización de las personas", - "section": "", - "text": "El objetivo de esta tarea es aplicar los conocimientos básicos de programación orientada a objetos en JavaScript, haciendo uso de las clases definidas en ES6. En particular, se evaluará el uso de:\n\nherencia entre clases\nencapsulación mediante propiedades privadas\ngetters y setters usando las palabras clave get y set\nmétodos estáticos\nvalidación de datos\n\nPara ello se definirá una jerarquía de clases que represente un equipo de Hyperloop.", + "objectID": "pages/Bloque2/ti.html#ejercicio-6", + "href": "pages/Bloque2/ti.html#ejercicio-6", + "title": "TI: Ejercicios JS", + "section": "Ejercicio 6", + "text": "Ejercicio 6\nPartiendo de arrFiltrado:\n\nCree un nuevo array llamado arrCubos elevando al cubo cada uno de sus elementos\n\nA partir de arrCubos, cree un nuevo array llamado arrCubosFiltrados que contenga únicamente aquellos valores cuyo resultado termine en 0.", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TAI: La objetización de las personas" + "TI: Ejercicios JS" ] }, { - "objectID": "pages/Bloque2/tia.html#objetivo-de-la-tarea", - "href": "pages/Bloque2/tia.html#objetivo-de-la-tarea", - "title": "TAI: La objetización de las personas", + "objectID": "pages/Bloque2/ti.html#ejercicio-7", + "href": "pages/Bloque2/ti.html#ejercicio-7", + "title": "TI: Ejercicios JS", + "section": "Ejercicio 7", + "text": "Ejercicio 7\nPartiendo de arrCubosFiltrados, cree un nuevo array llamado arrFinal añadiendo el valor 21.", + "crumbs": [ + "Bloque II Programación", + "Repaso Intensivo", + "TI: Ejercicios JS" + ] + }, + { + "objectID": "pages/Bloque2/ti.html#ejercicio-8", + "href": "pages/Bloque2/ti.html#ejercicio-8", + "title": "TI: Ejercicios JS", + "section": "Ejercicio 8", + "text": "Ejercicio 8\nPartiendo de arrFinal, cree un nuevo array independiente llamado arrCopia, de forma que cualquier modificación posterior no afecte a arrFinal.", + "crumbs": [ + "Bloque II Programación", + "Repaso Intensivo", + "TI: Ejercicios JS" + ] + }, + { + "objectID": "pages/Bloque2/intensivo.html", + "href": "pages/Bloque2/intensivo.html", + "title": "Repaso Intensivo JS", "section": "", - "text": "El objetivo de esta tarea es aplicar los conocimientos básicos de programación orientada a objetos en JavaScript, haciendo uso de las clases definidas en ES6. En particular, se evaluará el uso de:\n\nherencia entre clases\nencapsulación mediante propiedades privadas\ngetters y setters usando las palabras clave get y set\nmétodos estáticos\nvalidación de datos\n\nPara ello se definirá una jerarquía de clases que represente un equipo de Hyperloop.", + "text": "Contenido\nRepaso intensivo de JavaScript, tiene como objetivo dar una introducción del lenguaje, a usuarios que ya tengan experiencia previa programando.\nDescargar archivo de código (click derecho guardar enlace como)", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TAI: La objetización de las personas" + "Repaso Intensivo JS" ] }, { - "objectID": "pages/Bloque2/tia.html#entregar", - "href": "pages/Bloque2/tia.html#entregar", - "title": "TAI: La objetización de las personas", - "section": "Entregar", - "text": "Entregar\nSe debe entregar un único archivo de JavaScript (.js) que contenga la solución completa a la tarea.", + "objectID": "pages/Bloque2/intensivo.html#variables-y-tipos-básicos", + "href": "pages/Bloque2/intensivo.html#variables-y-tipos-básicos", + "title": "Repaso Intensivo JS", + "section": "Variables y tipos básicos", + "text": "Variables y tipos básicos\n\nDeclaración de variables\nEn JavaScript moderno se utilizan let y const (evitar var).\n\nlet: permite reasignación\nconst: no permite reasignación\nconst NO significa inmutable\nJavaScript es de tipado dinámico\nEl tipo depende del valor, no de la variable\n\nTipos primitivos:\n\nstring\nnumber\nboolean\nnull\nundefined\n\nlet edad = 12; // number\nlet altura = 1.8; // number\nlet nombre = \"Javier\"; // string\nlet casado = false; // boolean\n\nlet ordenador = null; // ausencia intencionada de valor\nlet direccion; // undefined\n\n\nUso de const\nconst dni = \"1235678L\";\ndni = \"23\"; // Error\n\nconst no significa inmutable\nconst dni = \"12345678L\";\ndni = \"87654321X\"; // Error\nPero:\nconst arr = [1, 2, 3];\narr.push(4); // permitido\n\n\n\nTipado dinámico\n\nJavaScript es de tipado dinámico\nEl tipo depende del valor, no de la variable\nUna variable puede cambiar de tipo durante la ejecución\n\nlet x = \"hola\";\nx = 42; // válido\nx = true; // válido\nEste comportamiento se conoce como shadowing o cambio dinámico de tipo. En el ejemplo anterior solo existe una variable X cuyo tipo pasa de Number a boolean", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TAI: La objetización de las personas" + "Repaso Intensivo JS" ] }, { - "objectID": "pages/Bloque2/tia.html#realización-de-la-tarea", - "href": "pages/Bloque2/tia.html#realización-de-la-tarea", - "title": "TAI: La objetización de las personas", - "section": "Realización de la tarea", - "text": "Realización de la tarea\nEl archivo JavaScript debe estar claramente dividido en dos partes:\n\nla implementación de clases, donde se definirán todas las clases necesarias\n\nla zona de uso, donde se utilizarán las clases previamente definidas\n\n\nImplementación de clases\nTodas las clases deberán definirse utilizando la sintaxis de clases ES6, haciendo uso correcto de:\n\nclass\nextends\nsuper\npropiedades privadas (usando #)\ngetters y setters (get y set)\nmétodos estáticos\n\n\nClase Person\nDebe contener:\n\npropiedad privada name\npropiedad privada dni\nSe puede obtener tanto el nombre como el DNI, pero solo se puede modificar el nombre\nEl constructor recibirá:\n\nun nombre\nun NÚMERO de DNI\n\nEl constructor deberá calcular automáticamente la letra del DNI siguiendo el algoritmo oficial:\nhttps://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/dni/calculo-del-digito-de-control-del-nif-nie/\nMétodos y accesos:\n\ngetter name\nsetter name\ngetter dni\nmétodo getInfo() que devuelva un string con el nombre y el DNI completo\n\nSi los datos introducidos no son válidos, se lanzará un Error\n\n\n\nClase Member (clase hija de Person)\nRepresenta a un miembro del equipo de Hyperloop.\nDebe contener:\n\npropiedad privada department\npropiedad privada yearsExperience\n\n\nDepartamentos válidos\nLos únicos departamentos permitidos son:\n\n\"Managment\"\n\"Operaciones\"\n\"Avionics\"\n\"Electromagnetics\"\n\"Mechanics\"\n\nNo se permitirá ningún otro valor.\n\n\nRequisitos adicionales\n\nLa propiedad department:\n\nse accederá mediante:\n\ngetter department\nsetter department\n\n\nEl setter validará que el departamento sea válido\nyearsExperience debe ser un número mayor o igual que 0\n\n\n\nMétodo estático obligatorio\nLa clase Member debe incluir el siguiente método estático:\n\nisValidDepartment(department)\n\ndevuelve true si el departamento es válido\ndevuelve false en caso contrario\ndeberá utilizarse tanto en el constructor como en el setter de department\n\n\n\n\nMétodos públicos\n\ngetter yearsExperience\nmétodo getInfo():\n\nsobrescribe el método de Person\nincluye el departamento y los años de experiencia\n\n\n\n\n\nClase Engineer (clase hija de Member)\nRepresenta a un ingeniero del equipo.\nDebe contener:\n\npropiedad privada specialty\nLa especialidad será un string no vacío\n\n\nAccesos y métodos\n\ngetter specialty\nmétodo getInfo():\n\nsobrescribe el método anterior\nincluye la especialidad del ingeniero\n\n\n\n\n\nClase Team\nRepresenta el equipo completo de Hyperloop.\nDebe contener:\n\npropiedad privada members, que será un array de objetos Member\n\n\nMétodos públicos\n\naddMember(member)\n\nsolo permite añadir objetos que sean instancia de Member\n\nremoveMemberByDni(dni)\nlistMembers()\n\nmuestra por consola la información de todos los miembros del equipo\n\ncountMembersByDepartment(department)\n\ndevuelve cuántos miembros pertenecen a un determinado departamento\n\n\n\n\n\n\nZona de uso\nEn la zona de uso del archivo JavaScript se debe:\n\nCrear al menos:\n\n2 objetos Engineer de departamentos distintos\n1 objeto Member que no sea ingeniero\n\nCrear un objeto Team\nAñadir los miembros al equipo\nUtilizar explícitamente:\n\ngetters\nsetters\nel método estático de validación\n\nMostrar por consola:\n\nel listado completo del equipo\nel número de miembros por departamento\n\nProbar al menos un caso incorrecto:\n\npor ejemplo, asignar un departamento no válido\no intentar añadir un objeto que no sea Member\n\nDemostrar que el error se gestiona correctamente", + "objectID": "pages/Bloque2/intensivo.html#null-vs-undefined", + "href": "pages/Bloque2/intensivo.html#null-vs-undefined", + "title": "Repaso Intensivo JS", + "section": "null vs undefined", + "text": "null vs undefined\n\nundefined: variable declarada pero sin valor\nnull: ausencia intencionada de valor\n\nJavaScript distingue entre:\n\n“todavía no hay valor” y “no hay valor”\n\nconsole.log(ordenador); // null\nconsole.log(direccion); // undefined", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TAI: La objetización de las personas" + "Repaso Intensivo JS" ] }, { - "objectID": "pages/Bloque2/tia.html#apéndice-comprobaciones-y-errores-en-javascript-necesario-para-la-tarea", - "href": "pages/Bloque2/tia.html#apéndice-comprobaciones-y-errores-en-javascript-necesario-para-la-tarea", - "title": "TAI: La objetización de las personas", - "section": "Apéndice: comprobaciones y errores en JavaScript (NECESARIO PARA LA TAREA)", - "text": "Apéndice: comprobaciones y errores en JavaScript (NECESARIO PARA LA TAREA)\nEn el desarrollo de la tarea pueden aparecer algunas comprobaciones y mecanismos de control de errores que es necesario saber implementar por cuenta propia. Su inclusión tiene como objetivo facilitar la robustez del código, y forman parte de los contenidos evaluables de la tarea.\n\nUso de Error\nCuando se detecta una situación incorrecta (por ejemplo, un valor no válido o un uso indebido de una clase), se puede lanzar un error utilizando:\nthrow new Error(\"Mensaje de error\");\nEsto indica claramente que algo no es correcto y detiene la ejecución normal del programa.\n\n\nUso de instanceof\nEl operador instanceof se utiliza para comprobar si un objeto ha sido creado a partir de una clase concreta.\nobjeto instanceof Clase\nDevuelve true si el objeto pertenece a esa clase y false en caso contrario.\n\n\nUso de typeof\nEl operador typeof permite comprobar el tipo de datos simples como strings o números.\ntypeof variable\nEjemplos:\ntypeof \"texto\" // \"string\"\ntypeof 10 // \"number\"\nSe utiliza para validar los datos recibidos por constructores o setters. Para comprobar clases u objetos personalizados debe usarse instanceof, no typeof.", + "objectID": "pages/Bloque2/intensivo.html#aritmética-y-operadores", + "href": "pages/Bloque2/intensivo.html#aritmética-y-operadores", + "title": "Repaso Intensivo JS", + "section": "Aritmética y operadores", + "text": "Aritmética y operadores\n\nOperadores aritméticos\nlet a = 12, b = 4;\n\na + b\na - b\na * b\na / b\na % b\na = a + b;\na += b;\na -= b;\na *= b;\n\nPotencias\na**b // Power\nIncrementos:\nb--; b++;\n--b; ++b;\n\n\n\nStrings y concatenación\na = \"hola \";\nb = \"mundo\";\na + b;\n\n\nComparación\n\n== compara valor (evitar)\n=== compara valor y tipo (usar)\n\n\n\nOperadores lógicos\n\n&& AND\n|| OR\n! NOT\n\n\n\nComparaciones\n\n== compara solo valor (evitar)\n=== compara valor y tipo (usar siempre, aunque sea innecesario)\n\n5 == \"5\"; // true\n5 === \"5\"; // false\n\n\nOperadores lógicos\n\n&& AND\n|| OR\n! NOT\n\n(a > 0) && (b < 10)", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "TAI: La objetización de las personas" + "Repaso Intensivo JS" ] }, { - "objectID": "pages/Bloque2/MAclases.html", - "href": "pages/Bloque2/MAclases.html", - "title": "MA: Clases ES6", - "section": "", - "text": "Contenido\nRepaso intensivo de clases en JavaScript (ES6+), orientado a usuarios con experiencia previa en programación y familiarizados con funciones, objetos y arrays.", + "objectID": "pages/Bloque2/intensivo.html#estructuras-de-control", + "href": "pages/Bloque2/intensivo.html#estructuras-de-control", + "title": "Repaso Intensivo JS", + "section": "Estructuras de control", + "text": "Estructuras de control\n\nCondicionales\nif (a === b) {\n\n} else if (a > b) {\n\n} else {\n\n}\n\n\nBucles\n\nwhile\nlet x = 20;\nwhile (x < 50) {\n x += 10;\n}\n\n\nfor\nfor (let i = 0; i < 10; i++) {\n // iteración\n}", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "MA: Clases ES6" + "Repaso Intensivo JS" ] }, { - "objectID": "pages/Bloque2/MAclases.html#programación-orientada-a-objetos-en-javascript", - "href": "pages/Bloque2/MAclases.html#programación-orientada-a-objetos-en-javascript", - "title": "MA: Clases ES6", - "section": "Programación orientada a objetos en JavaScript", - "text": "Programación orientada a objetos en JavaScript\nJavaScript es un lenguaje basado en prototipos, pero desde ES6 introduce la sintaxis class, que:\n\nEs azúcar sintáctico sobre el sistema de prototipos\nFacilita la escritura y lectura de código OO\nNo convierte a JS en un lenguaje basado en clases clásicas", + "objectID": "pages/Bloque2/intensivo.html#funciones", + "href": "pages/Bloque2/intensivo.html#funciones", + "title": "Repaso Intensivo JS", + "section": "Funciones", + "text": "Funciones\n\nEncapsulan lógica reutilizable\nPueden recibir parámetros\nPueden devolver valores\nSon ciudadanos de primera clase\n\n\nFunción clásica\nfunction sumar2(num, num2 = 2) {\n num += num2;\n return num;\n}\nPaso de variables por valor:\nlet a = 7;\nlet b = sumar2(a, a); // 14\na; // 7\n\n\nFunciones flecha y orden superior\nconst concatenarHola = input => input + \" Hola\";\nconcatenarHola(\"sdf\");\nfunction ejecuta(fun) {\n fun();\n}\n\nejecuta(() => { console.log(\"hola\"); });\n\n\nFunciones propias de strings\nlet a = \"jsadfsadf \";\na.trim(); // Suprimir espacios adicionales\na.split('a'); // Divide el string en un array c\na.length;\n\n\nFunciones flecha\nconst cuadrado = n => n ** 2;\nForma extendida:\nconst cuadrado = (n) => {\n return n ** 2;\n};\n\n\nFunciones como ciudadanos de primera clase\nLas funciones pueden:\n\nAsignarse a variables\nPasarse como argumentos\nDevolverse como resultado\n\nfunction ejecutar(f) {\n f();\n}\n\nejecutar(() => console.log(\"Hola\"));", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "MA: Clases ES6" + "Repaso Intensivo JS" ] }, { - "objectID": "pages/Bloque2/MAclases.html#definición-de-una-clase", - "href": "pages/Bloque2/MAclases.html#definición-de-una-clase", - "title": "MA: Clases ES6", - "section": "Definición de una clase", - "text": "Definición de una clase\n\nSintaxis básica\nclass Persona {\n constructor(nombre, edad) {\n this.nombre = nombre;\n this.edad = edad;\n }\n}\n\nclass: palabra clave\nconstructor: método especial de inicialización\nthis: referencia a la instancia actual", + "objectID": "pages/Bloque2/intensivo.html#arrays-base", + "href": "pages/Bloque2/intensivo.html#arrays-base", + "title": "Repaso Intensivo JS", + "section": "Arrays (base)", + "text": "Arrays (base)\n\nLista ordenada\nÍndices empiezan en 0\nPropiedad length\n\nlet cajon = [8, \"hola\", true, () => { return 7 }];\n\nAcceso\ncajon[0] // 8\ncajon[2] = \"rino\"; // modificamos la entrada 2 \n\n\nAdiciones\ncajon.push(false);\ncajon.unshift(0);\n\n\nEliminaciones\ncajon.pop();\ncajon.shift();\ncajon.length;", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "MA: Clases ES6" + "Repaso Intensivo JS" ] }, { - "objectID": "pages/Bloque2/MAclases.html#creación-de-instancias", - "href": "pages/Bloque2/MAclases.html#creación-de-instancias", - "title": "MA: Clases ES6", - "section": "Creación de instancias", - "text": "Creación de instancias\nconst p1 = new Persona(\"Javier\", 45);\nconst p2 = new Persona(\"Ana\", 32);\n\nnew crea un nuevo objeto\nEjecuta automáticamente constructor", + "objectID": "pages/Bloque2/intensivo.html#objetos", + "href": "pages/Bloque2/intensivo.html#objetos", + "title": "Repaso Intensivo JS", + "section": "Objetos", + "text": "Objetos\nUn objeto representa una entidad mediante estructura clave–valor.\nlet gente = { pepe: 7, juanes: 8, andreas: 10, fran: [4, 2] };\n\nModificación\ngente.andreas = 32;\ngente.pepe++;\n\n\nAcceso dinámico\nlet nombre = \"pablo\";\n\ngente.nombre; // undefined\ngente[nombre] = 2; // añade propiedad", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "MA: Clases ES6" + "Repaso Intensivo JS" ] }, { - "objectID": "pages/Bloque2/MAclases.html#métodos-de-instancia", - "href": "pages/Bloque2/MAclases.html#métodos-de-instancia", - "title": "MA: Clases ES6", - "section": "Métodos de instancia", - "text": "Métodos de instancia\nLos métodos se definen sin function y se comparten vía prototipo.\nclass Persona {\n constructor(nombre, edad) {\n this.nombre = nombre;\n this.edad = edad;\n }\n\n saludar() {\n return `Hola, soy ${this.nombre}`;\n }\n\n cumple() {\n this.edad++;\n }\n}\nUso:\np1.saludar();\np1.cumple();", + "objectID": "pages/Bloque2/intensivo.html#referencias-vs-valores", + "href": "pages/Bloque2/intensivo.html#referencias-vs-valores", + "title": "Repaso Intensivo JS", + "section": "Referencias vs valores", + "text": "Referencias vs valores\n\nCopia por valor\nlet a = 5;\nlet b = a;\nb++;\na no cambia.\n\n\nCopia por referencia\nlet e3 = [\"juan\", \"pepe\"];\nlet d = e3;\n\nd.push(\"andrés\");\nAmbas variables apuntan al mismo array.\nconst poblacion = gente;\npoblacion[\"julio\"] = 8;\nLa copia por refencia se aplica a objetos y arrays\nlet x = [\"juan\", \"pepe\"];\nlet y = x;\n\ny.push(\"andrés\"); // Se añade en x e y pues son el mismo objeto\nAmbas variables apuntan al mismo objeto.", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "MA: Clases ES6" + "Repaso Intensivo JS" ] }, { - "objectID": "pages/Bloque2/MAclases.html#métodos-vs-funciones-flecha", - "href": "pages/Bloque2/MAclases.html#métodos-vs-funciones-flecha", - "title": "MA: Clases ES6", - "section": "Métodos vs funciones flecha", - "text": "Métodos vs funciones flecha\nNo usar arrow functions como métodos de clase (salvo casos concretos):\nclass MalEjemplo {\n metodo = () => {\n console.log(this);\n };\n}\n\nRompe el modelo prototípico\nMayor consumo de memoria", + "objectID": "pages/Bloque2/intensivo.html#spread-operator-...", + "href": "pages/Bloque2/intensivo.html#spread-operator-...", + "title": "Repaso Intensivo JS", + "section": "Spread operator (...)", + "text": "Spread operator (...)\n\nExpande arrays u objetos\nPermite copiar y combinar\nCopia superficial\n\n\nArrays\nJavier es añadido a arr2, pero no a arr.\nlet arr = [\"Alice\", \"Bob\", \"Kevin\"];\nlet arr2 = [...arr, \"Javier\"];\n\n\nObjetos\nOcurre lo mismo con los objetos\nconst sociedad = { ...poblacion, julia: 12 };", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "MA: Clases ES6" + "Repaso Intensivo JS" ] }, { - "objectID": "pages/Bloque2/MAclases.html#propiedades-públicas", - "href": "pages/Bloque2/MAclases.html#propiedades-públicas", - "title": "MA: Clases ES6", - "section": "Propiedades públicas", - "text": "Propiedades públicas\nLas propiedades se suelen declarar en el constructor:\nclass Coche {\n constructor(marca, km = 0) {\n this.marca = marca;\n this.km = km;\n }\n}\nUso:\nconst c = new Coche(\"Toyota\");\nc.km += 100;", + "objectID": "pages/Bloque2/intensivo.html#funciones-de-array-js-moderno", + "href": "pages/Bloque2/intensivo.html#funciones-de-array-js-moderno", + "title": "Repaso Intensivo JS", + "section": "Funciones de array (JS moderno)", + "text": "Funciones de array (JS moderno)\nVamos a trabajar con un ejemplo completo, típico en programación funcional.\n\nDatos de partida\nlet y = [2, 4, 6, 7];\n\n\nFunción cuadrado\nDefinimos una función que, dado un número, devuelve su cuadrado:\nconst cuadrado = n => n ** 2;\nEs equivalente a:\nconst cuadrado = (n) => {\n return n ** 2;\n};\n\n\nmap: transformar elementos\nAplicamos map para obtener un nuevo array con los cuadrados:\nconst y2 = y.map(cuadrado);\nResultado:\n[4, 16, 36, 49]\n\n\nfilter: seleccionar elementos\nDefinimos una función que comprueba si un número es par:\nconst even = n => n % 2 === 0;\nLa usamos con filter:\nconst yEven = y.filter(even);\n\n\nEncadenamiento (estilo declarativo)\nPodemos encadenar ambas operaciones:\ny\n .map(n => n ** 2)\n .filter(n => n % 2 === 0);\n\nEste estilo es declarativo: describimos qué queremos hacer con los datos, no cómo recorrerlos.", "crumbs": [ "Bloque II Programación", "Repaso Intensivo", - "MA: Clases ES6" + "Repaso Intensivo JS" ] }, { - "objectID": "pages/Bloque2/MAclases.html#getters-y-setters", - "href": "pages/Bloque2/MAclases.html#getters-y-setters", - "title": "MA: Clases ES6", - "section": "Getters y setters", - "text": "Getters y setters\nPermiten acceder como propiedades a lógica encapsulada.\nclass Rectangulo {\n constructor(ancho, alto) {\n this.ancho = ancho;\n this.alto = alto;\n }\n\n get area() {\n return this.ancho * this.alto;\n }\n\n set escala(factor) {\n this.ancho *= factor;\n this.alto *= factor;\n }\n}\nUso:\nconst r = new Rectangulo(2, 3);\nr.area; // 6\nr.escala = 2;\nr.area; // 24", - "crumbs": [ - "Bloque II Programación", - "Repaso Intensivo", - "MA: Clases ES6" - ] + "objectID": "pages/Bloque3/intermedio.html#controlled-inputs", + "href": "pages/Bloque3/intermedio.html#controlled-inputs", + "title": "React III", + "section": "Controlled Inputs", + "text": "Controlled Inputs\nMotivación\nHasta ahora se ha trabajado con eventos capturando acciones del usuario.\nSin embargo, al trabajar con formularios surge una cuestión fundamental:\n\n¿Quién controla el valor del input?\n¿El DOM o React?" + }, + { + "objectID": "pages/Bloque3/intermedio.html#hooks-repaso", + "href": "pages/Bloque3/intermedio.html#hooks-repaso", + "title": "React III", + "section": "Hooks (Repaso)", + "text": "Hooks (Repaso)\n\nFunción especial que permite modificar las propiedades internas de los componentes\nCaracterísticas avanzadas\nModificación del life-cycle\nNormalmente forma use____" + }, + { + "objectID": "pages/Bloque3/intermedio.html#useeffect", + "href": "pages/Bloque3/intermedio.html#useeffect", + "title": "React III", + "section": "useEffect", + "text": "useEffect\n\nuseEffect es un Hook que permite ejecutar efectos secundarios dentro de un componente funcional.\nUn efecto secundario es cualquier operación que no sea simplemente devolver JSX (por ejemplo: peticiones a un servidor, temporizadores, suscripciones).\nSe ejecuta después de que el componente se renderiza en el DOM." + }, + { + "objectID": "pages/Bloque3/intermedio.html#fetch", + "href": "pages/Bloque3/intermedio.html#fetch", + "title": "React III", + "section": "fetch()", + "text": "fetch()\nHasta ahora nuestros componentes eran completamente locales.\nSin embargo, en aplicaciones reales necesitamos:\n\nDescargar datos\n\nConectarnos a servidores\n\nTrabajar con APIs externas\n\nPara ello utilizamos fetch()." + }, + { + "objectID": "pages/Bloque3/intermedio.html#async-y-await", + "href": "pages/Bloque3/intermedio.html#async-y-await", + "title": "React III", + "section": "async y await", + "text": "async y await\nHasta ahora hemos utilizado fetch() con encadenamiento.\nExiste una forma más clara y estructurada de escribir código asíncrono:\n\nasync\nawait\n\nSu objetivo es hacer que el código sea más legible." }, { - "objectID": "pages/Bloque2/MAclases.html#herencia-extends", - "href": "pages/Bloque2/MAclases.html#herencia-extends", - "title": "MA: Clases ES6", - "section": "Herencia (extends)", - "text": "Herencia (extends)\nJavaScript soporta herencia simple.\nclass Empleado extends Persona {\n constructor(nombre, edad, salario) {\n super(nombre, edad);\n this.salario = salario;\n }\n\n salarioAnual() {\n return this.salario * 12;\n }\n}\n\nextends: herencia\nsuper(): llama al constructor padre (obligatorio)", + "objectID": "pages/Bloque3/intermedio.html#ejemplo-con-la-pokeapi", + "href": "pages/Bloque3/intermedio.html#ejemplo-con-la-pokeapi", + "title": "React III", + "section": "Ejemplo con la Pokeapi", + "text": "Ejemplo con la Pokeapi\nPoke-API\nDownload Code" + }, + { + "objectID": "pages/Bloque3/Intermedio.html", + "href": "pages/Bloque3/Intermedio.html", + "title": "React III", + "section": "", + "text": "Contenido", "crumbs": [ - "Bloque II Programación", - "Repaso Intensivo", - "MA: Clases ES6" + "Bloque III Interacción", + "Semana 9", + "React III" ] }, { - "objectID": "pages/Bloque2/MAclases.html#sobrescritura-de-métodos", - "href": "pages/Bloque2/MAclases.html#sobrescritura-de-métodos", - "title": "MA: Clases ES6", - "section": "Sobrescritura de métodos", - "text": "Sobrescritura de métodos\nclass Empleado extends Persona {\n saludar() {\n return `Empleado: ${this.nombre}`;\n }\n}\n\nSi el método existe en la clase hija, sobrescribe al del padre", + "objectID": "pages/Bloque3/Intermedio.html#controlled-inputs", + "href": "pages/Bloque3/Intermedio.html#controlled-inputs", + "title": "React III", + "section": "Controlled Inputs", + "text": "Controlled Inputs\n\nMotivación\nHasta ahora se ha trabajado con eventos capturando acciones del usuario.\nSin embargo, al trabajar con formularios surge una cuestión fundamental:\n\n¿Quién controla el valor del input?\n¿El DOM o React?\n\nRecordemos que en HTML puro o, el valor de un <input> está gestionado directamente por el DOM.\nEn React, podemos hacer que el valor del input esté controlado por el estado del componente.\nA esto lo llamamos controlled input.\n\n\n¿Qué es un controlled input?\nUn controlled input es un elemento de formulario cuyo valor:\n\nEstá almacenado en el estado del componente\nSe actualiza mediante un evento (onChange)\nSe renderiza utilizando ese mismo estado\n\nÚnica fuente de verdad (single source of truth).\n\n\nEstructura del componente controlled\nimport { useState } from \"react\";\nfunction FormularioNombre() {\n\n const [nombre, setNombre] = useState(\"\");\n\n function manejarCambio(event) {\n setNombre(event.target.value);\n }\n\n return (\n <div>\n <input type=\"text\" \n value={nombre}\n onChange={manejarCambio}\n />\n <p>El nombre introducido es: {nombre}</p>\n </div>\n );\n}\n\nAnálisis del ejemplo\nEl valor del input se sincroniza con el estado\n\nDeclaramos una variable de estado: nombre\nAsociamos el atributo value del input a ese estado\nCapturamos el evento onChange\nActualizamos el estado con setNombre\n\nCada vez que el estado cambia: El componente se vuelve a ejecutar El JSX se vuelve a generar El valor del input se sincroniza con el estado\n\n\n\nEjemplo Formulario\nimport { useState } from \"react\";\n\nfunction FormularioSimple() {\n\n const [email, setEmail] = useState(\"\");\n\n function handleChange(event) {\n setEmail(event.target.value);\n }\n\n function handleSubmit(event) {\n event.preventDefault(); // Evita la recarga del navegador\n\n console.log(\"Formulario enviado\");\n console.log(\"Email:\", email);\n\n setEmail(\"\"); // Limpieza opcional del campo\n }\n\n return (\n <form onSubmit={handleSubmit}>\n <input \n type=\"email\"\n value={email}\n onChange={handleChange}\n />\n <button type=\"submit\">Enviar</button>\n </form>\n );\n}\nReferencia: https://es.react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable", "crumbs": [ - "Bloque II Programación", - "Repaso Intensivo", - "MA: Clases ES6" + "Bloque III Interacción", + "Semana 9", + "React III" ] }, { - "objectID": "pages/Bloque2/MAclases.html#uso-de-super-en-métodos", - "href": "pages/Bloque2/MAclases.html#uso-de-super-en-métodos", - "title": "MA: Clases ES6", - "section": "Uso de super en métodos", - "text": "Uso de super en métodos\nclass Empleado extends Persona {\n saludar() {\n return super.saludar() + \" (empleado)\";\n }\n}\nPermite reutilizar lógica del padre.", + "objectID": "pages/Bloque3/Intermedio.html#hooks-repaso", + "href": "pages/Bloque3/Intermedio.html#hooks-repaso", + "title": "React III", + "section": "Hooks (Repaso)", + "text": "Hooks (Repaso)\n\nFunción especial que permite modificar las propiedades internas de los componentes\nCaracterísticas avanzadas\nModificación del life-cycle\nNormalmente forma use____", "crumbs": [ - "Bloque II Programación", - "Repaso Intensivo", - "MA: Clases ES6" + "Bloque III Interacción", + "Semana 9", + "React III" ] }, { - "objectID": "pages/Bloque2/MAclases.html#métodos-estáticos", - "href": "pages/Bloque2/MAclases.html#métodos-estáticos", - "title": "MA: Clases ES6", - "section": "Métodos estáticos", - "text": "Métodos estáticos\nPertenecen a la clase, no a las instancias.\nclass Utilidades {\n static suma(a, b) {\n return a + b;\n }\n}\nUso:\nUtilidades.suma(2, 3);\nNo accesible desde instancias:\nnew Utilidades().suma; // undefined", + "objectID": "pages/Bloque3/Intermedio.html#useeffect", + "href": "pages/Bloque3/Intermedio.html#useeffect", + "title": "React III", + "section": "useEffect", + "text": "useEffect\n\nuseEffect es un Hook que permite ejecutar efectos secundarios dentro de un componente funcional.\nUn efecto secundario es cualquier operación que no sea simplemente devolver JSX (por ejemplo: peticiones a un servidor, temporizadores, suscripciones).\nSe ejecuta después de que el componente se renderiza en el DOM.\n\n\nMétodos de uso de useEffect\n\n1. Sin array de dependencias\nuseEffect(() => {\n console.log(\"Se ejecuta en cada render\");\n});\nComportamiento:\n\nSe ejecuta después de cada renderizado.\nNo existe control sobre la frecuencia.\nPuede generar bucles si modifica estado sin control.\n\nInterpretación conceptual:\nEl efecto acompaña siempre al render.\n\n\n2. Con array vacío\nuseEffect(() => {\n console.log(\"Se ejecuta solo una vez\");\n}, []);\nComportamiento:\n\nSe ejecuta únicamente tras el primer render.\nEquivalente conceptual al “montaje” del componente.\n\nUso habitual:\n\nPeticiones a servidor\nInicializaciones\nSuscripciones\n\nInterpretación conceptual:\nEl efecto ocurre una única vez al crear el componente.\n\n\n3. Con dependencias específicas\nuseEffect(() => {\n console.log(\"Se ejecuta cuando cambia contador\");\n}, [contador]);\nComportamiento:\n\nSe ejecuta tras el primer render.\nSe vuelve a ejecutar cuando cambia alguna variable del array.\n\nInterpretación conceptual:\nEl efecto depende del estado indicado.\nReact compara el valor anterior con el nuevo y decide si debe ejecutar el efecto.", "crumbs": [ - "Bloque II Programación", - "Repaso Intensivo", - "MA: Clases ES6" + "Bloque III Interacción", + "Semana 9", + "React III" ] }, { - "objectID": "pages/Bloque2/MAclases.html#campos-privados", - "href": "pages/Bloque2/MAclases.html#campos-privados", - "title": "MA: Clases ES6", - "section": "Campos privados (#)", - "text": "Campos privados (#)\nIntroducidos en ES2022.\nclass Cuenta {\n #saldo = 0;\n\n ingresar(cantidad) {\n this.#saldo += cantidad;\n }\n\n getSaldo() {\n return this.#saldo;\n }\n}\n\n#saldo es realmente privado\nNo accesible fuera de la clase", + "objectID": "pages/Bloque3/Intermedio.html#fetch", + "href": "pages/Bloque3/Intermedio.html#fetch", + "title": "React III", + "section": "fetch()", + "text": "fetch()\nHasta ahora nuestros componentes eran completamente locales.\nSin embargo, en aplicaciones reales necesitamos:\n\nDescargar datos\n\nConectarnos a servidores\n\nTrabajar con APIs externas\n\nPara ello utilizamos fetch().\n\nEjemplo mínimo de fetch\nfetch(\"https://pokeapi.co/api/v2/pokemon/1\")\n .then(response => response.json())\n .then(data => console.log(data));\nUtiliza las Promises\nInterpretación simple:\n\nSe hace una petición a una URL\n\nSe transforma la respuesta a formato JSON\n\nSe accede a los datos\n\n\n\nfetch() dentro de useEffect\nEn React, lo habitual es realizar la descarga cuando el componente se monta.\nPara ello:\n\nUtilizamos useEffect\nAñadimos array vacío []\nGuardamos los datos en el estado\n\n\n\nEjemplo integrado\nimport { useState, useEffect } from \"react\";\n\nfunction Pokemon() {\n\n const [pokemon, setPokemon] = useState(null);\n\n useEffect(() => {\n\n fetch(\"https://pokeapi.co/api/v2/pokemon/1\")\n .then(response => response.json())\n .then(data => setPokemon(data));\n\n }, []);\n\n if (!pokemon) return <p>Cargando...</p>;\n\n return (\n <div>\n <h2>{pokemon.name}</h2>\n <img \n src={pokemon.sprites.front_default} \n alt={pokemon.name} \n />\n </div>\n );\n}\n\n\nFlujo conceptual\n\nRender inicial\n\nSe ejecuta useEffect\n\nSe lanza la petición\n\nSe actualiza el estado\n\nNuevo render con los datos\n\n\n\nAdvertencia importante\nSi eliminamos el array vacío:\nuseEffect(() => {\n fetch(\"https://pokeapi.co/api/v2/pokemon/1\")\n .then(res => res.json())\n .then(data => setPokemon(data));\n});\nEl efecto se ejecutará en cada render.\nComo actualizar estado provoca render, se generará un bucle infinito.\nuseEffect conecta React con el exterior.\nfetch() permite traer datos del exterior.\nEl estado vuelve a controlar el render.\nEn la siguiente sección formalizaremos esto utilizando async / await.", "crumbs": [ - "Bloque II Programación", - "Repaso Intensivo", - "MA: Clases ES6" + "Bloque III Interacción", + "Semana 9", + "React III" ] }, { - "objectID": "pages/Bloque2/MAclases.html#clases-y-objetos-literales", - "href": "pages/Bloque2/MAclases.html#clases-y-objetos-literales", - "title": "MA: Clases ES6", - "section": "Clases y objetos literales", - "text": "Clases y objetos literales\nEsto:\nconst a = {\n x: 1,\n inc() { this.x++; }\n};\nEs equivalente conceptualmente a una instancia única.\nUsar class cuando:\n\nHay múltiples instancias\nExiste estado y comportamiento común\nSe necesita herencia o abstracción", + "objectID": "pages/Bloque3/Intermedio.html#async-y-await", + "href": "pages/Bloque3/Intermedio.html#async-y-await", + "title": "React III", + "section": "async y await", + "text": "async y await\nHasta ahora hemos utilizado fetch() con encadenamiento.\nExiste una forma más clara y estructurada de escribir código asíncrono:\n\nasync\nawait\n\nSu objetivo es hacer que el código sea más legible.\n\n¿Qué significa async?\n\nSe coloca delante de una función\nIndica que la función trabajará con operaciones asíncronas\n\nasync function ejemplo() {\n console.log(\"Función asíncrona\");\n}\n\n\n¿Qué significa await?\n\nSolo puede utilizarse dentro de una función async\nDetiene la ejecución hasta que la operación finaliza\nHace que el código se lea de forma secuencial\n\n\n\nEjemplo básico con fetch\nasync function obtenerPokemon() {\n\n const response = await fetch(\n \"https://pokeapi.co/api/v2/pokemon/1\"\n );\n\n const data = await response.json();\n\n console.log(data);\n}\nInterpretación conceptual:\n\nSe realiza la petición\nSe espera la respuesta\nSe transforma a JSON\nSe trabaja con los datos\n\nEl código se lee de arriba hacia abajo.\n\n\nasync / await dentro de useEffect\nEn React, lo habitual es declarar una función interna y ejecutarla.\n\n\nEjemplo completo\nimport { useState, useEffect } from \"react\";\n\nfunction Pokemon() {\n\n const [pokemon, setPokemon] = useState(null);\n\n useEffect(() => {\n\n async function fetchData() {\n\n const response = await fetch(\n \"https://pokeapi.co/api/v2/pokemon/1\"\n );\n\n const data = await response.json();\n\n setPokemon(data);\n }\n\n fetchData();\n\n }, []);\n\n if (!pokemon) return <p>Cargando...</p>;\n\n return (\n <div>\n <h2>{pokemon.name}</h2>\n <img \n src={pokemon.sprites.front_default} \n alt={pokemon.name} \n />\n </div>\n );\n}\n\n\n¿Por qué no hacer directamente?\nuseEffect(async () => {\n ...\n}, []);\nPorque useEffect no debe recibir una función asíncrona directamente.\nPor eso declaramos la función dentro y luego la ejecutamos.\n\n\nFlujo mental con async / await\n\nRender inicial\n\nSe ejecuta useEffect\n\nSe llama a la función asíncrona\n\nawait espera la respuesta\n\nSe actualiza el estado\n\nNuevo render\n\nasync / await no cambia lo que hace el programa.\nSolo cambia la forma de escribirlo:\nMás claro.\nMás estructurado.\nMás fácil de mantener.", "crumbs": [ - "Bloque II Programación", - "Repaso Intensivo", - "MA: Clases ES6" + "Bloque III Interacción", + "Semana 9", + "React III" ] }, { - "objectID": "pages/Bloque2/MAclases.html#clases-prototípicas-pre-es6", - "href": "pages/Bloque2/MAclases.html#clases-prototípicas-pre-es6", - "title": "MA: Clases ES6", - "section": "Clases prototípicas (pre-ES6)", - "text": "Clases prototípicas (pre-ES6)\nJavaScript siempre ha sido un lenguaje basado en prototipos. Antes de ES6, la creación de objetos y herencia se realizaba mediante funciones constructoras y el prototipo.\nEn este repaso no entraremos en detalle en este modelo.\nBasta con saber que:\n\nLas clases ES6 no sustituyen al modelo prototípico\nSon una capa de abstracción sobre él\nTodo el comportamiento sigue resolviéndose vía prototipos\n\nPara profundizar:\n\nhttps://developer.mozilla.org/es/docs/Web/JavaScript/Inheritance_and_the_prototype_chain\n\nfunction Persona(nombre) {\nthis.nombre = nombre;\n}\n\nPersona.prototype.saludar = function () {\nreturn this.nombre;\n};\nvs\nclass Persona {\n constructor(nombre) {\n this.nombre = nombre;\n }\n\n saludar() {\n return this.nombre;\n }\n}", + "objectID": "pages/Bloque3/Intermedio.html#ejemplo-con-la-pokeapi", + "href": "pages/Bloque3/Intermedio.html#ejemplo-con-la-pokeapi", + "title": "React III", + "section": "Ejemplo con la Pokeapi", + "text": "Ejemplo con la Pokeapi\nPoke-API\nDownload Code", "crumbs": [ - "Bloque II Programación", - "Repaso Intensivo", - "MA: Clases ES6" + "Bloque III Interacción", + "Semana 9", + "React III" ] }, { @@ -1121,167 +1377,84 @@ ] }, { - "objectID": "pages/Bloque3/dom.html#qué-es-el-dom", - "href": "pages/Bloque3/dom.html#qué-es-el-dom", - "title": "DOM", - "section": "¿Qué es el DOM?", - "text": "¿Qué es el DOM?\nEl DOM (Document Object Model) es la representación en memoria que el navegador crea a partir del HTML.\n\nEl HTML es estático\nEl DOM es dinámico\nJavaScript interactúa con el DOM, no con el HTML original\n\n\nEl DOM es la página web viva dentro del navegador." - }, - { - "objectID": "pages/Bloque3/dom.html#el-dom-como-árbol", - "href": "pages/Bloque3/dom.html#el-dom-como-árbol", - "title": "DOM", - "section": "El DOM como árbol", - "text": "El DOM como árbol\nEl DOM tiene estructura de árbol (grafo):\n\nCada etiqueta HTML es un nodo\nLos nodos tienen relaciones (padre, hijos, hermanos)\n\nEjemplo:\n<body>\n <h1>Título</h1>\n <button>Click</button>\n</body>" - }, - { - "objectID": "pages/Bloque3/dom.html#acceso-al-dom-desde-javascript", - "href": "pages/Bloque3/dom.html#acceso-al-dom-desde-javascript", - "title": "DOM", - "section": "Acceso al DOM desde JavaScript", - "text": "Acceso al DOM desde JavaScript\nEl navegador nos proporciona el objeto global document, que permite:\n\nBuscar elementos\nLeer su contenido\nModificar la interfaz\n\ndocument\ndocument.body" - }, - { - "objectID": "pages/Bloque3/dom.html#selectores", - "href": "pages/Bloque3/dom.html#selectores", - "title": "DOM", - "section": "Selectores", - "text": "Selectores\nPor ID\ndocument.getElementById(\"count\")\ndocument.querySelector(\"#count\")\nPor etiqueta\ndocument.querySelector(\"button\")" - }, - { - "objectID": "pages/Bloque3/dom.html#leer-y-modificar-elementos", - "href": "pages/Bloque3/dom.html#leer-y-modificar-elementos", - "title": "DOM", - "section": "Leer y modificar elementos", - "text": "Leer y modificar elementos\nelement.textContent\nelement.textContent = \"Nuevo texto\"\nelement.classList.add(\"active\")\nelement.classList.remove(\"active\")" - }, - { - "objectID": "pages/Bloque3/dom.html#eventos", - "href": "pages/Bloque3/dom.html#eventos", - "title": "DOM", - "section": "Eventos", - "text": "Eventos\nEl DOM permite reaccionar a acciones del usuario mediante eventos.\nbutton.addEventListener(\"click\", () => {\n // código a ejecutar\n});\nFlujo típico:\nUsuario → Evento → JavaScript → DOM actualizado" - }, - { - "objectID": "pages/Bloque3/dom.html#ejemplo-contador-con-botón", - "href": "pages/Bloque3/dom.html#ejemplo-contador-con-botón", - "title": "DOM", - "section": "Ejemplo: contador con botón", - "text": "Ejemplo: contador con botón\nHTML\n<h1 id=\"count\">0</h1>\n<button id=\"btn\">Sumar 1</button>\nJavaScript\nlet count = 0;\n\nconst countEl = document.querySelector(\"#count\");\nconst btn = document.querySelector(\"#btn\");\n\nbtn.addEventListener(\"click\", () => {\n count++;\n countEl.textContent = count;\n});" - }, - { - "objectID": "pages/Bloque3/dom.html#más-ejemplos", - "href": "pages/Bloque3/dom.html#más-ejemplos", - "title": "DOM", - "section": "Más ejemplos", - "text": "Más ejemplos\nEj1: Show input\nEj2: Par e Impar\nEj3: Toggle\nEj4: Creación dinámica\nEj5: Validación básica" - }, - { - "objectID": "pages/Bloque3/DOM.html", - "href": "pages/Bloque3/DOM.html", - "title": "DOM", - "section": "", - "text": "El DOM (Document Object Model) es la representación en memoria que el navegador crea a partir del HTML.\n\nEl HTML es estático\nEl DOM es dinámico\nJavaScript interactúa con el DOM, no con el HTML original\n\n\nEl DOM es la página web viva dentro del navegador.", - "crumbs": [ - "Bloque III Interacción", - "Semana 6", - "DOM" - ] - }, - { - "objectID": "pages/Bloque3/DOM.html#qué-es-el-dom", - "href": "pages/Bloque3/DOM.html#qué-es-el-dom", - "title": "DOM", + "objectID": "pages/Bloque3/MAcss2.html", + "href": "pages/Bloque3/MAcss2.html", + "title": "MA: CSS Flex y CSS", "section": "", - "text": "El DOM (Document Object Model) es la representación en memoria que el navegador crea a partir del HTML.\n\nEl HTML es estático\nEl DOM es dinámico\nJavaScript interactúa con el DOM, no con el HTML original\n\n\nEl DOM es la página web viva dentro del navegador.", + "text": "Además de las propiedades estudiadas de CSS también hay algunas críticas que debido a la falta de tiempo no se han podido explicar como es el caso de display a continuación estos dos vídeos profundizan en los modos flex y grid formas diferentes de diseñar la estructura de la página", "crumbs": [ "Bloque III Interacción", "Semana 6", - "DOM" + "MA: CSS Flex y CSS" ] }, { - "objectID": "pages/Bloque3/DOM.html#el-dom-como-árbol", - "href": "pages/Bloque3/DOM.html#el-dom-como-árbol", - "title": "DOM", - "section": "El DOM como árbol", - "text": "El DOM como árbol\nEl DOM tiene estructura de árbol (grafo):\n\nCada etiqueta HTML es un nodo\nLos nodos tienen relaciones (padre, hijos, hermanos)\n\nEjemplo:\n<body>\n <h1>Título</h1>\n <button>Click</button>\n</body>\nRepresentación conceptual:\ndocument\n └─ body\n ├─ h1\n └─ button", - "crumbs": [ - "Bloque III Interacción", - "Semana 6", - "DOM" - ] + "objectID": "pages/Bloque3/reactI.html#sintaxis-jsx", + "href": "pages/Bloque3/reactI.html#sintaxis-jsx", + "title": "React I", + "section": "Sintaxis JSX", + "text": "Sintaxis JSX\n¿Qué es la sintaxis JSX?\n\nJSX (JavaScript XML) es una extensión de JavaScript utilizada en React.\n\nPermite escribir estructuras similares a HTML directamente dentro del código JavaScript.\n\nFacilita la creación y lectura de interfaces de usuario, integrando lógica y presentación.\n\nAunque su apariencia es HTML, JSX se transpila a JavaScript puro antes de ejecutarse en el navegador.\nForma cómoda de almacenar etiquetas html como variables de JS" }, { - "objectID": "pages/Bloque3/DOM.html#acceso-al-dom-desde-javascript", - "href": "pages/Bloque3/DOM.html#acceso-al-dom-desde-javascript", - "title": "DOM", - "section": "Acceso al DOM desde JavaScript", - "text": "Acceso al DOM desde JavaScript\nEl navegador nos proporciona el objeto global document, que permite:\n\nBuscar elementos\nLeer su contenido\nModificar la interfaz\n\ndocument\ndocument.body", - "crumbs": [ - "Bloque III Interacción", - "Semana 6", - "DOM" - ] + "objectID": "pages/Bloque3/reactI.html#react", + "href": "pages/Bloque3/reactI.html#react", + "title": "React I", + "section": "React", + "text": "React\nMotivación\nHasta el momento hemos trabajado únicamente con HTML5, el cual a pesar de ser muy eficaz, presenta el inconveniente de que no implementa ninguna clase de lógica. Es decir, si queremos repetir alguna estructura previamente definida deberemos copiarla y pegarla. Otro problema, de HTML puro es la complejidad que requiere el manejo del DOM, como ya se vio en la semana anterior.\nBajo este pretexto, introducimos el framework React diseñado por Meta." }, { - "objectID": "pages/Bloque3/DOM.html#selectores", - "href": "pages/Bloque3/DOM.html#selectores", - "title": "DOM", - "section": "Selectores", - "text": "Selectores\n\nPor ID\ndocument.getElementById(\"count\")\ndocument.querySelector(\"#count\")\n\n\nPor etiqueta\ndocument.querySelector(\"button\")\n\n\nPor clase\ndocument.querySelector(\".item\")\ndocument.querySelectorAll(\".item\")\nNotas: - querySelector devuelve el primer elemento - querySelectorAll devuelve una lista - Usan la misma sintaxis que CSS", - "crumbs": [ - "Bloque III Interacción", - "Semana 6", - "DOM" - ] + "objectID": "pages/Bloque3/reactI.html#creación-de-una-reactjs-app", + "href": "pages/Bloque3/reactI.html#creación-de-una-reactjs-app", + "title": "React I", + "section": "Creación de una ReactJS app", + "text": "Creación de una ReactJS app\nEl desarrollo de aplicaciones web modernas requiere coordinar múltiples elementos: estructura del proyecto, gestión de dependencias, compilación del código y ejecución en el navegador.\nUn framework de desarrollo proporciona un entorno de trabajo preconfigurado que organiza estos elementos y establece una forma estándar de trabajar." }, { - "objectID": "pages/Bloque3/DOM.html#leer-y-modificar-elementos", - "href": "pages/Bloque3/DOM.html#leer-y-modificar-elementos", - "title": "DOM", - "section": "Leer y modificar elementos", - "text": "Leer y modificar elementos\nelement.textContent\nelement.textContent = \"Nuevo texto\"\nelement.classList.add(\"active\")\nelement.classList.remove(\"active\")", + "objectID": "pages/Bloque3/ReactI.html", + "href": "pages/Bloque3/ReactI.html", + "title": "React I", + "section": "", + "text": "Contenido", "crumbs": [ "Bloque III Interacción", - "Semana 6", - "DOM" + "Semana 7", + "React I" ] }, { - "objectID": "pages/Bloque3/DOM.html#eventos", - "href": "pages/Bloque3/DOM.html#eventos", - "title": "DOM", - "section": "Eventos", - "text": "Eventos\nEl DOM permite reaccionar a acciones del usuario mediante eventos.\nbutton.addEventListener(\"click\", () => {\n // código a ejecutar\n});\nFlujo típico:\nUsuario → Evento → JavaScript → DOM actualizado", + "objectID": "pages/Bloque3/ReactI.html#sintaxis-jsx", + "href": "pages/Bloque3/ReactI.html#sintaxis-jsx", + "title": "React I", + "section": "Sintaxis JSX", + "text": "Sintaxis JSX\n\n¿Qué es la sintaxis JSX?\n\nJSX (JavaScript XML) es una extensión de JavaScript utilizada en React.\n\nPermite escribir estructuras similares a HTML directamente dentro del código JavaScript.\n\nFacilita la creación y lectura de interfaces de usuario, integrando lógica y presentación.\n\nAunque su apariencia es HTML, JSX se transpila a JavaScript puro antes de ejecutarse en el navegador.\nForma cómoda de almacenar etiquetas html como variables de JS\n\n\n\n¿Qué nos ofrece la sintaxis JSX?\n\nAlmacenar una etiqueta como una variable\nconst title = <h1>Web del TC de SW</h1>;\n\nconst driveIndication = (drives)? <p>Puede conducir</p> : <p>No puede conducir</p>;\nDe esta forma la variable title se corresponde con una etiqueta que contiene el título. Sin embargo, como podemos podemos utilizar está etiqueta una vez la hemos definido como una variable.\n\n\nRenderizar etiquetas dentro de etiquetas\nconst title = <h1>Web del TC de SW</h1>;\n\nconst page = <div>{title}</div>\nDe esta forma estámos encapsulando la etiqueta h1 dentro del div.\n\n\nRenderizar con el map\nconst profeAsi= [[\"Rosa\", \"Macro I\"], [\"Gabriela\", \"FSO\"],[\"Yolanda\",\"LTP\"], [\"Ferrán\", \"EM\"], [\"Pepe\", \"TCO\"]];\n\n// Array de li Asignatura: nombre profesor\nconst itemsProfAsi = profeAsi.map(x => <li>{x[1]}: {x[0]}</li>);\n\nconst listaProfesoresAsignatura = <ul>{itemsProfAsi}</ul>;\n\n\nRenderizar con el map\nconst profeAsi= [[\"Rosa\", \"Macro I\"], [\"Gabriela\", \"FSO\"], [\"Yolanda\",\"LTP\"], [\"Ferrán\", \"EM\"], [\"Pepe\", \"TCO\"]];\n\nconst listaProfesoresAsignatura = <ul>\n{profeAsi.map((x,i) => <li key={i}>{x[1]}: {x[0]}</li>)}\n</ul>;", "crumbs": [ "Bloque III Interacción", - "Semana 6", - "DOM" + "Semana 7", + "React I" ] }, { - "objectID": "pages/Bloque3/DOM.html#ejemplo-contador-con-botón", - "href": "pages/Bloque3/DOM.html#ejemplo-contador-con-botón", - "title": "DOM", - "section": "Ejemplo: contador con botón", - "text": "Ejemplo: contador con botón\n\nHTML\n<h1 id=\"count\">0</h1>\n<button id=\"btn\">Sumar 1</button>\n\n\nJavaScript\nlet count = 0;\n\nconst countEl = document.querySelector(\"#count\");\nconst btn = document.querySelector(\"#btn\");\n\nbtn.addEventListener(\"click\", () => {\n count++;\n countEl.textContent = count;\n});", + "objectID": "pages/Bloque3/ReactI.html#react", + "href": "pages/Bloque3/ReactI.html#react", + "title": "React I", + "section": "React", + "text": "React\n\nMotivación\nHasta el momento hemos trabajado únicamente con HTML5, el cual a pesar de ser muy eficaz, presenta el inconveniente de que no implementa ninguna clase de lógica. Es decir, si queremos repetir alguna estructura previamente definida deberemos copiarla y pegarla. Otro problema, de HTML puro es la complejidad que requiere el manejo del DOM, como ya se vio en la semana anterior.\nBajo este pretexto, introducimos el framework React diseñado por Meta.\n\n\nBases de React\nReact es un componente basado en la sintaxis JS y en la programación funcional introducida en ES6.\n\n\nComponente React\nLos componentes de React los definimos como unidades reutilizables y modulares que se implementan de esta forma: una función que devuelve un objeto de JSX\nfunction Saludo() {\n return <h1>Hola, mundo</h1>;\n}\nPodemos renderizar nuestro componente Saludo asumiendo que se comporta como una etiqueta html. Recordemos que no lo es.\n<main>\n <Saludo />\n</main>\nDentro de este componente podemos incluir lógica propia de JavaScript, de forma que al definir componente podemos dotarlo de lógica interna.\nfunction DivNúmeroAleatorio() {\n\n let n = Math.random();\n return <div className=\"n-random\">{n}</div>;\n}\n*Nótese que aunque JS utilice camelCase para el nombre de las funciones, con React utilizaremos PascalCase para definir los componentes puesto que a pesar de que se trata de funciones, trabajaremos con ellas como si fuesen clases.\n\n\nProps en React\nHasta ahora, los componentes definidos siempre devuelven el mismo contenido. Sin embargo, para que un componente sea realmente reutilizable, necesitamos poder pasarle información desde el exterior.\nEn React, esta información se transmite mediante props (properties).\nLas props se definen como los parámetros de entrada de un componente y permiten personalizar su comportamiento o su contenido sin modificar su definición interna.\n\nEjemplo 1: uso de props (forma explícita)\nfunction Saludo(props) {\n return <h1>Hola, {props.nombre}</h1>;\n}\nUso del componente:\n<Saludo nombre=\"Rosa\" />\n<Saludo nombre=\"Gabriela\" />\n\n\nEjemplo 2: props desestructuradas (sintaxis JavaScript)\nfunction Saludo({ nombre }) {\n return <h1>Hola, {nombre}</h1>;\n}\nUso del componente (idéntico al anterior):\n<Saludo nombre=\"Rosa\" />\n<Saludo nombre=\"Gabriela\" />\n\n\n\nEventos en React\nEn React, el manejo de eventos se basa en los eventos del DOM, pero utilizando una sintaxis propia de JSX y siguiendo el estilo de JavaScript.\n\nEjemplo básico de evento\nfunction BotonSaludo() {\n\n function manejarClick() {\n alert(\"Hola desde React\");\n }\n\n return (\n <button onClick={manejarClick}>\n Saludar\n </button>\n );\n}\n\n\nPaso de funciones como eventos\nLa función asociada al evento no se ejecuta al renderizar el componente, sino únicamente cuando ocurre el evento; es decir la pasamos como un ciudadano de primera clase.\n<button onClick={manejarClick}>Saludar</button>\nIncorrecto:\n<button onClick={manejarClick()}>Saludar</button>\n\n\nEventos más habituales en React\nReact soporta la mayoría de los eventos del DOM, adaptados a la sintaxis JSX. A continuación se listan los eventos más utilizados, clasificados por tipo.\n\nEventos de ratón\n\nonClick\nonDoubleClick\nonMouseEnter\nonMouseLeave\nonMouseMove\nonMouseDown\nonMouseUp\n\n\n\nEventos de teclado\n\nonKeyDown\nonKeyUp\nonKeyPress\n\n\n\nEventos de formularios\n\nonChange\nonSubmit\nonFocus\nonBlur\nonInput\nonReset\n\n\n\nEventos de carga y ciclo del elemento\n\nonLoad\nonError\n\n\n\nEventos de selección y portapapeles\n\nonSelect\nonCopy\nonCut\nonPaste\n\n\n\nEventos táctiles (dispositivos móviles)\n\nonTouchStart\nonTouchMove\nonTouchEnd\nonTouchCancel\n\n\n\n\n\nCiclo de vida de los componentes y renderizado en React\nEn React, los componentes no se renderizan directamente sobre el DOM real, sino que siguen un proceso intermedio que permite optimizar las actualizaciones de la interfaz.\nLa idea clave es que la interfaz se organiza como un árbol de componentes, análogo al árbol del DOM, pero a un nivel de abstracción superior.\n\nEl árbol de componentes\nCuando una aplicación React se ejecuta:\n\nCada componente genera otros componentes o elementos JSX.\nReact construye un árbol de componentes, donde:\n\nEl componente raíz suele ser App\nCada componente hijo ocupa una rama del árbol\n\n\nEste árbol de componentes se corresponde conceptualmente con el árbol del DOM, aunque no es el DOM real.\n\n\nProceso de renderizado\nEl proceso general es el siguiente:\n\nReact ejecuta un componente (función).\nEl componente devuelve JSX.\nEl JSX se transforma en una representación interna del árbol.\nReact compara este árbol con el anterior.\nSolo se actualizan en el DOM real los nodos que han cambiado.\n\nDe esta forma, React minimiza el acceso directo al DOM, que es una operación costosa.\n\n\nCiclo de vida (visión simplificada)\nDesde un punto de vista conceptual, un componente pasa por tres fases:\n\nMontaje\n\nEl componente se crea y se inserta en el DOM.\n\nActualización\n\nEl componente se vuelve a renderizar cuando cambian sus datos.\n\nDesmontaje\n\nEl componente se elimina del DOM.\n\n\nEn componentes funcionales modernos, este ciclo se gestiona de forma implícita mediante el renderizado y, más adelante, mediante hooks.\n\n\nRelación con el DOM\n\nEn JavaScript puro:\n\nSe modifica el DOM directamente.\n\nEn React:\n\nSe describe cómo debe ser la interfaz.\nReact decide el cuándo y el cómo modificar el DOM.\n\n\nEl desarrollador no recorre ni manipula el árbol del DOM, sino que trabaja sobre el árbol de componentes.", "crumbs": [ "Bloque III Interacción", - "Semana 6", - "DOM" + "Semana 7", + "React I" ] }, { - "objectID": "pages/Bloque3/DOM.html#más-ejemplos", - "href": "pages/Bloque3/DOM.html#más-ejemplos", - "title": "DOM", - "section": "Más ejemplos", - "text": "Más ejemplos\nEj1: Show input\nEj2: Par e Impar\nEj3: Toggle\nEj4: Creación dinámica\nEj5: Validación básica", + "objectID": "pages/Bloque3/ReactI.html#creación-de-una-reactjs-app", + "href": "pages/Bloque3/ReactI.html#creación-de-una-reactjs-app", + "title": "React I", + "section": "Creación de una ReactJS app", + "text": "Creación de una ReactJS app\nEl desarrollo de aplicaciones web modernas requiere coordinar múltiples elementos: estructura del proyecto, gestión de dependencias, compilación del código y ejecución en el navegador.\nUn framework de desarrollo proporciona un entorno de trabajo preconfigurado que organiza estos elementos y establece una forma estándar de trabajar.\n\n¿Para qué sirve un framework?\nUn framework permite al desarrollador:\n\nEvitar configuraciones manuales complejas\nSeguir una estructura común de proyecto\nAutomatizar tareas repetitivas\nCentrarse en la lógica de la aplicación y no en la infraestructura\n\nEn lugar de partir de un proyecto vacío, el framework ofrece una base funcional sobre la que desarrollar.\n\n\nFramework y React\nReact se encarga de definir cómo se construye la interfaz, pero no gestiona por sí mismo:\n\nLa estructura de archivos\nEl arranque de la aplicación\nLa compilación del código\nEl servidor de desarrollo\n\nPor ello, React se apoya en un framework que orquesta el entorno de ejecución.\n\n\nCreación de la aplicación\nPara crear una nueva aplicación React utilizando un framework, se ejecuta el siguiente comando en la terminal:\nnpm create vite@latest\nEste comando genera:\n\nUna estructura inicial del proyecto\nLa configuración necesaria para trabajar con React\nUn entorno listo para el desarrollo", "crumbs": [ "Bloque III Interacción", - "Semana 6", - "DOM" + "Semana 7", + "React I" ] }, { diff --git a/docs/site_libs/quarto-html/quarto-syntax-highlighting-dark-b758ccaa5987ceb1b75504551e579abf.css b/docs/site_libs/quarto-html/quarto-syntax-highlighting-dark-4d9afe2b8d18ee9fa5d0d57b5ed4214d.css old mode 100755 new mode 100644 similarity index 98% rename from docs/site_libs/quarto-html/quarto-syntax-highlighting-dark-b758ccaa5987ceb1b75504551e579abf.css rename to docs/site_libs/quarto-html/quarto-syntax-highlighting-dark-4d9afe2b8d18ee9fa5d0d57b5ed4214d.css index b21c946..9de3c1b --- a/docs/site_libs/quarto-html/quarto-syntax-highlighting-dark-b758ccaa5987ceb1b75504551e579abf.css +++ b/docs/site_libs/quarto-html/quarto-syntax-highlighting-dark-4d9afe2b8d18ee9fa5d0d57b5ed4214d.css @@ -216,4 +216,4 @@ code span.wa { content: " ¿Quién controla el valor del input? +> ¿El DOM o React? + +::: {.content-visible when-format="revealjs"} + +--- + +::: + + +Recordemos que en HTML puro o, el valor de un `` está gestionado directamente por el DOM. + +En React, podemos hacer que el valor del input esté controlado por el estado del componente. + +A esto lo llamamos **controlled input**. + + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### ¿Qué es un controlled input? + +Un *controlled input* es un elemento de formulario cuyo valor: + +- Está almacenado en el estado del componente +- Se actualiza mediante un evento (`onChange`) +- Se renderiza utilizando ese mismo estado + +**Única fuente de verdad (*single source of truth*).** + + + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Estructura del componente controlled +```{.jsx code-line-numbers="|4|6,7,8|4,13|6,7,8,14|1,16"} +import { useState } from "react"; +function FormularioNombre() { + + const [nombre, setNombre] = useState(""); + + function manejarCambio(event) { + setNombre(event.target.value); + } + + return ( +
+ +

El nombre introducido es: {nombre}

+
+ ); +} +``` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +#### Análisis del ejemplo + +El valor del input se sincroniza con el estado + +1. Declaramos una variable de estado: nombre +2. Asociamos el atributo value del input a ese estado +3. Capturamos el evento onChange +4. Actualizamos el estado con setNombre + + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +Cada vez que el estado cambia: +El componente se vuelve a ejecutar +El JSX se vuelve a generar +El valor del input se sincroniza con el estado + + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Ejemplo Formulario + +```{.jsx} +import { useState } from "react"; + +function FormularioSimple() { + + const [email, setEmail] = useState(""); + + function handleChange(event) { + setEmail(event.target.value); + } + + function handleSubmit(event) { + event.preventDefault(); // Evita la recarga del navegador + + console.log("Formulario enviado"); + console.log("Email:", email); + + setEmail(""); // Limpieza opcional del campo + } + + return ( +
+ + +
+ ); +} +``` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + + +Referencia: [https://es.react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable](https://es.react.dev/reference/react-dom/components/input#controlling-an-input-with-a-state-variable) + + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +## Hooks (Repaso) + +- Función especial que permite modificar las propiedades internas de los componentes +- Características avanzadas +- Modificación del `life-cycle` +- Normalmente forma `use____` + + +::: {.content-visible when-format="revealjs"} + +--- + +::: + + +## `useEffect` + +- `useEffect` es un Hook que permite ejecutar efectos secundarios dentro de un componente funcional. +- Un efecto secundario es cualquier operación que no sea simplemente devolver JSX (por ejemplo: peticiones a un servidor, temporizadores, suscripciones). +- Se ejecuta después de que el componente se renderiza en el DOM. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + + +### Métodos de uso de `useEffect` + + +#### 1. Sin array de dependencias + +``` jsx +useEffect(() => { + console.log("Se ejecuta en cada render"); +}); +``` + +**Comportamiento:** + +- Se ejecuta después de cada renderizado. +- No existe control sobre la frecuencia. +- Puede generar bucles si modifica estado sin control. + +**Interpretación conceptual:** + +El efecto acompaña siempre al render. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + + +#### 2. Con array vacío + +``` jsx +useEffect(() => { + console.log("Se ejecuta solo una vez"); +}, []); +``` + +**Comportamiento:** + +- Se ejecuta únicamente tras el primer render. +- Equivalente conceptual al "montaje" del componente. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +**Uso habitual:** + +- Peticiones a servidor +- Inicializaciones +- Suscripciones + +**Interpretación conceptual:** + +El efecto ocurre una única vez al crear el componente. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +#### 3. Con dependencias específicas + +``` jsx +useEffect(() => { + console.log("Se ejecuta cuando cambia contador"); +}, [contador]); +``` + +**Comportamiento:** + +- Se ejecuta tras el primer render. +- Se vuelve a ejecutar cuando cambia alguna variable del array. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +**Interpretación conceptual:** + +El efecto depende del estado indicado. + +React compara el valor anterior con el nuevo y decide si debe ejecutar +el efecto. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +## `fetch()` + +Hasta ahora nuestros componentes eran completamente locales. + +Sin embargo, en aplicaciones reales necesitamos: + +- Descargar datos +- Conectarnos a servidores +- Trabajar con APIs externas + +Para ello utilizamos `fetch()`. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Ejemplo mínimo de `fetch` + +```jsx +fetch("https://pokeapi.co/api/v2/pokemon/1") + .then(response => response.json()) + .then(data => console.log(data)); +``` + +Utiliza las *Promises* + + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +Interpretación simple: + +1. Se hace una petición a una URL +2. Se transforma la respuesta a formato JSON +3. Se accede a los datos + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### `fetch()` dentro de `useEffect` + +En React, lo habitual es realizar la descarga cuando el componente se monta. + +Para ello: + +- Utilizamos `useEffect` +- Añadimos array vacío `[]` +- Guardamos los datos en el estado + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Ejemplo integrado + +```jsx +import { useState, useEffect } from "react"; + +function Pokemon() { + + const [pokemon, setPokemon] = useState(null); + + useEffect(() => { + + fetch("https://pokeapi.co/api/v2/pokemon/1") + .then(response => response.json()) + .then(data => setPokemon(data)); + + }, []); + + if (!pokemon) return

Cargando...

; + + return ( +
+

{pokemon.name}

+ {pokemon.name} +
+ ); +} +``` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Flujo conceptual + +1. Render inicial +2. Se ejecuta `useEffect` +3. Se lanza la petición +4. Se actualiza el estado +5. Nuevo render con los datos + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Advertencia importante + +Si eliminamos el array vacío: + +```jsx +useEffect(() => { + fetch("https://pokeapi.co/api/v2/pokemon/1") + .then(res => res.json()) + .then(data => setPokemon(data)); +}); +``` + +El efecto se ejecutará en cada render. + +Como actualizar estado provoca render, se generará un bucle infinito. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + + +`useEffect` conecta React con el exterior. +`fetch()` permite traer datos del exterior. +El estado vuelve a controlar el render. + +En la siguiente sección formalizaremos esto utilizando `async / await`. + + + +## `async` y `await` + +Hasta ahora hemos utilizado `fetch()` con encadenamiento. + +Existe una forma más clara y estructurada de escribir código asíncrono: + +- `async` +- `await` + +Su objetivo es hacer que el código sea más legible. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### ¿Qué significa `async`? + +- Se coloca delante de una función +- Indica que la función trabajará con operaciones asíncronas + +```jsx +async function ejemplo() { + console.log("Función asíncrona"); +} +``` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### ¿Qué significa `await`? + +- Solo puede utilizarse dentro de una función `async` +- Detiene la ejecución hasta que la operación finaliza +- Hace que el código se lea de forma secuencial + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Ejemplo básico con `fetch` + +```jsx +async function obtenerPokemon() { + + const response = await fetch( + "https://pokeapi.co/api/v2/pokemon/1" + ); + + const data = await response.json(); + + console.log(data); +} +``` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +Interpretación conceptual: + +1. Se realiza la petición +2. Se espera la respuesta +3. Se transforma a JSON +4. Se trabaja con los datos + +El código se lee de arriba hacia abajo. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### `async / await` dentro de `useEffect` + +En React, lo habitual es declarar una función interna y ejecutarla. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Ejemplo completo + +```jsx +import { useState, useEffect } from "react"; + +function Pokemon() { + + const [pokemon, setPokemon] = useState(null); + + useEffect(() => { + + async function fetchData() { + + const response = await fetch( + "https://pokeapi.co/api/v2/pokemon/1" + ); + + const data = await response.json(); + + setPokemon(data); + } + + fetchData(); + + }, []); + + if (!pokemon) return

Cargando...

; + + return ( +
+

{pokemon.name}

+ {pokemon.name} +
+ ); +} +``` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### ¿Por qué no hacer directamente? + +```jsx +useEffect(async () => { + ... +}, []); +``` + +Porque `useEffect` no debe recibir una función asíncrona directamente. + +Por eso declaramos la función dentro y luego la ejecutamos. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Flujo mental con `async / await` + +1. Render inicial +2. Se ejecuta `useEffect` +3. Se llama a la función asíncrona +4. `await` espera la respuesta +5. Se actualiza el estado +6. Nuevo render + +::: {.content-visible when-format="revealjs"} + +--- + +::: + + +`async / await` no cambia lo que hace el programa. + +Solo cambia la forma de escribirlo: + +Más claro. +Más estructurado. +Más fácil de mantener. + + +## Ejemplo con la Pokeapi + +[Poke-API](https://pokeapi.co/) + +[Download Code](./PokeAPI-Example.zip) \ No newline at end of file diff --git a/pages/Bloque3/MARef.qmd b/pages/Bloque3/MARef.qmd new file mode 100644 index 0000000..7940615 --- /dev/null +++ b/pages/Bloque3/MARef.qmd @@ -0,0 +1,21 @@ +--- +title: "MA: *Uncontrolled fields* y `useRef`" +author: "Javier Ribal del Río" +date: "2025-03-02" +date-modified: today +affiliation: "Hyperloop UPV" +--- + +Por el momento hemos visto dos *hooks* `useState` y `useEffect`, pero recordemos que en React existen más tipos de *hooks* que por ser menos útiles y debido a la falta de tiempo no son explicados, no obstante si hay alguno digno de mención es `useRef` o las referencias. + +Una `ref` es una referencia mutable que permite acceder directamente a un elemento del DOM o almacenar un valor persistente sin provocar un re-render del componente. El siguiente video ilustra su uso. Es un poco largo pero sirve para repasar los otros hooks. + +{{< video https://www.youtube.com/watch?v=t2ypzz6gJm0 >}} + +--- + +Con las `ref` podemos introducir los *uncontrolled fields* que nos permiten trabajar de otra forma con los formularios. + +{{< video https://www.youtube.com/watch?v=X2O7Wfmkuzw >}} + +Se prefiere la segunda implementación (la que no utiliza referencias) sobre la primera. \ No newline at end of file diff --git a/pages/Bloque3/PokeAPI-Example.zip b/pages/Bloque3/PokeAPI-Example.zip new file mode 100644 index 0000000..430af25 Binary files /dev/null and b/pages/Bloque3/PokeAPI-Example.zip differ diff --git a/rubriuca.qmd b/rubriuca.qmd index aea8c14..7b3cb6e 100644 --- a/rubriuca.qmd +++ b/rubriuca.qmd @@ -28,19 +28,19 @@ library(kableExtra) # VARIABLES GENERALES # =============================== titulo_rubrica <- "Rúbrica de Evaluación" -nombre_tarea <- "Web de Hyperloop II" -nombre_alumno <- "Pau Minguet Micó" +nombre_tarea <- "Ejecicios JS" +nombre_alumno <- "Daniel Zanon Barney" comentarios <- " -Has abusado mucho de la notación para redefinir el estilo predeterminado de las etiquetas. Es mejor utilizar siempre clases e ID. Muy buen uso de los selectores por propiedad y el pseudoselector de el link. +En el ejercicio 3 se debeía de imprimir también el array por pantalla, en el código subido a GitHub, lo has encapsulado dentro de la función `arr2`. No se deben encapuslar los array en funciones. -No has usado ni una clase en toda la tarea. +El ejercicio 7 está mal: el metodo `.push()` de los arrays devuelve la nueva longitud del array. En tu código en la línea 21: `const arrFinal =arrCubosFiltrados.push(21);` está añadiendo el número `21` al array `arrCubosFiltrados` mientras que `arrFinal` se corresponde con la longitud de `arrCubosFiltrados` (incluyendo el 21). La respuesta correcta era `let arrFinal = [...arrCubosFiltrados, 21];` +En lo que respecta al formato del documento, es convención en JS insertar un espacio entre los operadores: NO `x%2==0` sino `x % 2 === 0`. --- -Dominio completo de propiedades CSS, pero todavía tienes margen de mejora en el uso de selectores básicos. - +En general bien, todavía hay margen de mejora en lo que respecta al uso de los array, muy buen uso de las funciones `filter` y `map`. " ``` @@ -61,7 +61,7 @@ notas <- tibble( "Documentación / Claridad", "Funcionalidad" ), - puntuacion = c(7.5, NA, 9.5, 10, 9) + puntuacion = c(NA, 6, 7, 7, 8.5) ) ```