From 632a51ec3b24cb41b4ff85ebfad79cd62a4d6422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Ribal=20del=20R=C3=ADo?= Date: Wed, 4 Mar 2026 11:28:54 +0100 Subject: [PATCH] feat: explicacion semana 10 --- _quarto.yml | 5 + docs/about.pdf | Bin 15453 -> 15453 bytes docs/index.html | 17 + docs/index.pdf | Bin 39345 -> 39345 bytes docs/pages/Bloque1/MAcss.html | 17 + docs/pages/Bloque1/MAcss.pdf | Bin 24989 -> 24989 bytes docs/pages/Bloque1/MAhtml2.html | 17 + docs/pages/Bloque1/MAhtml2.pdf | Bin 24870 -> 24870 bytes docs/pages/Bloque1/bloque1.html | 17 + docs/pages/Bloque1/bloque1.pdf | Bin 31777 -> 31777 bytes docs/pages/Bloque1/css.html | 17 + docs/pages/Bloque1/css.pdf | Bin 74234 -> 74234 bytes docs/pages/Bloque1/entorno.html | 17 + docs/pages/Bloque1/entorno.pdf | Bin 651767 -> 651767 bytes docs/pages/Bloque1/html.html | 17 + docs/pages/Bloque1/html.pdf | Bin 738180 -> 738180 bytes docs/pages/Bloque1/t1.html | 17 + docs/pages/Bloque1/t1.pdf | Bin 34403 -> 34403 bytes docs/pages/Bloque1/t1a.html | 17 + docs/pages/Bloque1/t1a.pdf | Bin 21359 -> 21359 bytes docs/pages/Bloque1/t2.html | 17 + docs/pages/Bloque1/t2.pdf | Bin 26811 -> 26811 bytes docs/pages/Bloque1/t2a.html | 17 + docs/pages/Bloque1/t2a.pdf | Bin 22584 -> 22584 bytes docs/pages/Bloque2/MAclases.html | 17 + docs/pages/Bloque2/MAclases.pdf | Bin 60262 -> 60262 bytes docs/pages/Bloque2/intensivo.html | 17 + docs/pages/Bloque2/intensivo.pdf | Bin 77061 -> 77061 bytes docs/pages/Bloque2/jsI.pdf | Bin 45683 -> 45683 bytes docs/pages/Bloque2/ti.html | 17 + docs/pages/Bloque2/ti.pdf | Bin 47554 -> 47554 bytes docs/pages/Bloque2/tia.html | 17 + docs/pages/Bloque2/tia.pdf | Bin 55042 -> 55042 bytes docs/pages/Bloque3/DOM.html | 17 + docs/pages/Bloque3/DOM.pdf | Bin 49517 -> 49517 bytes docs/pages/Bloque3/Intermedio.html | 17 + docs/pages/Bloque3/Intermedio.pdf | Bin 83354 -> 83354 bytes docs/pages/Bloque3/MARef.html | 17 + docs/pages/Bloque3/MARef.pdf | Bin 33614 -> 33614 bytes docs/pages/Bloque3/MAcss2.html | 17 + docs/pages/Bloque3/MAcss2.pdf | Bin 25926 -> 25926 bytes docs/pages/Bloque3/ReactI.html | 17 + docs/pages/Bloque3/ReactI.pdf | Bin 73971 -> 73971 bytes docs/pages/Bloque3/ReactIV.html | 1315 ++++++++++++++++++ docs/pages/Bloque3/ReactIV.pdf | Bin 0 -> 67123 bytes docs/pages/Bloque3/presentacion-reactIV.html | 879 ++++++++++++ docs/pages/Bloque3/ps.html | 17 + docs/pages/Bloque3/ps.pdf | Bin 38340 -> 38340 bytes docs/pages/Bloque3/t6.html | 17 + docs/pages/Bloque3/t6.pdf | Bin 67989 -> 67989 bytes docs/pages/Bloque3/t9.html | 973 +++++++++++++ docs/pages/Bloque3/t9.pdf | Bin 0 -> 67989 bytes docs/pages/rubric.html | 17 + docs/rubriuca.pdf | Bin 38663 -> 38663 bytes docs/search.json | 168 ++- pages/Bloque3/ReactIV.qmd | 455 ++++++ pages/Bloque3/t9.qmd | 242 ++++ 57 files changed, 4416 insertions(+), 12 deletions(-) create mode 100644 docs/pages/Bloque3/ReactIV.html create mode 100644 docs/pages/Bloque3/ReactIV.pdf create mode 100644 docs/pages/Bloque3/presentacion-reactIV.html create mode 100644 docs/pages/Bloque3/t9.html create mode 100644 docs/pages/Bloque3/t9.pdf create mode 100644 pages/Bloque3/ReactIV.qmd create mode 100644 pages/Bloque3/t9.qmd diff --git a/_quarto.yml b/_quarto.yml index fa4635b..d021f59 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -75,6 +75,11 @@ website: contents: - pages/Bloque3/Intermedio.qmd - pages/Bloque3/MARef.qmd + + - section: "Semana 10" + contents: + - pages/Bloque3/ReactIV.qmd + - text: "Próximamente..." diff --git a/docs/about.pdf b/docs/about.pdf index fe9334c991ece5f6f6892d02953d151f924c0cae..594495649717ac3adb4947e508129d1b909bbcca 100644 GIT binary patch delta 109 zcmcaxakpYavMHOPp^>?P@#IWXStxUJkLhYwHwzaFLnk+5V;2`QM-xM5a}zgHGjk_1 c6LSM2Q)4$*XFCNO!b)N%KVX-iJjePV0ExIAyZ`_I delta 109 zcmcaxakpYavMHN^rIDGT#pFy=StxUJkLhYwHy1}kOLGfnCnEzBClgmwXG>Q%Hw$MI aQ)43#&)CpT!G^Gs*vSvr MA: Uncontrolled fields y useRef + + + + diff --git a/docs/index.pdf b/docs/index.pdf index 038dc75d3af40f95a187e6731f55ac55f4b3e982..ae94c8ce5e567d3a2032aaa2d445ec2236c64713 100644 GIT binary patch delta 136 zcmdnEnQ7x@rVR$Ynudl(W~Qdv28QYe2I`s$`o8%oE{P?n3K}j}Mg~S^2F3;^5G9)< zd(UyXxj8x-SQxmN8Je1zI2)NdIXgMJTAI35^28QYe2I`s$`o8%oE{P?n3K}j}Mg~S^2F3;^5G9)< zd(UyXS(=%eJ6akTI2pTHIJ-H!Il7veSUMV*8M_*|S-3cx+bP%(RuVf|(Nb=6_Y5^g E0KhpTU;qFB diff --git a/docs/pages/Bloque1/MAcss.html b/docs/pages/Bloque1/MAcss.html index e806338..937eb8d 100644 --- a/docs/pages/Bloque1/MAcss.html +++ b/docs/pages/Bloque1/MAcss.html @@ -504,6 +504,23 @@ MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque1/MAcss.pdf b/docs/pages/Bloque1/MAcss.pdf index db7d4163fb5bac9b8ddad20b411e47cc7a1e7570..bdb3f0ab76357c789a590b267467f34075af6747 100644 GIT binary patch delta 111 zcmbPxm~rl5#tqpKY=(wL#s(IX3nOHq%*|6G_OQEIy1BVn7&2`>TDKpyn~ delta 111 zcmbPxm~rl5#tqpKYzCG_Mkc0{3nOHq%*|6G_OQD-8Jn4!89Ex6TNoI+nY)-8n7IJe dnHf8|89KU{8d=yW*br6{JNclo+~h3@F9Eo^9%TRk diff --git a/docs/pages/Bloque1/MAhtml2.html b/docs/pages/Bloque1/MAhtml2.html index 6fe7809..3f42d56 100644 --- a/docs/pages/Bloque1/MAhtml2.html +++ b/docs/pages/Bloque1/MAhtml2.html @@ -504,6 +504,23 @@ MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque1/MAhtml2.pdf b/docs/pages/Bloque1/MAhtml2.pdf index 1200a72a835f59b8c20e165a702c7033e1575489..3b047e78ec273d80cf2fe5b075f1d872b3c4fa83 100644 GIT binary patch delta 112 zcmZ2>h;i8=#tpN>*bEJgj15gDFAS4~GB+Oy`^({G;A-e>ZfW3ZX=rX};pAp$>SAPW fXkcVuXkuw>=Hy~-r(i=^N$li{igKG(6Bro*8gL!G delta 112 zcmZ2>h;i8=#tpN>*bFRS}3br(i=^N$li{igKG(6Bro*71kY{ diff --git a/docs/pages/Bloque1/bloque1.html b/docs/pages/Bloque1/bloque1.html index 74040b5..460f62c 100644 --- a/docs/pages/Bloque1/bloque1.html +++ b/docs/pages/Bloque1/bloque1.html @@ -504,6 +504,23 @@ MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque1/bloque1.pdf b/docs/pages/Bloque1/bloque1.pdf index 6f8c0bd522cd42a3565b54c376b04f5803f7856a..12e1d014544f6827d1f8f7cd7922d636d0e6238d 100644 GIT binary patch delta 112 zcmZ4ZgK^;x#tq>GY=(wLM#dJCV+&-V%*_o2s$6a^&Mu~gCI;q4#s)4Xrf$X-&X%sm fW)^PFt`>&oPR34l3O0n5#7-6{l;6x%EzSr4=yV+u delta 112 zcmZ4ZgK^;x#tq>GYzCG_Mg}I6V+&-V%*_o2s$6acF3uL_&c>$BE{-N{21bq+CeCio erj9_>7Ov(7CKh%IHiVVLP8KMX-^^7l&IkbUWgR5| diff --git a/docs/pages/Bloque1/css.html b/docs/pages/Bloque1/css.html index c5ae889..21430c6 100644 --- a/docs/pages/Bloque1/css.html +++ b/docs/pages/Bloque1/css.html @@ -539,6 +539,23 @@ MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque1/css.pdf b/docs/pages/Bloque1/css.pdf index c50b9d917f8c55d9e92ee02e2abbb92881a3b7f7..c99422702423e3dd64e6b17a0ed738ea24582555 100644 GIT binary patch delta 117 zcmex$nB~`DmWC~iP9kiEhDOFlCeuAc7-gaC?b#xXce&i$T%C*!%*>6Q%p9Ffja`k* kjNMF(Ok52NEltcUj7$yf6l@49iJdGMA-8>vJfj~I04)$5MF0Q* delta 117 zcmex$nB~`DmWC~iP9kgumPW>g2Gc!67-gaC?b#xXce&h*EKFSu3>=NjoJ@_3je&|R jT%BEA%q+}JEey>qT@CFNYzQlfoh%q3w|$K~qaPChBC{Pg diff --git a/docs/pages/Bloque1/entorno.html b/docs/pages/Bloque1/entorno.html index 78cdec5..6dc773a 100644 --- a/docs/pages/Bloque1/entorno.html +++ b/docs/pages/Bloque1/entorno.html @@ -504,6 +504,23 @@ MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque1/entorno.pdf b/docs/pages/Bloque1/entorno.pdf index 9a62adea01d02438080aa8d8f6edf8abe98724ed..945c17d1247c235a37f830ccfcb10c092b526626 100644 GIT binary patch delta 134 zcmezVSpEBB^@bM47N!>F7M2#)7Pc1l7LF~P*B-GM8X6fJn@_*F7M2#)7Pc1l7LF~P*B-GMSQ;4{nM}X)h*K8I-v0j)rvi_g zlbNNPtEsu6n}MN;vx%jfnVGSRg^`(|nX#d MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque1/html.pdf b/docs/pages/Bloque1/html.pdf index 10ece1255a33d3594d0de8ddf4516a034e24eff8..a818bca51d4343977b7af74c108d1d83873dd610 100644 GIT binary patch delta 137 zcmZo^*KKLnZD?U^VQOJ+VQFD)VQXP;;b`G(;o8EjZp~(BXk=t!F MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque1/t1.pdf b/docs/pages/Bloque1/t1.pdf index 67a7e71ea5a32cd9f441ad923e81ac52611316a6..486e38777b6dd0a319034c039691cfb7759d5dd8 100644 GIT binary patch delta 136 zcmaFd!}Pd^X+ur5rlFycv4N4cfuXvAfx4!GzHfetOJYf?f`*Hgk%5t!fw6%JM9Jo* z)mEHtZk8q%&IXQ_hOP$2ZZ0N MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque1/t1a.pdf b/docs/pages/Bloque1/t1a.pdf index 8a109c10d07a8d6d1f36be15bb07a776d487844c..9b07f21569998a21973538903dd1c723ddd68152 100644 GIT binary patch delta 111 zcmaFAjPd<4#tnkrY=(wLMy95d#l2;r%*|HbU)kIY%uSul+?-7<%#AFK4a|+4+>BhE eoXlO#T`kN_Ow63@6l@49iJcrEB{z9;&>aAiD;;aAs{T-M9 diff --git a/docs/pages/Bloque1/t2.html b/docs/pages/Bloque1/t2.html index 558fae6..c06b7d5 100644 --- a/docs/pages/Bloque1/t2.html +++ b/docs/pages/Bloque1/t2.html @@ -504,6 +504,23 @@ MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque1/t2.pdf b/docs/pages/Bloque1/t2.pdf index f8f2f58062a9dfec40c0494798c7a7c7f3721417..1984a1255cb4bca16276ba7681ae4c0b3b070879 100644 GIT binary patch delta 135 zcmdmek#YA$#tr}DGz<-mj7?0m4Gh%{4AeCh^nLSFToOxC6*OF|j0}v-42%s-z)Ci& z$7^%AIlDNUnHXDI7`vGmIGdWAxSCixx)_+68=6}f8Mv95*eTc$RuVh;qKy3J?ddFx E0I)(L*8l(j delta 135 zcmdmek#YA$#tr}DGz=__jEzmS4Gh%{4AeCh^nLSFToOxC6*OF|j0}v-42%s-z)Ci& z$7^%AIhmR|nHU+lIvX3ini@O0nwU778oC-A8yi}fS(uwS+9}u&RuVh;qKy3J?ddFx E0J4}O-v9sr diff --git a/docs/pages/Bloque1/t2a.html b/docs/pages/Bloque1/t2a.html index 7e058ee..85ad2f8 100644 --- a/docs/pages/Bloque1/t2a.html +++ b/docs/pages/Bloque1/t2a.html @@ -504,6 +504,23 @@ MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque1/t2a.pdf b/docs/pages/Bloque1/t2a.pdf index 0fee716daa1de4922a6299d1f4685450ff43eb96..ca7db80bcaf7fd8a0080a5b199fc8a2e223ddbe3 100644 GIT binary patch delta 104 zcmdn7fpNzM#tn!3*$fShjEoH@pYWH3GB>~W7hrdGb1`*uGk3JGbTcw>F*9&>HL)~x ZHZ(9YGj?@!b}=%wQ?MbVWU^iOF90z59E<<} delta 104 zcmdn7fpNzM#tn!3*$ga=3{A}^pYWH3GB>~W7hrcbwlH!rH+6QiG MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque2/MAclases.pdf b/docs/pages/Bloque2/MAclases.pdf index 1c2e894e3d1c7e77418907ad8d7729eb34642b09..7354f3e27b3de9e7695d9c24f23a45a4322e9ceb 100644 GIT binary patch delta 136 zcmaEMjrrL%<_#YnXc`(CnV1-88yKn^7^rJ1==s8yKn^7^rJ1== MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque2/intensivo.pdf b/docs/pages/Bloque2/intensivo.pdf index dfa7901c9731e47b6c923555dce360f75234be52..7882c9da0db0fd48cba7903fac1259dfb00419f1 100644 GIT binary patch delta 108 zcmZp@#nO6th=4 delta 108 zcmZp@#nO6GBPrE fHg|J#F}5&sF|)K&upz7@c5-5<{N_^|Rx$zr=4Kw# diff --git a/docs/pages/Bloque2/ti.html b/docs/pages/Bloque2/ti.html index ab80537..36580c5 100644 --- a/docs/pages/Bloque2/ti.html +++ b/docs/pages/Bloque2/ti.html @@ -504,6 +504,23 @@ MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque2/ti.pdf b/docs/pages/Bloque2/ti.pdf index 505ca1a38d14b605d76c80d980da9ab48eb8f4f7..0596bd0081f6a34a3336cbd332887151e2b86b6e 100644 GIT binary patch delta 128 zcmX@~nd#7HrVTP%H4P1oObpDm4Gh%{4AeCh^nLSFToOxC6*OF|j0}v-42%s-AWAm7 zZY^hWaxpP7b~bagG;}m`a&vMscC|D!aWgY_aWOJ5G;p(YwNtPmpk(vE?MD~^^Ts05 delta 128 zcmX@~nd#7HrVTP%H4Q9{j7`n74Gh%{4AeCh^nLSFToOxC6*OF|j0}v-42%s-AWAm7 zZY^hWax^t{G<7vHaJF!EHgGgCcQrFHaB_1sG MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque2/tia.pdf b/docs/pages/Bloque2/tia.pdf index 5386b5f9bb01343bbf41b3b2300cc34d3df9e9a4..385bb034486509e82116b4fca327789cfa946b9f 100644 GIT binary patch delta 103 zcmZo#$K14zd4tzERzpK06T`{==j0%)%|+)T*_<6sOfAd}P0cM_T%C;FEL@B%44hnD ZEM3fvEzC^JTwUxGYzQgY%y;z*BLD=s9BBXm delta 103 zcmZo#$K14zd4tzERs%~T6NAbA=j0%)%|+)T*_ MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque3/DOM.pdf b/docs/pages/Bloque3/DOM.pdf index ed37bbcbce33f8758075e2e625efde88bb0a5504..92be53e54e8ec4734ef38d1032033393a71b7b86 100644 GIT binary patch delta 112 zcmaFc#Qe62dBftJY=(wLW`>57SMHRBGB=;uS;Fe(WM*jWX71u<=4@i(W^Cr{>}+CW g;A(7WWbW+hXy|BUr(i=^N$ljtxeA+??LW>40FbL81^@s6 delta 112 zcmaFc#Qe62dBftJYzCG_rpD%zSMHRBGB=;uS;FdO=IUf&X6k6^=Ir9^W?^n=Xl`L@ g;biP&XyWSXV(DmTr(i=^N$ljtxeA+??LW>40I9MebN~PV diff --git a/docs/pages/Bloque3/Intermedio.html b/docs/pages/Bloque3/Intermedio.html index 05063ba..cc0431a 100644 --- a/docs/pages/Bloque3/Intermedio.html +++ b/docs/pages/Bloque3/Intermedio.html @@ -539,6 +539,23 @@ MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque3/Intermedio.pdf b/docs/pages/Bloque3/Intermedio.pdf index 0e6a7f18f9d7acc24e25b8254a5abde09c90c0e9..b5b5d3b6707f4c97ab5b61a3dd7abf3b4d1cb530 100644 GIT binary patch delta 110 zcmbQ$%{r@_wP6e6M{_nqLn9MY)9K&M8D*jD?NSzuPdJ?&Ega39O&yI~%pJ|$++5Av ej4YjiN}Y_Iot+&G&5i98YzQgY?&!oA$qWFP!5nG; delta 110 zcmbQ$%{r@_wP6e6M{_m MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque3/MARef.pdf b/docs/pages/Bloque3/MARef.pdf index 7c98c9de57d6b1e68d511760311944545634bb7f..252ceef76f1a6464f188cb2103e2ab3180e3517f 100644 GIT binary patch delta 136 zcmX@t#&oWYX+uDTrlFycsj;cHfuXvAfx4!GzHfetOJYf?f`*Hgk%5t!fw6%JM9JpL z3V%*FHv?Bg7bi0VCksb&S941PCsPYcGh<^5Qy}4LVBuz`U_)3*?BtD>@|$&=6d3`4 CiXv

