|
|
Códigos disponibles en git |
¿Por qué?
Desarrollo web de front-end | |
---|---|
|
|
¿Qué?
Bibliotecas en JavaScript, sobre las API de los navegadores, encargada de crear interfaces de usuario basadas en: | |
---|---|
DOM virtual, para mejorar la eficiencia |
Componentes, para desarraollo declarativo |
|
|
|
|
Proyecto OpenSource desarrollado por Jordan Walkey de Facebook en mayo de 2013 para productos como Whatsapp, Instagram, Facebook, … |
¿Para qué?
|
|
|
|
|
¿Cómo?
Instalación
nmp | vite |
---|---|
|
|
|
Instalación de bibliotecas | ||
---|---|---|
npm i --save prop-types |
npm i --save sass |
npm i --save styled-components |
JavaScript XML (JSX)
Sin JSX
|
'use strict'; import React from 'react'; import ReactDOM from 'react-dom/client'; ReactDOM .createRoot( document.getElementById('root')) .render( React.createElement("table", null, React.createElement("thead", null, React.createElement("tr", null, React.createElement("th", null, "Título columna"), React.createElement("th", null, "Título columna") ) ), React.createElement("tbody", null, React.createElement("tr", null, React.createElement("td", null, "Valor de Celda"), React.createElement("td", null, "Valor de Celda") ), React.createElement("tr", null, React.createElement("td", null, "Valor de Celda"), React.createElement("td", null, "Valor de Celda") ) ) ) ); |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" type="image/svg+xml" href="/src/favicon.svg" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Aplicación React</title> </head> <body> <div id="root"></div> <script type="module" src="/src/main.jsx"></script> </body> </html> |
Con JSX
|
'use strict'; import React from 'react'; import ReactDOM from 'react-dom/client'; ReactDOM .createRoot( document.getElementById('root')) .render( <table> <thead> <tr> <th>Título columna</th> <th>Título columna</th> </tr> </thead> <tbody> <tr> <td>Valor de Celda</td> <td>Valor de Celda</td> </tr> <tr> <td>Valor de Celda</td> <td>Valor de Celda</td> </tr> </tbody> </table> ); |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" type="image/svg+xml" href="/src/favicon.svg" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Aplicación React</title> </head> <body> <div id="root"></div> <script type="module" src="/src/main.jsx"></script> </body> </html> |
Incorrecto | Sobre-estructura |
---|---|
|
|
'use strict'; import React from 'react'; import ReactDOM from 'react-dom/client'; ReactDOM .createRoot( document.getElementById('root')) .render( <h1>TITULO</h1> <table> <thead> <tr> <th>Título columna</th> <th>Título columna</th> </tr> </thead> <tbody> <tr> <td>Valor de Celda</td> <td>Valor de Celda</td> </tr> <tr> <td>Valor de Celda</td> <td>Valor de Celda</td> </tr> </tbody> </table> ); |
'use strict'; import React from 'react'; import ReactDOM from 'react-dom/client'; ReactDOM .createRoot( document.getElementById('root')) .render( <div> <h1>TITULO</h1> <table> <thead> <tr> <th>Título columna</th> <th>Título columna</th> </tr> </thead> <tbody> <tr> <td>Valor de Celda</td> <td>Valor de Celda</td> </tr> <tr> <td>Valor de Celda</td> <td>Valor de Celda</td> </tr> </tbody> </table> </div> ); |
Componentes
|
const Table = () => <table> <thead> <tr> <th>Título columna</th> <th>Título columna</th> </tr> </thead> <tbody> <tr> <td>Valor de Celda</td> <td>Valor de Celda</td> </tr> <tr> <td>Valor de Celda</td> <td>Valor de Celda</td> </tr> </tbody> </table>; export default Table;
|
import ReactDOM from 'react-dom/client'; import Table from './components/Table/Table'; ReactDOM .createRoot( document.getElementById('root')) .render( <Table /> ); |
|
import ReactDOM from 'react-dom/client'; import Table from './components/Table'; ReactDOM.createRoot( document.getElementById('root')) .render( <Table /> ); |
Composición
|
import ReactDOM from 'react-dom/client'; import Table from './components/Table'; ReactDOM.createRoot( document.getElementById('root')) .render( <Table /> ); |
import TableBody from "./TableBody"; import TableHead from "./TableHead"; const Table = () => <table> <TableHead /> <TableBody /> </table>; export default Table; |
import TableColumns from "./TableColumns"; const TableHead = () => <thead> <TableColumns /> </thead>; export default TableHead; |
const TableColumns = () => <tr> <th>Título columna</th> <th>Título columna</th> </tr>; export default TableColumns; |
import TableRow from "./TableRow"; const TableBody = () => <tbody> <TableRow /> <TableRow /> <TableRow /> <TableRow /> </tbody>; export default TableBody; |
const TableRow = () => <tr> <td>Valor de Celda</td> <td>Valor de Celda</td> </tr>; export default TableRow; |
Fragmentos
|
|
import { Fragment } from "react"; import TableBody from "./TableBody"; import TableHead from "./TableHead"; const Table = () => <Fragment> <h1>React Course</h1> <table> <TableHead /> <TableBody /> </table> </Fragment>; export default Table; |
import TableBody from "./TableBody"; import TableHead from "./TableHead"; const Table = () => <> <h1>React Course</h1> <table> <TableHead /> <TableBody /> </table> </>; export default Table; |
Modo Estricto
|
'use strict'; import { StrictMode } from 'react'; import ReactDOM from 'react-dom/client'; import Table from './components/Table'; ReactDOM.createRoot( document.getElementById('root')) .render( <StrictMode> <Table /> </StrictMode> ); |
Propiedades
|
|
'use strict'; import { StrictMode } from 'react'; import ReactDOM from 'react-dom/client'; import Table from './components/Table'; ReactDOM.createRoot( document.getElementById('root')) .render( <StrictMode> <Table title="React Course" /> </StrictMode> ); |
import TableBody from "./TableBody"; import TableHead from "./TableHead"; const Table = (props) => <> <h1>{ props.title }</h1> <table> <TableHead /> <TableBody /> </table> </>; export default Table; |
Propiedades no-HTML
|
|
<div class="mi-clase"> <label for="id"> |
<div className="mi-clase"> <label htmlFor="id"> |
Propiedad innerHTML
|
|
Propiedades por defecto
|
|
'use strict'; import { StrictMode } from 'react'; import ReactDOM from 'react-dom/client'; import Table from './components/Table'; ReactDOM.createRoot( document.getElementById('root')) .render( <StrictMode> <Table /> </StrictMode> ); |
import TableBody from "./TableBody"; import TableHead from "./TableHead"; const Table = ({ title }) => <> <h1>{ title }</h1> <table> <TableHead /> <TableBody /> </table> </>; Table.defaultProps = { title: 'Default Title' } export default Table; |
Precondiciones
'use strict'; import { StrictMode } from 'react'; import ReactDOM from 'react-dom/client'; import Table from './components/Table'; ReactDOM.createRoot( document.getElementById('root')) .render( <StrictMode> <Table /> </StrictMode> );
|
import PropTypes from 'prop-types'; import TableBody from "./TableBody"; import TableHead from "./TableHead"; const Table = ({ title }) => <> <h1>{ title }</h1> <table> <TableHead /> <TableBody /> </table> </>; Table.propTypes = { title: PropTypes.string.isRequired } export default Table;
import PropTypes from 'prop-types'; import TableBody from "./TableBody"; import TableHead from "./TableHead"; const Table = ({ title }) => <> <h1>{ title }</h1> <table> <TableHead /> <TableBody /> </table> </>; Table.defaultProps = { title: 'Default Title' } Table.propTypes = { title: PropTypes.string.isRequired } export default Table; |
Perforación
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Condicionales
|
|
Sentencia If
|
|
Operador Ternario
|
|
Operador Y-lógico
|
|
Valor null
|
|
Listados
|
|
|
|
Componentes de Orden Superior
|
|
CSS
Con biblioteca sass!!! | ||||
---|---|---|---|---|
CSS Global |
CSS en Línea |
Módulos CSS |
CSS en Javascript |
CSS Global
const Table = ({ children }) => <table className="my-table"> { children } </table>; export default Table;
.my-table { background-color: #b8b8b8; } |
import Table from './Table/Table'; import TableBody from './Table/TableBody'; import TableColumns from './Table/TableColumns'; import TableHead from './Table/TableHead'; import countries from '../countries.json'; import '../styles.scss'; const App = () => { const columns = [ 'Id', 'Nombre' ]; const rows = () => countries.reduce((acc, country) => { if(country.population >= 100000) { acc.push({ "id": country.cca2, "name": country.name.common }); } return acc; }, []); return <> <h1>React Course</h1> <Table> <TableHead> <TableColumns columns={ columns } /> </TableHead> <TableBody rows={ rows() } /> </Table> </>; } export default App; |
CSS en Línea
|
const Table = ({ children }) => <table style={ { backgroundColor: '#b8b8b8' } }> { children } </table>; export default Table; |
Módulos CSS
|
import styles from "./Table.module.scss" const Table = ({ children }) => <table className={ styles.myTable }> { children } </table>; export default Table;
.myTable { background-color: #b8b8b8; } |
CSS en Javascript
Con biblioteca styled-components!!! |
|
|
import styled from 'styled-components'; const MyStyledTable = styled.table` background-color: #b8b8b8; `; const Table = ({ children }) => <MyStyledTable> { children } </MyStyledTable>; export default Table; |
Beneficios: | |
---|---|
|
|
|
import styled from 'styled-components'; const Table = ({ className, children }) => <table className={ className }> { children } </table>; const MyStyledTable = styled(Table)` background-color: #b8b8b8; `; export default MyStyledTable; |
Renderizado
-
desacoplar del componente
-
useContext
-
useReducer
-
-
Ciclo de Vida
-
useState
-
useEffecct
-
customHook
-
otros tipos hook: pendiente!!!
-
-
Estado Global
-
userRef
-
acceder a Real DOM
-
gestion de claves para renderizar optimizado
-
useMemo recordar valores y no renderizar
-
useCallback recordar función
-
Portales
|
|
Límites de Errores
-
Los límites de errores son componentes de React que capturan errores de JavaScript en cualquier parte de su árbol de componentes hijo, registran esos errores, y muestran una interfaz de repuesto en lugar del árbol de componentes que ha fallado. Los límites de errores capturan errores durante el renderizado, en métodos del ciclo de vida, y en constructores de todo el árbol bajo ellos.
Librerías
Pruebas
Bibliografía
Obra, Autor y Edición | Portada | Obra, Autor y Edición | Portada |
---|---|---|---|
Ponente
|
|
|
|
|
|