|
|
| 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
|
|
|
|
|
|