@|$&=6d3`5 C1R`tz diff --git a/docs/pages/Bloque3/MAcss2.html b/docs/pages/Bloque3/MAcss2.html index 0d19686..ef72ee6 100644 --- a/docs/pages/Bloque3/MAcss2.html +++ b/docs/pages/Bloque3/MAcss2.html @@ -504,6 +504,23 @@ MA: Uncontrolled fields y useRef + + + +

diff --git a/docs/pages/Bloque3/MAcss2.pdf b/docs/pages/Bloque3/MAcss2.pdf index 785ce722c1294620f7d069eabeacc8b9aedf2e0e..d8fe918ca5936fc40c4b5d6a5578e8b1186fc40e 100644 GIT binary patch delta 103 zcmX?hit*Sf#to07Sq%-1Oid=gh?aw}Hgm^(V0Sh#a5gqIGc-0bv~;#`F*GoBb+s@v Za&a^>aI|nXHFL95upy*mvt0@YBLG0R8;t+} delta 103 zcmX?hit*Sf#to07Sq&_WOpPYLh?aw}Hgm^(V0U)2G%#=kVlz`SM`K457bj-}6H`k! YLnlKsCud7TGdl$vLP|E MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque3/ReactI.pdf b/docs/pages/Bloque3/ReactI.pdf index 2058a9cdcaddcc289242ca2086637766e396dba7..4b7a5c116713763bb8b30273074d165b94a4a315 100644 GIT binary patch delta 117 zcmex-kmd71mWC~iZjx+ + + + + + + + + + +React IV – Training Center SW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + +
+ + + +
+ + +
+
+

React IV

+

Ecosistema npm, React Router, useContext

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

Javier Ribal del Río

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

6 de marzo de 2026

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

4 de marzo de 2026

+
+
+ +
+ + + +
+ + +

Contenido

+
    +
  • Ecosistema React y paquetes npm
  • +
  • Librerías externas
  • +
  • React Router
  • +
  • Parámetros de URL
  • +
  • useContext
  • +
+
+

Ecosistema Node

+

Hasta ahora hemos trabajado únicamente con React y JavaScript.

+

Sin embargo, en el desarrollo real de aplicaciones es muy común utilizar librerías externas, para ello podemos recurrir Node.JS.

+

React está diseñado para funcionar dentro de un ecosistema de paquetes.

+

Ejemplos habituales:

+
    +
  • React Router → navegación
  • +
  • Axios → peticiones HTTP
  • +
  • Chart.js → gráficas
  • +
  • Zustand / Redux → gestión de estado
  • +
  • Librerías de UI: Tailwind, Bootstrap, Booswatch
  • +
+
+
+

npm

+

npm (Node Package Manager) es el sistema que permite instalar y gestionar librerías de JavaScript. Como su nombre indica, está desarrollado por Node.JS

+

Cada proyecto tiene un archivo:

+
package.json
+

En este archivo se registran las dependencias del proyecto.

+

Ejemplo:

+
{
+  "dependencies": {
+    "react": "^18.0.0",
+    "react-router-dom": "^6.0.0"
+  }
+}
+
+

Instalación de paquetes

+

Las librerías se instalan desde la terminal.

+
npm install react-router-dom
+

Esto hace tres cosas:

+
    +
  1. Descarga el paquete
  2. +
  3. Lo guarda en node_modules (capreta donde se guardan las librerías externas)
  4. +
  5. Añade la dependencia en package.json
  6. +
+
+
+
+

React Router

+

En una aplicación web tradicional cada enlace carga una página nueva.

+

En React normalmente trabajamos con Single Page Applications (SPA).

+

En una SPA:

+
    +
  • el navegador no recarga la página
  • +
  • React cambia los componentes que se muestran
  • +
+

Para gestionar esto utilizamos React Router.

+

Realmente es la misma página, solo que el usuario lo percibe como distintas páginas

+

El usuario percibirá que el sitio web está divido en diferentes subpáginas

+
    +
  • /
  • +
  • pokemons
  • +
  • pokemons/pikachu
  • +
+
+

Componentes principales de React Router

+

Los elementos fundamentales son:

+
    +
  • BrowserRouter
  • +
  • Routes
  • +
  • Route
  • +
  • Link
  • +
+

Ejemplo básico:

+
import { BrowserRouter, Routes, Route } from "react-router-dom";
+
+function App() {
+  return (
+    <BrowserRouter>
+
+      <Routes>
+
+        <Route path="/" element={<Home />} />
+
+        <Route path="/pokemons" element={<PokemonList />} />
+
+      </Routes>
+
+    </BrowserRouter>
+  );
+}
+

Elementos del código

+
    +
  • BrowserRouter
    +Es el componente que activa el sistema de navegación de React Router. Utiliza la API de historial del navegador para cambiar la URL sin recargar la página.
  • +
  • Routes
    +Es el contenedor donde se definen todas las rutas de la aplicación. React Router examina las rutas dentro de este componente para decidir qué componente mostrar.
  • +
  • Route
    +Define una ruta concreta de la aplicación.
  • +
+
    +
  • path
    +Indica la URL que activa la ruta.
    +Ejemplo: / corresponde a la página principal.
  • +
  • element
    +Es el componente de React que se renderiza cuando la URL coincide con el path.
  • +
  • <Home />
    +Componente que se muestra cuando el usuario accede a la ruta /.
  • +
  • <PokemonList />
    +Componente que se muestra cuando el usuario accede a la ruta /pokemons.
  • +
+
+ +
+

Parámetros dinámicos

+

Podemos crear rutas dinámicas.

+

Ejemplo:

+
/pokemon/25
+/pokemon/7
+

Definición de la ruta:

+
<Route path="/pokemon/:id" element={<PokemonDetail />} />
+
+

useParams

+

Para acceder al parámetro utilizamos el hook useParams de React Router.

+
import { useParams } from "react-router-dom";
+
+function PokemonDetail() {
+
+  const { id } = useParams();
+
+  return <p>Pokemon {id}</p>;
+
+}
+

Este parámetro puede utilizarse para realizar peticiones a una API.

