

Conf 2018

Conf 2018

Conf 2018

Conf 2018

Conf 2018

Conf 2018


Cuando pulso en botón A
Vete al componente con id="texto"
Accede a su campo HTML
Añade un <div>
Y le pones el texto "HOLA"
Cuando pulso el botón A
El texto = "Hola"

<html>
<head>
<meta/>
<title>Página sencilla</title>
</head>
<body>
<p>Esta página es <strong>muy sencilla</strong></p>
</body>
</html>




const tarta = document.getElementById('tarta');
const vela = tarta.getChildren()[0];
const fuego = vela.getChildren()[0];
fuego.parentNode.removeChild();
tarta.apagarVela();






function addRow(tableID) {
const table = document.getElementById(tableID);
const rowCount = table.rows.length;
const row = table.insertRow(rowCount);
const cell = row.insertCell(0);
cell.innerHTML += " <input type=\"text\" size=\"20\" name=\"values[]\"/>" +
"<INPUT type=\"button\" class=\"btn_medium\" value=\"Remove\" " +
"onclick=\"this.parentNode.removeChild(this.parentNode);\" />" +
"<br>" +
"<small><font color=\"gray\">Enter Title</font></small>";
}
const render = () => {
<input type="text" size="20" name="values[]"/>
<input type="button" className="btn_medium" value="Remove" onclick={removeMe()}/>
<br>
<small><font color="gray">Enter Title</font></small>
};
const HelloWorld = () =>
React.createElement('div', {className: 'hello'}, 'Hello World!');
const HelloWorld = () =>
<div className="hello">Hello World!</div>;
const HelloWorld = () =>
React.createElement('div', {className: 'hello'}, 'Hello World!');
const HelloWorld = () =>
<div className="hello">Hello World!</div>;
<CounterButton text="Clicks: "/>




export class Hello extends React.Component {
render() {
return <h1>Hello {this.props.name}</h1>
}
}
export function Hello(props) {
return <h1>Hello {props.name}</h1>
}
export const Hello = ({name}) =>
<h1>Hello {name}</h1>;
export class Hello extends React.Component {
render() {
return <h1>Hello {this.props.name}</h1>
}
}
export const Hello = ({name}) =>
<h1>Hello {name}</h1>;



export class Hello extends React.Component {
render() {
return <button onClick={this.increment}>${this.state.count}</button>
}
}
import {useState} from 'react';
export const Hello = () => {
const [count, setCount] = useState(0);
const increment = () => setCount(count + 1);
return <button onClick={increment}>${count}</button>
}
export const Hello = () => {
const [count, setCount] = useState(0);
const increment = () => setCount(count + 1);
return <button onClick={increment}>{count}</button>
}
export const Hello = () => {
const [width, setWidth] = useState(window.innerWidth);
const onResize = () => setWidth(window.innerWidth);
useEffect(() => {
window.addEventListener('resize', onResize);
return () => {
window.removeEventListener('resize', onResize);
}
}, []);
return <h1>Width: {width}</h1>
}
useEffect(() => {
}, []);
useEffect(() => {
});
useEffect(() => {
}, [name, age]);




















export const NumberPicker: FC = () => {
const [count, setCount] = useState<number>(0);
const increase = () => setCount(count => count + 1);
const decrease = () => setCount(count => count - 1);
return <div className="number-picker">
<button class="number-picker-buttons" onClick={decrease}>-</button>
<p className="number-picker-label">{count}</p>
<button class="number-picker-buttons" onClick={increase}>+</button>
</div>
}
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css'; // 👈👈
import App from './App';
import reportWebVitals from './reportWebVitals';
.number-picker {
display: flex;
align-content: center;
align-items: center;
gap: 20px;
margin: 20px;
}
.number-picker-label {
}
.number-picker-buttons {
}
const numberPickerStyle: CSSProperties = {
display: 'flex',
alignContent: 'center',
alignItems: 'center',
gap: '20px',
margin: '20px'
};
export const NumberPicker: FC = () => {
return <div style={numberPickerStyle}>
<button style={numberPickerButtonStyle} onClick={decrease}>-</button>
<p style={numberPickerLabelStyle}>{count}</p>
<button style={numberPickerButtons} onClick={increase}>+</button>
</div>
}
index.css ?? 🤔
.number-picker {
display: flex;
align-content: center;
align-items: center;
gap: 20px;
margin: 20px;
}
.number-picker-label {
}
.number-picker-buttons {
}
import styles from './NumberPicker.modules.css';
export const NumberPicker: FC = () => {
return <div className={styles.container}>
<button style={styles.buttons} onClick={decrease}>-</button>
<p style={styles.label}>{count}</p>
<button style={styles.buttons} onClick={increase}>+</button>
</div>
}
ClassName 
style 
CSS Modules 

<input> <textarea> <select> en el DOM tienen su propio estadoconst LoginForm = () => {
const [email, setEmail] = useState<string>('');
const doLogin = () => console.log('Email', email);
const onChangeEmail = (event) => setEmail(event.target.value);
return <form onSubmit={doLogin}>
<input type="email" value={email} onChange={onChangeEmail}/>
</form>
}
const LoginForm = () => {
const doLogin = (event: FormEvent<HTMLFormElement>) => {
const formJSON = formToJSON(event.currentTarget);
console.log(formJSON);
}
return <form onSubmit={doLogin}>
<input type="email"/>
</form>
}
import {FormEvent, useRef} from "react";
const LoginForm = () => {
const emailRef = useRef<HTMLInputElement>(null);
const doLogin = (event: FormEvent<HTMLFormElement>) => {
event.preventDefault();
console.log(emailRef.current?.value);
}
return <form onSubmit={doLogin}>
<input ref={emailRef} type="email"/>
</form>
}


npm i react-router-dom
return App = () => <div>
<Header/>
<Routes>
<Route path="/" element={<Home/>}/>
<Route path="about" element={<About/>}/>
<Route path="*" element={<Page404/>}/>
</Routes>
<Footer/>
</div>;

Tom Occhino

Jing Chen

Pete Hunt


Andrew Clark
@acdlite

Dan Abramov
@dan_abramov


const MoviesPage = () => {
const {movies, isLoading, error} = useGetMovies();
if (isLoading) {
return <div>Loading movies...</div>;
}
if (error) {
return <div>Ups!</div>;
}
if (!movies) {
return <div>Ups! no movies</div>;
}
return <ul>
{movies.map(movie => <Movie key={movie.id} movie={movie}/>)}
</ul>;
}
export const Movie: FC<any> = ({movie}) => {
return <li>{movie.name}</li>
};
export const useGetMovies = () => {
const [movies, setMovies] = useState<any[]>();
const [isLoading, setIsLoading] = useState<boolean>(true);
const [error, setError] = useState<any>();
useEffect(() => {
loadMovies()
.then(movies => setMovies(movies))
.catch(err => setError(err))
.finally(() => setIsLoading(false))
}, []);
return {
movies,
isLoading,
error
}
};
const loadMovies = (): Promise<any[]> => {
return new Promise((resolve, reject) => {
fetch('http://127.0.0.1:3000/movies')
.then(response => response.json())
.then(movies => resolve(movies))
.catch(err => reject(err));
});
}