+
+
+
+
+

Context API

+

En aplicaciones grandes aparece un problema frecuente.

+

Muchos componentes necesitan acceder a la misma información.

+

Por ejemplo:

+
    +
  • usuario
  • +
  • tema visual
  • +
  • idioma
  • +
  • configuración
  • +
+

Si pasamos la información mediante props, los datos deben atravesar muchos componentes.

+

Representación conceptual:

+
App
+ └ Layout
+    └ Page
+       └ Component
+

Si todos necesitan user, debemos pasar la prop continuamente.

+

Este problema se conoce como prop drilling.

+
+

Context

+

React proporciona una solución llamada Context.

+

Context permite compartir información entre múltiples componentes sin pasar props manualmente.

+

El proceso tiene tres pasos:

+
    +
  1. Crear el contexto
  2. +
  3. Proveer el contexto
  4. +
  5. Consumir el contexto
  6. +
+
+

Crear un contexto

+
import { createContext } from "react";
+
+const UserContext = createContext();
+

Esto crea un contenedor que puede almacenar información compartida.

+
+
+

Provider

+

El Provider permite que los componentes hijos accedan al contexto.

+
<UserContext.Provider value={user}>
+
+  <App />
+
+</UserContext.Provider>
+

Todos los componentes dentro del Provider pueden acceder al valor.

+
+
+

Consumir el contexto

+

Para acceder al contexto utilizamos el hook useContext.

+
import { useContext } from "react";
+
+const user = useContext(UserContext);
+

El componente obtiene directamente el valor almacenado en el contexto.

+
+
+

Ejemplo completo

+
import { createContext, useContext } from "react";
+
+const UserContext = createContext();
+
+function App() {
+
+  const user = { name: "Javier" };
+
+  return (
+
+    <UserContext.Provider value={user}>
+
+      <Profile />
+
+    </UserContext.Provider>
+
+  );
+}
+
+function Profile() {
+
+  const user = useContext(UserContext);
+
+  return <h1>{user.name}</h1>;
+
+}
+ + +
+
+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/docs/pages/Bloque3/ReactIV.pdf b/docs/pages/Bloque3/ReactIV.pdf new file mode 100644 index 0000000000000000000000000000000000000000..29a05a9cac12da7fe6ddff4ac7fe5ac86f0dd28f GIT binary patch literal 67123 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 + + + + + + + + + + + + + Training Center SW – React IV + + + + + + + + + + + + + + + + +
+
+ +
+

React IV

+

Ecosistema npm, React Router, useContext

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

2026-03-06

+
+
+ +

Contenido

+
    +
  • Ecosistema React y paquetes npm
  • +
  • Librerías externas
  • +
  • React Router
  • +
  • Parámetros de URL
  • +
  • useContext
  • +
+
+
+

Ecosistema Node

+

Hasta ahora hemos trabajado únicamente con React y JavaScript.

+

Sin embargo, en el desarrollo real de aplicaciones es muy común utilizar librerías externas, para ello podemos recurrir Node.JS.

+

React está diseñado para funcionar dentro de un ecosistema de paquetes.

+
+
+ +

Ejemplos habituales:

+
    +
  • React Router → navegación
  • +
  • Axios → peticiones HTTP
  • +
  • Chart.js → gráficas
  • +
  • Zustand / Redux → gestión de estado
  • +
  • Librerías de UI: Tailwind, Bootstrap, Booswatch
  • +
+
+
+

npm

+

npm (Node Package Manager) es el sistema que permite instalar y gestionar librerías de JavaScript. Como su nombre indica, está desarrollado por Node.JS

+

Cada proyecto tiene un archivo:

+
package.json
+

En este archivo se registran las dependencias del proyecto.

+
+
+ +

Ejemplo:

+
{
+  "dependencies": {
+    "react": "^18.0.0",
+    "react-router-dom": "^6.0.0"
+  }
+}
+
+
+ +

Instalación de paquetes

+

Las librerías se instalan desde la terminal.

+
npm install react-router-dom
+

Esto hace tres cosas:

+
    +
  1. Descarga el paquete
  2. +
  3. Lo guarda en node_modules (capreta donde se guardan las librerías externas)
  4. +
  5. Añade la dependencia en package.json
  6. +
+
+
+

React Router

+

En una aplicación web tradicional cada enlace carga una página nueva.

+

En React normalmente trabajamos con Single Page Applications (SPA).

+

En una SPA:

+
    +
  • el navegador no recarga la página
  • +
  • React cambia los componentes que se muestran
  • +
+

Para gestionar esto utilizamos React Router.

+

Realmente es la misma página, solo que el usuario lo percibe como distintas páginas

+
+
+ +

El usuario percibirá que el sitio web está divido en diferentes subpáginas

+
    +
  • /
  • +
  • pokemons
  • +
  • pokemons/pikachu
  • +
+
+
+ +

Componentes principales de React Router

+

Los elementos fundamentales son:

+
    +
  • BrowserRouter
  • +
  • Routes
  • +
  • Route
  • +
  • Link
  • +
+

Ejemplo básico:

+
+
+ +
import { BrowserRouter, Routes, Route } from "react-router-dom";
+
+function App() {
+  return (
+    <BrowserRouter>
+
+      <Routes>
+
+        <Route path="/" element={<Home />} />
+
+        <Route path="/pokemons" element={<PokemonList />} />
+
+      </Routes>
+
+    </BrowserRouter>
+  );
+}
+
+
+ +

Elementos del código

+
    +
  • BrowserRouter
    +Es el componente que activa el sistema de navegación de React Router. Utiliza la API de historial del navegador para cambiar la URL sin recargar la página.
  • +
  • Routes
    +Es el contenedor donde se definen todas las rutas de la aplicación. React Router examina las rutas dentro de este componente para decidir qué componente mostrar.
  • +
  • Route
    +Define una ruta concreta de la aplicación.
  • +
+
+
+ +
    +
  • path
    +Indica la URL que activa la ruta.
    +Ejemplo: / corresponde a la página principal.
  • +
  • element
    +Es el componente de React que se renderiza cuando la URL coincide con el path.
  • +
  • <Home />
    +Componente que se muestra cuando el usuario accede a la ruta /.
  • +
  • <PokemonList />
    +Componente que se muestra cuando el usuario accede a la ruta /pokemons.
  • +
+
+
+ + +

Para navegar entre páginas utilizamos el componente Link.

+
import { Link } from "react-router-dom";
+
+<Link to="/">Inicio</Link>
+
+<Link to="/pokemon">Pokemon</Link>
+

A diferencia de <a>:

+
    +
  • no recarga la página
  • +
  • React cambia el componente visible
  • +
+
+
+ +

Parámetros dinámicos

+

Podemos crear rutas dinámicas.

+

Ejemplo:

+
/pokemon/25
+/pokemon/7
+

Definición de la ruta:

+
<Route path="/pokemon/:id" element={<PokemonDetail />} />
+
+
+ +

useParams

+

Para acceder al parámetro utilizamos el hook useParams de React Router.

+
import { useParams } from "react-router-dom";
+
+function PokemonDetail() {
+
+  const { id } = useParams();
+
+  return <p>Pokemon {id}</p>;
+
+}
+

Este parámetro puede utilizarse para realizar peticiones a una API.

+
+
+

Context API

+

En aplicaciones grandes aparece un problema frecuente.

+

Muchos componentes necesitan acceder a la misma información.

+

Por ejemplo:

+
    +
  • usuario
  • +
  • tema visual
  • +
  • idioma
  • +
  • configuración
  • +
+

Si pasamos la información mediante props, los datos deben atravesar muchos componentes.

+
+
+ +

Representación conceptual:

+
App
+ └ Layout
+    └ Page
+       └ Component
+

Si todos necesitan user, debemos pasar la prop continuamente.

+

Este problema se conoce como prop drilling.

+
+
+ +

Context

+

React proporciona una solución llamada Context.

+

Context permite compartir información entre múltiples componentes sin pasar props manualmente.

+

El proceso tiene tres pasos:

+
    +
  1. Crear el contexto
  2. +
  3. Proveer el contexto
  4. +
  5. Consumir el contexto
  6. +
+
+
+ +

Crear un contexto

+
import { createContext } from "react";
+
+const UserContext = createContext();
+

Esto crea un contenedor que puede almacenar información compartida.

+
+
+ +

Provider

+

El Provider permite que los componentes hijos accedan al contexto.

+
<UserContext.Provider value={user}>
+
+  <App />
+
+</UserContext.Provider>
+

Todos los componentes dentro del Provider pueden acceder al valor.

+
+
+ +

Consumir el contexto

+

Para acceder al contexto utilizamos el hook useContext.

+
import { useContext } from "react";
+
+const user = useContext(UserContext);
+

El componente obtiene directamente el valor almacenado en el contexto.

+
+
+ +

Ejemplo completo

+
import { createContext, useContext } from "react";
+
+const UserContext = createContext();
+
+function App() {
+
+  const user = { name: "Javier" };
+
+  return (
+
+    <UserContext.Provider value={user}>
+
+      <Profile />
+
+    </UserContext.Provider>
+
+  );
+}
+
+function Profile() {
+
+  const user = useContext(UserContext);
+
+  return <h1>{user.name}</h1>;
+
+}
+
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/pages/Bloque3/ps.html b/docs/pages/Bloque3/ps.html index 1d06ecc..208b93d 100644 --- a/docs/pages/Bloque3/ps.html +++ b/docs/pages/Bloque3/ps.html @@ -504,6 +504,23 @@ MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque3/ps.pdf b/docs/pages/Bloque3/ps.pdf index 799b0d673c0e53567847745ff926b224af2b9ced..b939cfcc18bf598c470d467f11a41f5a90e77465 100644 GIT binary patch delta 112 zcmX@In(4@DrVXwgY=(wLrUs^yy*p%~%*}ZnJGk9k9Ss~^Oe`IZT;0q~T?||ujm<5b fjGQbCoh;leoLrsl6l@49iJkm0LVk1i6iY?`9n&9o delta 112 zcmX@In(4@DrVXwgYzCG_CZ?8?y*p%~%*}ZnJGk8pO MA: Uncontrolled fields y useRef + + + + diff --git a/docs/pages/Bloque3/t6.pdf b/docs/pages/Bloque3/t6.pdf index 95dd72b1c27a2eb00e6329a912acd077136298be..11027cf78f8a41588f00407b5016bb68885b9743 100644 GIT binary patch delta 130 zcmbO_nPuu^mJJJjY8o0EnHrjD8yKn^7^rJ1==Ss)!fL$+1$v?)yU1*+!QEar(i=!$#wyD##SZ(B= diff --git a/docs/pages/Bloque3/t9.html b/docs/pages/Bloque3/t9.html new file mode 100644 index 0000000..e6fa209 --- /dev/null +++ b/docs/pages/Bloque3/t9.html @@ -0,0 +1,973 @@ + + + + + + + + + + +T6: Romancero Gitano I – Training Center SW + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+
+

T6: Romancero Gitano I

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

Javier Ribal del Río

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

19 de diciembre de 2025

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

4 de marzo de 2026

+
+
+ +
+ + + +
+ + +
+

Objetivo de la tarea

+

El objetivo de esta tarea es aplicar los conceptos básicos de HTML, CSS y JavaScript (DOM) para crear una página web interactiva que muestre poemas del Romancero gitano de Federico García Lorca y modifique su apariencia visual en función de las diferentes metáforas.

+

Resultado esperado

+
+
+

Estructura HTML

+

El documento HTML debe:

+
    +
  • Estar correctamente estructurado (<!DOCTYPE>, <html>, <head>, <body>).
  • +
  • Contener un contenedor principal centrado horizontalmente.
  • +
  • Incluir, en este orden: +
      +
    1. Un elemento para mostrar información métrica del poema (número de estrofas y versos).
    2. +
    3. Un elemento para el título del poema.
    4. +
    5. Un elemento para el texto del poema, respetando los saltos de verso utilizando la etiqueta <pre>.
    6. +
    7. Un botón que permita cambiar de poema.
    8. +
  • +
+

No debe utilizarse ningún framework ni librería externa.

+
+
+

JavaScript

+
+

Datos

+

En JavaScript se debe definir un array de objetos, donde cada objeto represente un poema y tenga al menos:

+
    +
  • Un título.
  • +
  • El texto del poema como una cadena de texto, usando saltos de línea para los versos.
  • +
+

El cambio de poema debe hacerse recorriendo este array de forma cíclica (cola circular) mediante el botón.

+

Descargar poemas (click derecho guardar enlace como)

+
+
+

Manipulación del DOM

+

El comportamiento de la página debe implementarse exclusivamente con DOM nativo, cumpliendo lo siguiente:

+
    +
  • Todas las funciones deben declararse como arrow functions.
  • +
  • Al pulsar el botón: +
      +
    • Se actualiza el título.
    • +
    • Se actualiza el texto del poema.
    • +
    • Se modifica el formato del fondo.
    • +
    • Se recalculan y muestran: +
        +
      • Número de versos.
      • +
      • Número de estrofas (bloques separados por líneas en blanco).
      • +
    • +
  • +
+

El cálculo debe realizarse a partir del texto del poema, no con valores predefinidos.

+
+
+
+

CSS

+

Lorca utiliza las metáforas y la alegoría como elemento principal sobre el que construye sus poemas, al analizar profundamente descubrimos que siempre recurre a las mismas metáforas.

+

El color no se utiliza aquí solo como elemento decorativo, sino como un recurso semántico: cada color representa un símbolo literario presente en el poema.

+

Desde el punto de vista técnico: - Los colores de fondo y de texto deben definirse en clases CSS. - JavaScript no decide colores, únicamente decide qué clase aplicar según el contenido del poema.

+
+

Palabras clave y colores asociados

+

Se debe detectar el texto del poema las siguientes palabras clave y aplicar el color de fondo correspondiente:

+
    +
  • guardia civil → fondo verde militar
  • +
  • sangre → fondo granate oscuro
  • +
  • caballo → fondo color tierra
  • +
  • cuchillo / navaja → fondo plateado
  • +
+

El color del texto debe elegirse siempre de forma que exista contraste suficiente con el fondo y se garantice la legibilidad.

+

Si el poema contiene varias palabras clave, solo debe aplicarse un único estilo, siguiendo un orden de prioridad definido previamente.

+

Si el poema no contiene ninguna de estas palabras, se aplicará un estilo por defecto con colores aleatorios.

+
+
+
+

Extra opcional: símbolo aurora 🌈

+

De forma voluntaria, se puede añadir el símbolo aurora, que tendrá prioridad absoluta sobre todos los demás.

+

Cuando el poema contenga la palabra aurora, el fondo debe mostrar un degradado animado.

+
+

CSS necesario para el extra

+
.aurora {
+  background: linear-gradient(120deg,
+    #ff005d,
+    #ff9f1c,
+    #ffee32,
+    #3cff00,
+    #00e5ff,
+    #7a00ff,
+    #ff00c8
+  );
+  background-size: 600% 600%;
+  animation: aurora 10s linear infinite;
+  color: black;
+}
+
+@keyframes aurora {
+  0%   { background-position: 0% 50%; }
+  50%  { background-position: 100% 50%; }
+  100% { background-position: 0% 50%; }
+}
+
+
+
+
+

Consejos

+
+

Centrado de la página (layout clásico)

+

Toda la página debe estar centrada horizontalmente.

+

El centrado se consigue mediante:

+
    +
  • Un contenedor con un ancho máximo definido.
  • +
  • Márgenes automáticos a izquierda y derecha.
  • +
+

Desde el punto de vista conceptual:

+
    +
  • margin: 0 auto no centra texto, centra bloques.
  • +
  • El navegador reparte automáticamente el espacio sobrante a ambos lados del contenedor.
  • +
+
+
+

Animación del cambio de color

+

Para evitar que los cambios de color sean bruscos, se utiliza la propiedad transition en CSS.

+

Esta propiedad indica al navegador que los cambios en determinadas propiedades visuales deben hacerse de forma progresiva.

+

Ejemplo conceptual:

+
body {
+  transition: background-color 0.6s, color 0.6s;
+}
+

Gracias a esta transición: - Cuando JavaScript cambia una clase o un color, - el navegador interpola automáticamente entre el color anterior y el nuevo.

+

No es necesario programar animaciones en JavaScript: CSS se encarga de todo el efecto visual.

+
+
+

Búsqueda de una palabra

+

Para buscar si determinada palabra determinada se debe utilizar la función includes de la clase string

+

+texto = "hoy nieva";
+
+texto.includes("nieva");    //TRUE
+texto.includes("llueve");   //FALSE
+
+
+

Generación del color aleatorio

+

Para la generacióndel color aleatorio de puede utilizar la siguiente función

+
const randomColor = () => '#' + Math.floor(Math.random() * 16777215).toString(16);
+
+
+

Conteo versos y estrofas

+

El recuento de versos y estrofas debe hacerse a partir del texto del poema, no con valores escritos a mano. A continuación se dan algunas pistas técnicas para abordar este problema.

+
+

Conteo de versos

+

Un verso puede considerarse, a efectos prácticos en esta tarea, como una línea de texto no vacía.

+

Una estrategia habitual consiste en: - Separar el texto por saltos de línea. - Eliminar las líneas vacías o formadas solo por espacios. - Contar cuántas líneas válidas quedan.

+

Ejemplo orientativo:

+
const versos = texto
+  .split('\n')
+  .filter(linea => linea.trim() !== '')
+  .length;
+

Este enfoque es suficiente para la mayoría de los poemas del Romancero gitano y evita errores frecuentes.

+
+
+

Conteo de estrofas

+

Una estrofa puede entenderse como un bloque de versos separado de otros bloques por una línea en blanco.

+

Una posible estrategia es: - Separar el texto usando dos (o más) saltos de línea consecutivos. - Eliminar bloques vacíos. - Contar los bloques resultantes.

+

Ejemplo orientativo:

+
const estrofas = texto
+  .split(/\n\s*\n/)
+  .filter(bloque => bloque.trim() !== '')
+  .length;
+

Entrega: un único archivo HTML funcional.

+
+
+
+
+

Recomendaciones para afrontar la tarea

+

Al enfrentarnos a un proyecto de cierta complejitud, el como afrontarlo resulta de cricial para el desarollo del mismo por ello a a continuación dejo un esquema de implementación modular. Sería mejor no utilizarlo, pero puede ser un buen punto de partida si no se sabe como empezar la app, no es el único proceso de implementación válido ni es más correcto que cualquier otro

+
    +
  1. Estructura de HTML básica contadores de versos y estrofas placeholders de poema y título y botón
  2. +
  3. Formateo CSS parte estática: centrado, tamaño (todo lo que no sea color)
  4. +
  5. Definir clases con colores predeterminados
  6. +
  7. Lógica interna con JS
  8. +
+
    +
  • Buscar palabra
  • +
  • Contar estrofas
  • +
  • Conteo versos
  • +
  • Selección de clase
  • +
  • Generar color aleatorio si procede
  • +
+
    +
  1. Integración con DOM
  2. +
+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/docs/pages/Bloque3/t9.pdf b/docs/pages/Bloque3/t9.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f62e76bf6414648a6a31898841f55d50eeff78d6 GIT binary patch literal 67989 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℘6;OWtA<_{4jZg6;0(o?(;?NRwWG~1-koNk#UKED z(@N(wVX!R6K==9{LiyxrbbvqQ{W``Ajjh3-IEYzzh-cQ4ZJ)Q_s4V2z!9CDElqvis z(HTY-?#_qto$+F8&Cn=mXTY1PRs*b(CW&IT2?D6$uCn&UN}DwG%60O@wQkV9%2!}g zy@?|$Cyi&fxju>-!{Vp+=)^($5uR6UNWFWvgmW)F2G^!>15|tA3|RycX>vG~23xjp zzk#~<;Fs5UY6}XJ008nXHq8^4CycDu3Ka@-hURH#3d#@(LI{k~bZeKt+WprvSO?%N zxQ4Jsea;1f?1{G)duiw$S|yK~Oe{hMSOPU-H$T0S>=p6MifkW5?Ftl4c8h>;P<(&E z>?`lnEmycm@tdON6kSk1Ih7XN)_9loiVXj>#5}@KsTbMhst^XjHe`P|Lw8lW9x}#b zQ;5Zm?@p7n%{~5Or;o8P(54M^wd6ibaBiZe-QM^OTyc3oaD)Ff>{TOcT6&W`D+{!K zaKNjxi}(8u*Eob|GL!rjogp_eZ1L74J8X{6QS(DcP5TSHRHWbDkQggxOabyY313vb z;pXxlW#6&S6q5~?L^Ee5%NE`Ni}MpbjJYXdZ#iGyCv!!zaUzAZnKKh}Wuu7lrH!pl zBWcSleGzDX=WOg#`yh{R$EcM4l0v+p@8hFbfL zkBKGNFUPf`SXyNvYn`)=t3iNaW?lCSD~}L@jYvmS!Y%EgS@w$+2E_XUCR&8^u?80rl&;@0@jTo+IDSI zwUR6BNVaHN-Y4G65@?{x63Q}m8W=%8a6WevE#FlfO~?zS;CYQZ=DWVJ1*k@U`zHSN zpw9hTLfD0*3% zQO4=gyjkI3sXk|+Yh-6-E7cN0c6`3dvIR~w9jx8FGNR@(J3<%24%|V(_AF48hY*6x zXf5x%$AHBoh3Gr2YkmtvGp5dteO8Q%b9|cN$15*H0O@sXMZ|8|wOP;!kKW{W_5fJ_ zsDw$#AwhBd=rvDd@;no!YewLc?fds=IfE;-!ap)Omd5(@Adx%Fs;^msU1dh zhK6=HKyrk&?iT@PPBDLe9tgXhOHlPq*<^~dGEIre8*Nmi;p1&q=IdjZWrlNW{dnY6 zot1fI^yTTEpN|R}3VI!ejs^<(!Alp&+`V4*lh^^!Nzg|8x}@AeV~acTSJ{ln=Ay|+ zo48}4droYOq^4{e1=bZ8(>ohm%)^Ji@V;}8zkH&t5b*8(oKsxttjVPV`3$uoV>`aU z=yUnKjYDPze+ApD2ViU2!ch)H%t>0g>?miYg`qlSd$@`#sr*oHP9_d*b(kh=RATSt z^>9E^NAEHRie-i{>i_72%jx88&`4>uSZu{#t@gj4zCb3(sL-)Gr-=~XXNAWCM0H^M z!J&LfB~b8A7!HkQW0vj&&ww@zpB;v|pJxkG4`vw<9-IPa3po#!yQ33IcboZ@?uI$pyI*XT@A~Ebm~osZ;xe~8ELdg7B5)z>)MJrN^7@>bRlPtW zpwGUIt3IzJsX|FTIF!buk24d7|LwpWlknF-+=bG;-*!Twn`D^I>9*KWa;9zO06s%< zY*IHEUNUpIzlLd#gYci^mQbq*ph^+jbcK(39GA)z;IOFvu9>g)+HhGmH;#J z`h4>8*L3;;@{1z)ge@iVtE=X?G7g+xm!?PlNb%xC!?N3zIIQzvD3EMU*up3OBroER8tK&SU>np!5vy&1`M1V=#pBq zYkC?o9sk_vqmR8tp&I1IcVAbG37p&RUJ<%I_;G+%h}1T(oVKjEyo#RLX8PjHPmeIZ z7Z`>s@*FO+2hg^2S673&f{&k=p?p{3Ulr=|tbG4}LlVp-9_KE(TG z@PMEzY8(~V{>SA_Z3<(=AyKK?c++D2U zJ9>CH`5_;orguV*1{gQ)Gqi8q&p40iaXKG6Qyxv2WCENVj-hI+vsm)OJi+uSyiUZg)qkai=IWGYoV?$=$+*82=o#P>%Rk#U_)4UJMuzuPop- zV$Pv1Co_4GqP-<8a=Q}{Broi|$9~h|L4((2vku6v$m5SX94zSy436hw-nV$$dCs42 zyq${+Z#Lpm7XQE@Bz1Qbhq}yTi$KOQmhtF?%M9A);ffEgs+>XZ0)?Cl`PySh=EM^9 zd!JecsWxdd>MSA79)o)+7$QrQ1m`nWdGp4bhIcOIb~VTd?_(dqB5_@@H^5F&w4ZZv zq9swbl$B*3Cx>2x<+G&vVPjd8=$msD^1|2 z|B*;W_{~KPkZh%A!1^(f4Zl+nza%QBses^(Awa65u%o4Lw$l4C|2OUtFiwEzTJMe_ z`kP;6MR;6SpH-I?eyWCT!l9ZGKm?ER1cWy|Wf6qPK$-#4_nak-3unexxihRy$+JC1 z2*xhW)L|def-X9^Mo{-F%x6}oI0HnQ63CfvUpo8E%?8RxZ}M&j`Gv=f)(xeCIyTqX z4NKj?;Lj_Zf}iraZ@f140#Qw}ot@uEhe4bnwDTjSU?@ds_a*^Jfe@!~d)#j%7*i(G z^;bbWy`_=a2Enw9Fs*Pc+BeQC=UV7&IDOyM(J#3iLOUFHU*R8fu{*o@)74J{Rz=YR zD;y#0>aQQ!G8w3&5p)^L5btfXrLO^;w)-!`dca`jqNsc+4P)!M`+|ihUe(Z}%T+Ok zyGM8Rk&cRf+!Gf{HcXdEgr_#uoLm&4v;?6ncRESdgJbw2JRB@m+}JtZl}J!Mv@^F; z=7zm~k@AU9M?2G2r#<3hFRI^2*Wb~yV+HqX>pZ9renCR*GL^u{2wt`%> zRQ4gXvyFEPlP7o0IfCXIiKycjP05N)E%1Jub`fO>%hwg+g2@P5qsxl8XFgv-BMh)R z4V|~dj!p*nI+=gXc=zPgE13mQbT>GsO#Y(l?CQwi!1B+nSnoZWdux-1*@gV}!E2(D zxL#7mi};|G!AsEd6;YTFiGQ8rcyc}B0v3`$j(pl4YSE|iu zG?GZHDJmMf;Jwm1oSaGX&(8}q-}fVZDJ8MQUbM(}W4A$Ewp-;$o_F#EXZ2|%NG_bEs5Jh$NfT&xAWKz1g2Bhx3>K&rd6DUq^p_&OlYIjX( z5sa?MyynUjPJZEvbbLA=#(tpy)U%}${iw}HhSDdijfKe0-B%iC|NL^p5A$p-@R}RLyXuZ>S8|{B`-z|F`{$O$L$RsNW}6JR7oJUhx_$$w19M?3Q+;M-Zw1EE z39foAn5Z2t#T3FvIWp1nMM|Y@Y-2I^Cy%}Bl2cRc!`)I2s80tZ|KMzi z1EKtt=o`H~|0Mjo^&2OW1ZnP~pKYf3d5>7RP zcc=N&n|%drzy@#NdM>F1AEPBkx^$XlYGDhP1#s}kXGPr%-HZd!j^RFI3vo-flf86E zVGvIADhox^Q>INz<$Af>&2#RIPz^(RJ z3}ePwy@!NKk&-_x+f5s^RuO>!ZOtcIg{`)2trh|bE-Upc(r4N~VXghyNqQR&5ne-_>36V@)Bl#3$WOF*4lxGQUQ%8pRJ2_R0V zW0)$RnG+=j5)~nfdHserdOg>;Yh#B@rIg%lg|OgXLNsW0spLpAHxI>8HxTgw7P1a_ zhcH*xq_8b4LUB3fzTKTz;V|qUMlj6dEhH<-uWK9bgkISspHl8` zewL}mt$S0+>x}yn@*GJ#&i(yHc5xoP2#h?sDniWyLIB%uf&m!diiQ@cBr+|i1hW-; zVk(RP#P1;WEd(c;U9btUd6cI-CX-*i&-Aj4Mv|DK&g05dhm_1zhedfD%#oD6<7;ic ztmmH`RYGs5R>#MYxG0mNt1hEiaayc234q0^!G^XVdta)Q%SDFq+e=*9QGFGZ&tnWK zdl%E}axHSE#Hort;nn=E`gWN`XH<<(KdJHdvZ73L4-AtDCUp&c5mYXsQyD5({SAl1 zoflCk%>~L6apUMH_qAZI`ufnK#OA>|Yz)iX_@Z3@?fZ8U1iWoQZW8)ug62s>N7kk78@g3_%*)6*( zsXAL(BhxH^Lv!A%Yi|6>)*-I`@I98}-XG6{_GJaa@jv23E~#K?;izFpaqW6eZ-0+l z!LE&kq93F<(Twa4^gRX_6sV%pXOhyeCgF}*^zlCAN@iD1Pf^H~0%{x7@v>9UhLM6e z(AwMMf2Dg{lcAF-I+O(mAH%pf;LH_O$W>@87Q-#=5>pe8)ePW|8C_d4|F&T1O;l7? zRgAOF`^@@6LbI{A)c(UEL~5`>NH@bkIi+&XK=!vte3Pt-zW6(fM4}aqBu!qp&|pZ& zAm0XkH{#k?McB2FbpkBP*4Ecw8QkN^)2U9DPm}4%3>yUoyky7p&}&kl*H<6IN}$ZL z{jINnq!-u4Hk&5RX1Vw5=0)kY;kN@E9~gX|GtLXY5G}Qj09k=I!m+zDf%uaFCZ`8M zDcxGAktRjo&3e>pS)EDKewTc75Y4u9fY z%FJZ(4itX)$jQsfZ>zr>2tVMgcFQUOACt=7(QkFs{2-p+m}q}D8~Z`OU=a_=Zm_=p z!a5a*gxjSWW(FEzar8f55_V0&us%3Y!!ZNW2k#s?pU8%NdmKR4K5jtjH*+|#?zka> zt~>Jc3pY}1M>uezwN_GNzI-6QYp}Ear-Q5iZdN7^_J4Ql`qu$fNTOckE)!blrH)N zyU>kEe^9EtB_m6~u{myVaimfAvf3tK&@7ipyXDk;NQh*_FSgKIN^8Cr|=P9=D09lG_si*N0q)lAN!Mrw+;Zgcku{HTW(BL*DY4r4&b<~ zdLufG=HZy~o}%D!T0q=b@D$+w@lchhS151uDyhu4s<(Pi7makAF&Oysreu22$8+3z zl%nWMy0S$1&T|d=R{H&tdRHncAek8B-J*&f%SgV&@fW}y%S5$0-HG{ww-N>A zoTaqqtSVIsHi9j{v_MTLC{{oDtg2+B=e-v?z`tU9Ck-(`d4HCJu!KA$XG!ekYb<_b zE1sWPQZP(@B6>7!+V#&mq^qrF?QA|AA%G2FLC`#EdLU~ zU*h4OUiNACIXzBc4h5ied6g8uYi?J2J z#F>hkQN$5owga0|1Y_JH2vq1{DW*l%_sx# za05D;I#E#*F)BI&O{(Q8aV@qs6=@_PxLvM zSee+EnOWG`xoMf0DVdlkKl$WC%`ADs+cB&xQmUAu#uhJ zUu;ziODCew-=_|e!k=2u5vcd{)alB8~{xsSxZ*{(We^h)YPA6^MBVD(AWxw znf2d2R8>9fKLHestyG+Ci5TUHIGI0DEghYli8wwTVLzKT&Yysc;x?amB?>SBntpQ2 z0_@D4Er?i|m^uFAnZLFc5SJUp_n~?_zY|uX1JRI45M`KqNWRXsDw7QHd*wAu4Y`Oi z#1Fr2gLs>|_KixeQ266*EyyRe+Ol+Et)W!K0L#}|4UbnD3cNR3iq64qBk7rLfcPxe zaK@hrY7D+m?B3uwR|%{M6|gT+V4xEEr8aJGtPuS=MZtXdOd1)`wp>1TA{O zj?BVbDePg}6gi;md$sF{EJeuL(28Iz75(*vr7_qrbObX&T$F0)Gy#e|OA>BVC6!@Nf(@Cm0%4|VYkE~c(Q@&%bLr?Ak{5r4<`wjylt(CE70?WTK_)^$l2nC- zKPtK&HE%8NC(30pZqcvo`=3{J`{hrc*{~Wg5UfZX#xI+6e{|Kqh;c_&zw~kYNejq4 zYt2lD`kED? z+|Qk*mi|j$-Rb3h`_^T=iAD4Br$1(`(tnobXzx0B-t1rR_qQa5hsOtREJz>Ue;gce zi|fiWF3J|?DrC`pfNuEMvaM-k=+;u`z!|c7bbL#v=P2dz;OX>bPB(Z31~nr4FVMLR zN&QGpKRI|kyWZV(3{^37Y)jSi31@J=p;q{1&m6zE^Xe!*MP;}RJ<`R;l^Fop!LkrA zU1djf|F%Y2UZRmcxTZZ~E6GbLWqNBb9J}2WtztBY5VJ zvdg4POsAR5-1rYw6eu}*t(@%o3tJR?FQup0YcjgiE0bs!uhvKF(eT^RGvlt!3g4QI z;iGY2JwJy>Jx_L}Qor+t_E?MlbU5r{tpcB?u4L%cVolRWe-)fPthMYQr)uM((nb$igSfl77F{?b z8grt{8xv(mVuTD#8;9~z8bIopq?nb^O!C0SAC9DQrK3H7XsIrTFJ2uHwjn&uD&3ZVz)EVYs4RcuO%QXS1l!F;b zO*lf3vTa+~!d{|J(CPW-OiYFwhOZfHya(ofRNdZLnW0(_QnSR>AHYl8jSHCsMQ>=i z0h*+uXUOeg(6d_h0n(Cz4U#M7Ywi)`$gn5V{;Fe3H7m_^-D^YI7fdr31D3f4@ zJT&H&!e1US_`87o1pnxzk=IY1yYbc~^IzNz&9hq)z;g!-3#6g|G{QLYYdW*SpM9RO z1n`N?Ya&Jo!Y`sct?t@Y6cfNzANt}uJ_5Y`MA*zl2+1G6KrtW0k`H820W!h`i zverBT`Z*a94PKkW`f5KziK0pS6eahLwX%LM3zX&GE7XhEK?X*1ngCkSS`l z-e&~?wzJ7u)N_6uUWBP;PQy@)yT?Q8xwg9rllZw}iVN#=thE*wt7sSqJ;e;s@jNk8 z9M#f1gwC}dbuQ_5b8UdzR85mhgs$lD#x;?6;^Lcl8~FpLl_kfzgNBL~GquJQN!GP9 z#)8*rgN)asJqMw!SZ2!>UJ6`wDt9R@9VeioyqnrJej7lO8c?cuD+A%|;J)yf<5?y7B-XQt)>3!i^ zNsIS^b!0bgCHArbz4Q3Juwy-z-@DK#Kkl6TU}rPo#$hsyh&ShkYR@dn|KSh9*5F}Yyt^}|tSt})qoa#P-tQIgAHkCWFb zBnbv#kB(?Fg;0+fT*Rt6(t(G|&{n9qd6GLD9bnhw3XaN6`eBbaB883pK8-6LJAsR^6E*k5|{%C&NF~Ek01ga@>6t zi$h)pS?Qv(jP?+OZZ7)KMla8e###e!q}ZpIQ0_y#C?**LDY>rqTqNFRG4x4eCU5U<8|xf#BJcezi;2A4b=R0 zO(`+=hhlR{s!i0cN;VVd57#Dy?nO8(qgMOq+D6iPGNe#eZRR(8WPeUSQV+&^3inqrd;Cq<83LvIvU3wP7QU~ZQ!kFA_^wY;A3MYb&PJJ5v0 zN5`-b5ZEn)Jam8c>%FSR` zH`goVsZgT}cB>xUeBHb15&Z1o#~bgGRLX5uzNC9TKc zfkHUgo4AZk=)1R2g^$N9TmJ8_GGYn)K{adgyT`caJTc9jt9v1{-jKG2-Idh|_e+ z2UL<~I>{@Pc51*391>pHc)s;0yli=7Tt>z;!3t<7X)HB(o~j>cgM)e#G03s*w`3tPBJ?e-8gmkfHon$_)6~`)lL=?TLPJ@-Z`uvv7!ti*a*^ zin6h>3$cr{h;a*XbBnOEigPnFv48vTuzVu@f7vbU|A%_WqZ1Kroubp zGI}+D_V<`I#RmLPmWzfxW$k9saM4vr1(K8W3dx8oLihOjZlZWL_XH2p=U6*LU>BT zAS_g+1j0ko)C!2jPx01zsm4oSn-n>iSHUXv3SLj_h6^oH1I4P0oPYa7I+Rls2#p;;y-q zP5}k(O7`C`xe{D6fO`t-l_kwBcLs;a`X>{|Wesmy^CSEghZc_jPW~ri- zhAh_u*AgAj-L@G3y3_pP1hXN0kVfn2@hUR@?QAI4WQ$z#q)p;B^p(m}kL?GPQ#1Cm zg8tDUI^u;lBe*{=r}pBHQ2?Z4>g6m-S3?85M=RCGC|0EN>eVc%_e1+Fx5j*J(MTRs zWwQK#hUPPFJ(=6$H_WbxI-ky>o5haahL2HLBXt`~Ww#!N?ka9iJe;Lc;+akrQ!O8c zCTNdztevIW<6TcxOAkAgd`?~;aW=vU{Jxy3KRpfN){~pR1D&5lG!c=gNtMM5qFz^W r#(-O)MFe94y5E5p|NC3v MA: Uncontrolled fields y useRef + + + +

diff --git a/docs/rubriuca.pdf b/docs/rubriuca.pdf index 4b88c587e2a770046962305a065c82c19a72a24e..557089c04730624b7487b757b9627e8988331ff6 100644 GIT binary patch delta 1572 zcmV+<2HW|Et^$Xy05H?r1Bcejk1&WY2cF|UF9r2U#Vl0ru0$GkOgorwj zp5DO-Q3xqwCPb4FX+(}d3#D9KU6XE1kBsxiCZ9#hp>~Bb6dvWz<2WT9?b1ldouV`- z%7}t+G6|Chg=8c(e-8jw6@gL{aHa4f_y_@aQ?8*$VUS`B1EEJKuplTjPEcI#Edn>Bt5Mp>=bVfo?q+h%m{kbB}AN^Y@=p#?#U z5Yj8wgs?~uZc1fSYHdudz`;dbgN%L<6=@Yr#f8R7Y6QW}-JAb!Zb= z5z8r3IZ=PXWmJts125x#flVYDv?=H$eUb>C;8E~VZyp})m0(h-@!kXugdigc%}KDO z4+S5Ei^A|EWDs+*%kxjy$G`r5a$eo_CxZ9R%iD)> ze@f~Xe~+`eygQ!URPnmK9nI?L!4MoL0-wMVyik6QSie+<<8qpJozU6CE*E*lMYC%5C0@$7Ki zznw7)zmMp1wsHAQs#&?s=Rbz8{OmN5(FNL`J<>QFjZ19GrU^kh%NkpBP0&vz`iHgY z%~Rex%05g6)evRKmc~-LhJ8S&sPA#9rMaxWPDao!aq9gH#d@NgeEs-g_u>hR?Cn+K zf8jf@#ILf%@Yk>eo3o83R`_L_;9FUbzIo!iA<;y&&_r4(3~%L%{|Q&tCvb@Ua-VmOHhDDJ&jVxO_ZzltTQ^(=9CS+K<5 zrt9Gw8WWCw_an4@bC#^l-x5jO3Q0l-lC1OGnIq~2M?!aw{Py9?_4)1s$-6Zsmao#p z%Gc1uwcj{Wteho^&Ju|mhkgYqq<+iBq%C<1j##nG5vw|Iq{Vq>nwaM_(Y!lNe|C?q zuP^rJVEjAMMrFnH-n%5TRU1=g;w6A)8^Zg&K=^=}gNR=!? zGGjSrHZUB9xYS`eLH?`*nX@-O_%NK1Y~^(z&B!)!0JIoK7bl&qyCX zj*c#x3c2+nPLYu@x#G4kj$AP3O&qnb$MH=1*5+hxaNv-l6S<|Ef5G{}ncRaCb4AZ{ zM~ZMmF1*e$ic>exr|_QK6hY)hLfBm4j))3D7brsB*hO2xb;M7`i?Kis3n655Aw<-H z^z;r!h(bsaGa;IcNF#CtS}5h>>Y8+8dSsk8Hu)@44z(+kq3|ew9>*!^XqQGp?i8g# zQAQMmlS!C7C?q4Pe|Z3~stA;tfGdR;!AA(Vn{o|33WF457zjN=fdxUKaf0G;HcbrOIf$vQP#E75s@K8Nr#e+9RfzU zgbwC}jx1tANk=w72(6o=40P+sK*S56hZCL>7eHa-kYt+&f6yt8hTIe1P;!e^3@r#+ zgpgjbCWJ+Ta8oLqQfp&s1r9Fi8f5f?s7Mo0dFl&j#79j;W|X1GjF6E|&|}Rf=H74< zqa!0BEcSpxRG=M@QgrAfB0W+NGOiP8p>iP*c|#E;;x61k81doD`dh_sTuLP4yjrS&SAOsmnXikDH zeJJ=SToi^UA(PN^^}?z+g1AizIErNJk}bvCXnXy9f1NlSl6CM;im|*=x<-a1MN*9< zZnhQ?M8`;+hDt&T_d@d3Tl1kd*Rvog*eU7mlsKK}Lhlk@7XKM}llUfw>8 z`%_ZCe|VhL<=ye*ri$0??Pyj{A2)V~)wgmpJDU#6>1cAhaXiH3I;tNxvC{qhxV)pQ zmp4r&8lAy(bdT$jI%v914zAGM^X!Tm^F@y_N4wC^c4q_f5A+aciCvLJGmW~jAw`A z{_Tue_y*wltQ~HS7aIMSYJ;EzM>1buxl>iBs=qDAp6@sjLPvS5k9 zP1nOWG$tJV?nh|*<}6v8za^5m6_SJwBw6RVGe^`5j)d+U`R&7(>+{_Ol6PxNEMKLG zm9L?RYrk=%SUF1+oh1@C4*d#JNd1bmr7jNR=!? zWHdNsWj8iuG&MG5He)e4IXEyfIbvfmF*i42H)c3xK0IVJIAvuwHf1z5Hf1(rF*!Ln WFfut}V=*x|H)1ztIAyc8l~DmVfBQ=S diff --git a/docs/search.json b/docs/search.json index 407c574..6c29f53 100644 --- a/docs/search.json +++ b/docs/search.json @@ -206,17 +206,105 @@ "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", + "objectID": "pages/Bloque3/MAcss2.html", + "href": "pages/Bloque3/MAcss2.html", + "title": "MA: CSS Flex y CSS", "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.", + "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 9", - "MA: *Uncontrolled fields* y `useRef`" + "Semana 6", + "MA: CSS Flex y CSS" + ] + }, + { + "objectID": "pages/Bloque3/ReactIV.html", + "href": "pages/Bloque3/ReactIV.html", + "title": "React IV", + "section": "", + "text": "Contenido", + "crumbs": [ + "Bloque III Interacción", + "Semana 10", + "React IV" + ] + }, + { + "objectID": "pages/Bloque3/ReactIV.html#ecosistema-node", + "href": "pages/Bloque3/ReactIV.html#ecosistema-node", + "title": "React IV", + "section": "Ecosistema Node", + "text": "Ecosistema Node\nHasta ahora hemos trabajado únicamente con React y JavaScript.\nSin embargo, en el desarrollo real de aplicaciones es muy común utilizar librerías externas, para ello podemos recurrir Node.JS.\nReact está diseñado para funcionar dentro de un ecosistema de paquetes.\nEjemplos habituales:\n\nReact Router → navegación\nAxios → peticiones HTTP\nChart.js → gráficas\nZustand / Redux → gestión de estado\nLibrerías de UI: Tailwind, Bootstrap, Booswatch", + "crumbs": [ + "Bloque III Interacción", + "Semana 10", + "React IV" + ] + }, + { + "objectID": "pages/Bloque3/ReactIV.html#npm", + "href": "pages/Bloque3/ReactIV.html#npm", + "title": "React IV", + "section": "npm", + "text": "npm\nnpm (Node Package Manager) es el sistema que permite instalar y gestionar librerías de JavaScript. Como su nombre indica, está desarrollado por Node.JS\nCada proyecto tiene un archivo:\npackage.json\nEn este archivo se registran las dependencias del proyecto.\nEjemplo:\n{\n \"dependencies\": {\n \"react\": \"^18.0.0\",\n \"react-router-dom\": \"^6.0.0\"\n }\n}\n\nInstalación de paquetes\nLas librerías se instalan desde la terminal.\nnpm install react-router-dom\nEsto hace tres cosas:\n\nDescarga el paquete\nLo guarda en node_modules (capreta donde se guardan las librerías externas)\nAñade la dependencia en package.json", + "crumbs": [ + "Bloque III Interacción", + "Semana 10", + "React IV" ] }, + { + "objectID": "pages/Bloque3/ReactIV.html#react-router", + "href": "pages/Bloque3/ReactIV.html#react-router", + "title": "React IV", + "section": "React Router", + "text": "React Router\nEn una aplicación web tradicional cada enlace carga una página nueva.\nEn React normalmente trabajamos con Single Page Applications (SPA).\nEn una SPA:\n\nel navegador no recarga la página\nReact cambia los componentes que se muestran\n\nPara gestionar esto utilizamos React Router.\nRealmente es la misma página, solo que el usuario lo percibe como distintas páginas\nEl usuario percibirá que el sitio web está divido en diferentes subpáginas\n\n/\npokemons\npokemons/pikachu\n\n\nComponentes principales de React Router\nLos elementos fundamentales son:\n\nBrowserRouter\nRoutes\nRoute\nLink\n\nEjemplo básico:\nimport { BrowserRouter, Routes, Route } from \"react-router-dom\";\n\nfunction App() {\n return (\n <BrowserRouter>\n\n <Routes>\n\n <Route path=\"/\" element={<Home />} />\n\n <Route path=\"/pokemons\" element={<PokemonList />} />\n\n </Routes>\n\n </BrowserRouter>\n );\n}\nElementos del código\n\nBrowserRouter\nEs el componente que activa el sistema de navegación de React Router. Utiliza la API de historial del navegador para cambiar la URL sin recargar la página.\nRoutes\nEs el contenedor donde se definen todas las rutas de la aplicación. React Router examina las rutas dentro de este componente para decidir qué componente mostrar.\nRoute\nDefine una ruta concreta de la aplicación.\n\n\npath\nIndica la URL que activa la ruta.\nEjemplo: / corresponde a la página principal.\nelement\nEs el componente de React que se renderiza cuando la URL coincide con el path.\n<Home />\nComponente que se muestra cuando el usuario accede a la ruta /.\n<PokemonList />\nComponente que se muestra cuando el usuario accede a la ruta /pokemons.\n\n\n\nNavegación\nPara navegar entre páginas utilizamos el componente Link.\nimport { Link } from \"react-router-dom\";\n\n<Link to=\"/\">Inicio</Link>\n\n<Link to=\"/pokemon\">Pokemon</Link>\nA diferencia de <a>:\n\nno recarga la página\nReact cambia el componente visible\n\n\n\nParámetros dinámicos\nPodemos crear rutas dinámicas.\nEjemplo:\n/pokemon/25\n/pokemon/7\nDefinición de la ruta:\n<Route path=\"/pokemon/:id\" element={<PokemonDetail />} />\n\nuseParams\nPara acceder al parámetro utilizamos el hook useParams de React Router.\nimport { useParams } from \"react-router-dom\";\n\nfunction PokemonDetail() {\n\n const { id } = useParams();\n\n return <p>Pokemon {id}</p>;\n\n}\nEste parámetro puede utilizarse para realizar peticiones a una API.", + "crumbs": [ + "Bloque III Interacción", + "Semana 10", + "React IV" + ] + }, + { + "objectID": "pages/Bloque3/ReactIV.html#context-api", + "href": "pages/Bloque3/ReactIV.html#context-api", + "title": "React IV", + "section": "Context API", + "text": "Context API\nEn aplicaciones grandes aparece un problema frecuente.\nMuchos componentes necesitan acceder a la misma información.\nPor ejemplo:\n\nusuario\ntema visual\nidioma\nconfiguración\n\nSi pasamos la información mediante props, los datos deben atravesar muchos componentes.\nRepresentación conceptual:\nApp\n └ Layout\n └ Page\n └ Component\nSi todos necesitan user, debemos pasar la prop continuamente.\nEste problema se conoce como prop drilling.\n\nContext\nReact proporciona una solución llamada Context.\nContext permite compartir información entre múltiples componentes sin pasar props manualmente.\nEl proceso tiene tres pasos:\n\nCrear el contexto\nProveer el contexto\nConsumir el contexto\n\n\nCrear un contexto\nimport { createContext } from \"react\";\n\nconst UserContext = createContext();\nEsto crea un contenedor que puede almacenar información compartida.\n\n\nProvider\nEl Provider permite que los componentes hijos accedan al contexto.\n<UserContext.Provider value={user}>\n\n <App />\n\n</UserContext.Provider>\nTodos los componentes dentro del Provider pueden acceder al valor.\n\n\nConsumir el contexto\nPara acceder al contexto utilizamos el hook useContext.\nimport { useContext } from \"react\";\n\nconst user = useContext(UserContext);\nEl componente obtiene directamente el valor almacenado en el contexto.\n\n\nEjemplo completo\nimport { createContext, useContext } from \"react\";\n\nconst UserContext = createContext();\n\nfunction App() {\n\n const user = { name: \"Javier\" };\n\n return (\n\n <UserContext.Provider value={user}>\n\n <Profile />\n\n </UserContext.Provider>\n\n );\n}\n\nfunction Profile() {\n\n const user = useContext(UserContext);\n\n return <h1>{user.name}</h1>;\n\n}", + "crumbs": [ + "Bloque III Interacción", + "Semana 10", + "React IV" + ] + }, + { + "objectID": "pages/Bloque3/presentacion-reactIV.html#ecosistema-node", + "href": "pages/Bloque3/presentacion-reactIV.html#ecosistema-node", + "title": "React IV", + "section": "Ecosistema Node", + "text": "Ecosistema Node\nHasta ahora hemos trabajado únicamente con React y JavaScript.\nSin embargo, en el desarrollo real de aplicaciones es muy común utilizar librerías externas, para ello podemos recurrir Node.JS.\nReact está diseñado para funcionar dentro de un ecosistema de paquetes." + }, + { + "objectID": "pages/Bloque3/presentacion-reactIV.html#npm", + "href": "pages/Bloque3/presentacion-reactIV.html#npm", + "title": "React IV", + "section": "npm", + "text": "npm\nnpm (Node Package Manager) es el sistema que permite instalar y gestionar librerías de JavaScript. Como su nombre indica, está desarrollado por Node.JS\nCada proyecto tiene un archivo:\npackage.json\nEn este archivo se registran las dependencias del proyecto." + }, + { + "objectID": "pages/Bloque3/presentacion-reactIV.html#react-router", + "href": "pages/Bloque3/presentacion-reactIV.html#react-router", + "title": "React IV", + "section": "React Router", + "text": "React Router\nEn una aplicación web tradicional cada enlace carga una página nueva.\nEn React normalmente trabajamos con Single Page Applications (SPA).\nEn una SPA:\n\nel navegador no recarga la página\nReact cambia los componentes que se muestran\n\nPara gestionar esto utilizamos React Router.\nRealmente es la misma página, solo que el usuario lo percibe como distintas páginas" + }, + { + "objectID": "pages/Bloque3/presentacion-reactIV.html#context-api", + "href": "pages/Bloque3/presentacion-reactIV.html#context-api", + "title": "React IV", + "section": "Context API", + "text": "Context API\nEn aplicaciones grandes aparece un problema frecuente.\nMuchos componentes necesitan acceder a la misma información.\nPor ejemplo:\n\nusuario\ntema visual\nidioma\nconfiguración\n\nSi pasamos la información mediante props, los datos deben atravesar muchos componentes." + }, { "objectID": "pages/Bloque3/ps.html", "href": "pages/Bloque3/ps.html", @@ -1377,17 +1465,73 @@ ] }, { - "objectID": "pages/Bloque3/MAcss2.html", - "href": "pages/Bloque3/MAcss2.html", - "title": "MA: CSS Flex y CSS", + "objectID": "pages/Bloque3/MARef.html", + "href": "pages/Bloque3/MARef.html", + "title": "MA: Uncontrolled fields y useRef", "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", + "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 6", - "MA: CSS Flex y CSS" + "Semana 9", + "MA: *Uncontrolled fields* y `useRef`" ] }, + { + "objectID": "pages/Bloque3/t9.html", + "href": "pages/Bloque3/t9.html", + "title": "T6: Romancero Gitano I", + "section": "", + "text": "El objetivo de esta tarea es aplicar los conceptos básicos de HTML, CSS y JavaScript (DOM) para crear una página web interactiva que muestre poemas del Romancero gitano de Federico García Lorca y modifique su apariencia visual en función de las diferentes metáforas.\nResultado esperado" + }, + { + "objectID": "pages/Bloque3/t9.html#objetivo-de-la-tarea", + "href": "pages/Bloque3/t9.html#objetivo-de-la-tarea", + "title": "T6: Romancero Gitano I", + "section": "", + "text": "El objetivo de esta tarea es aplicar los conceptos básicos de HTML, CSS y JavaScript (DOM) para crear una página web interactiva que muestre poemas del Romancero gitano de Federico García Lorca y modifique su apariencia visual en función de las diferentes metáforas.\nResultado esperado" + }, + { + "objectID": "pages/Bloque3/t9.html#estructura-html", + "href": "pages/Bloque3/t9.html#estructura-html", + "title": "T6: Romancero Gitano I", + "section": "Estructura HTML", + "text": "Estructura HTML\nEl documento HTML debe:\n\nEstar correctamente estructurado (<!DOCTYPE>, <html>, <head>, <body>).\nContener un contenedor principal centrado horizontalmente.\nIncluir, en este orden:\n\nUn elemento para mostrar información métrica del poema (número de estrofas y versos).\nUn elemento para el título del poema.\nUn elemento para el texto del poema, respetando los saltos de verso utilizando la etiqueta <pre>.\nUn botón que permita cambiar de poema.\n\n\nNo debe utilizarse ningún framework ni librería externa." + }, + { + "objectID": "pages/Bloque3/t9.html#javascript", + "href": "pages/Bloque3/t9.html#javascript", + "title": "T6: Romancero Gitano I", + "section": "JavaScript", + "text": "JavaScript\n\nDatos\nEn JavaScript se debe definir un array de objetos, donde cada objeto represente un poema y tenga al menos:\n\nUn título.\nEl texto del poema como una cadena de texto, usando saltos de línea para los versos.\n\nEl cambio de poema debe hacerse recorriendo este array de forma cíclica (cola circular) mediante el botón.\nDescargar poemas (click derecho guardar enlace como)\n\n\nManipulación del DOM\nEl comportamiento de la página debe implementarse exclusivamente con DOM nativo, cumpliendo lo siguiente:\n\nTodas las funciones deben declararse como arrow functions.\nAl pulsar el botón:\n\nSe actualiza el título.\nSe actualiza el texto del poema.\nSe modifica el formato del fondo.\nSe recalculan y muestran:\n\nNúmero de versos.\nNúmero de estrofas (bloques separados por líneas en blanco).\n\n\n\nEl cálculo debe realizarse a partir del texto del poema, no con valores predefinidos." + }, + { + "objectID": "pages/Bloque3/t9.html#css", + "href": "pages/Bloque3/t9.html#css", + "title": "T6: Romancero Gitano I", + "section": "CSS", + "text": "CSS\nLorca utiliza las metáforas y la alegoría como elemento principal sobre el que construye sus poemas, al analizar profundamente descubrimos que siempre recurre a las mismas metáforas.\nEl color no se utiliza aquí solo como elemento decorativo, sino como un recurso semántico: cada color representa un símbolo literario presente en el poema.\nDesde el punto de vista técnico: - Los colores de fondo y de texto deben definirse en clases CSS. - JavaScript no decide colores, únicamente decide qué clase aplicar según el contenido del poema.\n\nPalabras clave y colores asociados\nSe debe detectar el texto del poema las siguientes palabras clave y aplicar el color de fondo correspondiente:\n\nguardia civil → fondo verde militar\nsangre → fondo granate oscuro\ncaballo → fondo color tierra\ncuchillo / navaja → fondo plateado\n\nEl color del texto debe elegirse siempre de forma que exista contraste suficiente con el fondo y se garantice la legibilidad.\nSi el poema contiene varias palabras clave, solo debe aplicarse un único estilo, siguiendo un orden de prioridad definido previamente.\nSi el poema no contiene ninguna de estas palabras, se aplicará un estilo por defecto con colores aleatorios." + }, + { + "objectID": "pages/Bloque3/t9.html#extra-opcional-símbolo-aurora", + "href": "pages/Bloque3/t9.html#extra-opcional-símbolo-aurora", + "title": "T6: Romancero Gitano I", + "section": "Extra opcional: símbolo aurora 🌈", + "text": "Extra opcional: símbolo aurora 🌈\nDe forma voluntaria, se puede añadir el símbolo aurora, que tendrá prioridad absoluta sobre todos los demás.\nCuando el poema contenga la palabra aurora, el fondo debe mostrar un degradado animado.\n\nCSS necesario para el extra\n.aurora {\n background: linear-gradient(120deg,\n #ff005d,\n #ff9f1c,\n #ffee32,\n #3cff00,\n #00e5ff,\n #7a00ff,\n #ff00c8\n );\n background-size: 600% 600%;\n animation: aurora 10s linear infinite;\n color: black;\n}\n\n@keyframes aurora {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n}" + }, + { + "objectID": "pages/Bloque3/t9.html#consejos", + "href": "pages/Bloque3/t9.html#consejos", + "title": "T6: Romancero Gitano I", + "section": "Consejos", + "text": "Consejos\n\nCentrado de la página (layout clásico)\nToda la página debe estar centrada horizontalmente.\nEl centrado se consigue mediante:\n\nUn contenedor con un ancho máximo definido.\nMárgenes automáticos a izquierda y derecha.\n\nDesde el punto de vista conceptual:\n\nmargin: 0 auto no centra texto, centra bloques.\nEl navegador reparte automáticamente el espacio sobrante a ambos lados del contenedor.\n\n\n\nAnimación del cambio de color\nPara evitar que los cambios de color sean bruscos, se utiliza la propiedad transition en CSS.\nEsta propiedad indica al navegador que los cambios en determinadas propiedades visuales deben hacerse de forma progresiva.\nEjemplo conceptual:\nbody {\n transition: background-color 0.6s, color 0.6s;\n}\nGracias a esta transición: - Cuando JavaScript cambia una clase o un color, - el navegador interpola automáticamente entre el color anterior y el nuevo.\nNo es necesario programar animaciones en JavaScript: CSS se encarga de todo el efecto visual.\n\n\nBúsqueda de una palabra\nPara buscar si determinada palabra determinada se debe utilizar la función includes de la clase string\n\ntexto = \"hoy nieva\";\n\ntexto.includes(\"nieva\"); //TRUE\ntexto.includes(\"llueve\"); //FALSE\n\n\nGeneración del color aleatorio\nPara la generacióndel color aleatorio de puede utilizar la siguiente función\nconst randomColor = () => '#' + Math.floor(Math.random() * 16777215).toString(16);\n\n\nConteo versos y estrofas\nEl recuento de versos y estrofas debe hacerse a partir del texto del poema, no con valores escritos a mano. A continuación se dan algunas pistas técnicas para abordar este problema.\n\nConteo de versos\nUn verso puede considerarse, a efectos prácticos en esta tarea, como una línea de texto no vacía.\nUna estrategia habitual consiste en: - Separar el texto por saltos de línea. - Eliminar las líneas vacías o formadas solo por espacios. - Contar cuántas líneas válidas quedan.\nEjemplo orientativo:\nconst versos = texto\n .split('\\n')\n .filter(linea => linea.trim() !== '')\n .length;\nEste enfoque es suficiente para la mayoría de los poemas del Romancero gitano y evita errores frecuentes.\n\n\nConteo de estrofas\nUna estrofa puede entenderse como un bloque de versos separado de otros bloques por una línea en blanco.\nUna posible estrategia es: - Separar el texto usando dos (o más) saltos de línea consecutivos. - Eliminar bloques vacíos. - Contar los bloques resultantes.\nEjemplo orientativo:\nconst estrofas = texto\n .split(/\\n\\s*\\n/)\n .filter(bloque => bloque.trim() !== '')\n .length;\nEntrega: un único archivo HTML funcional." + }, + { + "objectID": "pages/Bloque3/t9.html#recomendaciones-para-afrontar-la-tarea", + "href": "pages/Bloque3/t9.html#recomendaciones-para-afrontar-la-tarea", + "title": "T6: Romancero Gitano I", + "section": "Recomendaciones para afrontar la tarea", + "text": "Recomendaciones para afrontar la tarea\nAl enfrentarnos a un proyecto de cierta complejitud, el como afrontarlo resulta de cricial para el desarollo del mismo por ello a a continuación dejo un esquema de implementación modular. Sería mejor no utilizarlo, pero puede ser un buen punto de partida si no se sabe como empezar la app, no es el único proceso de implementación válido ni es más correcto que cualquier otro\n\nEstructura de HTML básica contadores de versos y estrofas placeholders de poema y título y botón\nFormateo CSS parte estática: centrado, tamaño (todo lo que no sea color)\nDefinir clases con colores predeterminados\nLógica interna con JS\n\n\nBuscar palabra\nContar estrofas\nConteo versos\nSelección de clase\nGenerar color aleatorio si procede\n\n\nIntegración con DOM" + }, { "objectID": "pages/Bloque3/reactI.html#sintaxis-jsx", "href": "pages/Bloque3/reactI.html#sintaxis-jsx", diff --git a/pages/Bloque3/ReactIV.qmd b/pages/Bloque3/ReactIV.qmd new file mode 100644 index 0000000..39d2979 --- /dev/null +++ b/pages/Bloque3/ReactIV.qmd @@ -0,0 +1,455 @@ +--- +title: "React IV" +subtitle: "Ecosistema npm, *React Router*, `useContext`" +author: "Javier Ribal del Río" +date: "2026-03-06" +date-modified: today +affiliation: "Hyperloop UPV" + +format: + html: default + revealjs: + history: false + chalkboard: true + output-file: presentacion-reactIV.html + parallax-background-image: ../../img/fondo.png + parallax-background-size: "cover" + pdf: default +format-links: + - pdf + - format: revealjs + text: Presentación + icon: file-slides +--- + +**Contenido** + +- Ecosistema React y paquetes npm +- Librerías externas +- React Router +- Parámetros de URL +- `useContext` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +## Ecosistema Node + +Hasta ahora hemos trabajado únicamente con **React y JavaScript**. + +Sin embargo, en el desarrollo real de aplicaciones es muy común utilizar **librerías externas**, para ello podemos recurrir `Node.JS`. + +React está diseñado para funcionar dentro de un **ecosistema de paquetes**. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + + +Ejemplos habituales: + +- React Router → navegación +- Axios → peticiones HTTP +- Chart.js → gráficas +- Zustand / Redux → gestión de estado +- Librerías de UI: Tailwind, Bootstrap, Booswatch + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +## npm + +npm (**Node Package Manager**) es el sistema que permite instalar y gestionar librerías de JavaScript. Como su nombre indica, está desarrollado por Node.JS + +Cada proyecto tiene un archivo: + +``` +package.json +``` + +En este archivo se registran las **dependencias del proyecto**. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +Ejemplo: + +```json +{ + "dependencies": { + "react": "^18.0.0", + "react-router-dom": "^6.0.0" + } +} +``` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Instalación de paquetes + +Las librerías se instalan desde la terminal. + +```bash +npm install react-router-dom +``` + +Esto hace tres cosas: + +1. Descarga el paquete +2. Lo guarda en `node_modules` (capreta donde se guardan las librerías externas) +3. Añade la dependencia en `package.json` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +## React Router + +En una aplicación web tradicional cada enlace carga **una página nueva**. + +En React normalmente trabajamos con **Single Page Applications (SPA)**. + +En una SPA: + +- el navegador no recarga la página +- React cambia los componentes que se muestran + +Para gestionar esto utilizamos **React Router**. + +*Realmente es la misma página, solo que el usuario lo percibe como distintas páginas* + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +El usuario percibirá que el sitio web está divido en diferentes subpáginas + +- `/` +- `pokemons` +- `pokemons/pikachu` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Componentes principales de React Router + +Los elementos fundamentales son: + +- `BrowserRouter` +- `Routes` +- `Route` +- `Link` + +Ejemplo básico: + +::: {.content-visible when-format="revealjs"} + +--- + +::: + + + + + + + + +```jsx {.html code-line-numbers="|5,15|7,13|9,11,|9|11"} +import { BrowserRouter, Routes, Route } from "react-router-dom"; + +function App() { + return ( + + + + + } /> + + } /> + + + + + ); +} +``` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +**Elementos del código** + +- **`BrowserRouter`** + Es el componente que activa el sistema de navegación de React Router. Utiliza la API de historial del navegador para cambiar la URL sin recargar la página. +- **`Routes`** + Es el contenedor donde se definen todas las rutas de la aplicación. React Router examina las rutas dentro de este componente para decidir qué componente mostrar. +- **`Route`** + Define una ruta concreta de la aplicación. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +- **`path`** + Indica la URL que activa la ruta. + Ejemplo: `/` corresponde a la página principal. +- **`element`** + Es el componente de React que se renderiza cuando la URL coincide con el `path`. +- **``** + Componente que se muestra cuando el usuario accede a la ruta `/`. +- **``** + Componente que se muestra cuando el usuario accede a la ruta `/pokemons`. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + + +### Navegación + +Para navegar entre páginas utilizamos el componente `Link`. + +```jsx +import { Link } from "react-router-dom"; + +Inicio + +Pokemon +``` + +A diferencia de ``: + +- **no recarga la página** +- React cambia el componente visible + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Parámetros dinámicos + +Podemos crear rutas dinámicas. + +Ejemplo: + +``` +/pokemon/25 +/pokemon/7 +``` + +Definición de la ruta: + +```jsx +} /> +``` + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +#### useParams + +Para acceder al parámetro utilizamos el hook `useParams` de *React Router*. + +```jsx +import { useParams } from "react-router-dom"; + +function PokemonDetail() { + + const { id } = useParams(); + + return

Pokemon {id}

; + +} +``` + +Este parámetro puede utilizarse para realizar peticiones a una API. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +## Context API + +En aplicaciones grandes aparece un problema frecuente. + +Muchos componentes necesitan acceder a la **misma información**. + +Por ejemplo: + +- usuario +- tema visual +- idioma +- configuración + +Si pasamos la información mediante *props*, los datos deben atravesar muchos componentes. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +Representación conceptual: + +``` +App + └ Layout + └ Page + └ Component +``` + +Si todos necesitan `user`, debemos pasar la prop continuamente. + +Este problema se conoce como **prop drilling**. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +### Context + +React proporciona una solución llamada **Context**. + +Context permite **compartir información entre múltiples componentes** sin pasar props manualmente. + +El proceso tiene tres pasos: + +1. Crear el contexto +2. Proveer el contexto +3. Consumir el contexto + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +#### Crear un contexto + +```jsx +import { createContext } from "react"; + +const UserContext = createContext(); +``` + +Esto crea un contenedor que puede almacenar información compartida. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +#### Provider + +El `Provider` permite que los componentes hijos accedan al contexto. + +```jsx + + + + + +``` + +Todos los componentes dentro del `Provider` pueden acceder al valor. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +#### Consumir el contexto + +Para acceder al contexto utilizamos el hook `useContext`. + +```jsx +import { useContext } from "react"; + +const user = useContext(UserContext); +``` + +El componente obtiene directamente el valor almacenado en el contexto. + +::: {.content-visible when-format="revealjs"} + +--- + +::: + +#### Ejemplo completo + +```jsx +import { createContext, useContext } from "react"; + +const UserContext = createContext(); + +function App() { + + const user = { name: "Javier" }; + + return ( + + + + + + + + ); +} + +function Profile() { + + const user = useContext(UserContext); + + return

{user.name}

; + +} +``` + +::: {.content-visible when-format="revealjs"} + +--- + +::: diff --git a/pages/Bloque3/t9.qmd b/pages/Bloque3/t9.qmd new file mode 100644 index 0000000..d6eed7a --- /dev/null +++ b/pages/Bloque3/t9.qmd @@ -0,0 +1,242 @@ +--- +title: "T6: Romancero Gitano I" +author: "Javier Ribal del Río" +date: "2025-12-19" +date-modified: today +affiliation: "Hyperloop UPV" +--- + +## Objetivo de la tarea + +El objetivo de esta tarea es aplicar los conceptos básicos de HTML, CSS y JavaScript (DOM) para crear una página web interactiva que muestre poemas del *Romancero gitano* de Federico García Lorca y modifique su apariencia visual en función de las diferentes metáforas. + + +[Resultado esperado](romancero_gitano_web_interactiva.html) + + + +## Estructura HTML + +El documento HTML debe: + +- Estar correctamente estructurado (``, ``, ``, ``). +- Contener un **contenedor principal** centrado horizontalmente. +- Incluir, en este orden: + 1. Un elemento para mostrar **información métrica** del poema (número de estrofas y versos). + 2. Un elemento para el **título del poema**. + 3. Un elemento para el **texto del poema**, respetando los saltos de verso utilizando la etiqueta `
`.
+  4. Un **botón** que permita cambiar de poema.
+
+No debe utilizarse ningún *framework* ni librería externa.
+
+
+## JavaScript
+
+### Datos
+
+En JavaScript se debe definir un **array de objetos**, donde cada objeto represente un poema y tenga al menos:
+
+- Un título.
+- El texto del poema como una cadena de texto, usando saltos de línea para los versos.
+
+El cambio de poema debe hacerse recorriendo este array de forma cíclica (cola circular) mediante el botón.
+
+[Descargar poemas](poemas.js) (click derecho guardar enlace como)
+
+
+###  Manipulación del DOM
+
+El comportamiento de la página debe implementarse **exclusivamente con DOM nativo**, cumpliendo lo siguiente:
+
+- Todas las funciones deben declararse como **arrow functions**.
+- Al pulsar el botón:
+  - Se actualiza el título.
+  - Se actualiza el texto del poema.
+  - Se modifica el formato del fondo.
+  - Se recalculan y muestran:
+    - Número de versos.
+    - Número de estrofas (bloques separados por líneas en blanco).
+
+El cálculo debe realizarse a partir del texto del poema, no con valores predefinidos.
+
+
+## CSS
+
+Lorca utiliza las metáforas y la alegoría como elemento principal sobre el que construye sus poemas, al analizar profundamente descubrimos que siempre recurre a las mismas metáforas.
+
+El color no se utiliza aquí solo como elemento decorativo, sino como un recurso semántico: cada color representa un símbolo literario presente en el poema.
+
+Desde el punto de vista técnico:
+- Los **colores de fondo y de texto** deben definirse en **clases CSS**.
+- JavaScript no decide colores, únicamente decide qué clase aplicar según el contenido del poema.
+
+
+### Palabras clave y colores asociados
+
+Se debe detectar el texto del poema las siguientes **palabras clave** y aplicar el **color de fondo correspondiente**:
+
+- **guardia civil** → fondo **verde militar**
+- **sangre** → fondo **granate oscuro**
+- **caballo** → fondo **color tierra**
+- **cuchillo / navaja** → fondo **plateado**
+
+El color del texto debe elegirse siempre de forma que exista **contraste suficiente** con el fondo y se garantice la legibilidad.
+
+Si el poema contiene varias palabras clave, solo debe aplicarse **un único estilo**, siguiendo un orden de prioridad definido previamente.
+
+Si el poema no contiene ninguna de estas palabras, se aplicará un **estilo por defecto** con colores aleatorios.
+
+
+
+## Extra opcional: símbolo *aurora* 🌈
+
+De forma **voluntaria**, se puede añadir el símbolo **`aurora`**, que tendrá **prioridad absoluta sobre todos los demás**.
+
+Cuando el poema contenga la palabra `aurora`, el fondo debe mostrar un **degradado animado**.
+
+### CSS necesario para el extra
+
+```css
+.aurora {
+  background: linear-gradient(120deg,
+    #ff005d,
+    #ff9f1c,
+    #ffee32,
+    #3cff00,
+    #00e5ff,
+    #7a00ff,
+    #ff00c8
+  );
+  background-size: 600% 600%;
+  animation: aurora 10s linear infinite;
+  color: black;
+}
+
+@keyframes aurora {
+  0%   { background-position: 0% 50%; }
+  50%  { background-position: 100% 50%; }
+  100% { background-position: 0% 50%; }
+}
+```
+
+---
+
+## Consejos
+
+### Centrado de la página (layout clásico)
+
+Toda la página debe estar centrada **horizontalmente**.
+
+El centrado se consigue mediante:
+
+- Un contenedor con un ancho máximo definido.
+- Márgenes automáticos a izquierda y derecha.
+
+Desde el punto de vista conceptual:
+
+- `margin: 0 auto` **no centra texto**, centra **bloques**.
+- El navegador reparte automáticamente el espacio sobrante a ambos lados del contenedor.
+
+
+### Animación del cambio de color
+
+Para evitar que los cambios de color sean bruscos, se utiliza la propiedad **`transition`** en CSS.
+
+Esta propiedad indica al navegador que los cambios en determinadas propiedades visuales deben hacerse de forma progresiva.
+
+Ejemplo conceptual:
+
+```css
+body {
+  transition: background-color 0.6s, color 0.6s;
+}
+```
+
+Gracias a esta transición:
+- Cuando JavaScript cambia una clase o un color,
+- el navegador interpola automáticamente entre el color anterior y el nuevo.
+
+No es necesario programar animaciones en JavaScript: **CSS se encarga de todo el efecto visual**.
+
+
+### Búsqueda de una palabra
+
+Para buscar si determinada palabra determinada se debe utilizar la función `includes` de la clase string
+
+```js
+
+texto = "hoy nieva";
+
+texto.includes("nieva");    //TRUE
+texto.includes("llueve");   //FALSE
+```
+
+
+### Generación del color aleatorio
+
+Para la generacióndel color aleatorio de puede utilizar la siguiente función 
+
+```js
+const randomColor = () => '#' + Math.floor(Math.random() * 16777215).toString(16);
+```
+
+### Conteo versos y estrofas
+
+El recuento de versos y estrofas debe hacerse **a partir del texto del poema**, no con valores escritos a mano. A continuación se dan algunas **pistas técnicas** para abordar este problema.
+
+#### Conteo de versos
+
+Un verso puede considerarse, a efectos prácticos en esta tarea, como **una línea de texto no vacía**.
+
+Una estrategia habitual consiste en:
+- Separar el texto por saltos de línea.
+- Eliminar las líneas vacías o formadas solo por espacios.
+- Contar cuántas líneas válidas quedan.
+
+Ejemplo orientativo:
+
+```js
+const versos = texto
+  .split('\n')
+  .filter(linea => linea.trim() !== '')
+  .length;
+```
+
+Este enfoque es suficiente para la mayoría de los poemas del *Romancero gitano* y evita errores frecuentes.
+
+#### Conteo de estrofas
+
+Una estrofa puede entenderse como un **bloque de versos separado de otros bloques por una línea en blanco**.
+
+Una posible estrategia es:
+- Separar el texto usando dos (o más) saltos de línea consecutivos.
+- Eliminar bloques vacíos.
+- Contar los bloques resultantes.
+
+Ejemplo orientativo:
+
+```js
+const estrofas = texto
+  .split(/\n\s*\n/)
+  .filter(bloque => bloque.trim() !== '')
+  .length;
+```
+
+
+
+**Entrega:** un único archivo HTML funcional.
+
+## Recomendaciones para afrontar la tarea
+
+Al enfrentarnos a un proyecto de cierta complejitud, el como afrontarlo resulta de cricial para el desarollo del mismo por ello a a continuación dejo un esquema de implementación modular.  Sería mejor no utilizarlo, pero puede ser un buen punto de partida si no se sabe como empezar la app, no es el único proceso de implementación válido ni es más correcto que cualquier otro
+
+1. Estructura de HTML básica contadores de versos y estrofas *placeholders* de poema y título y botón
+2. Formateo CSS parte estática: centrado, tamaño (todo lo que no sea color)
+3. Definir clases con colores predeterminados
+4. Lógica interna con JS
+  - Buscar palabra
+  - Contar estrofas
+  - Conteo versos
+  - Selección de clase 
+  - Generar color aleatorio si procede
+5. Integración con DOM
\ No newline at end of file