A JavaScript library for building user interfaces.
– Reactjs.org
A JavaScript library for building user interfaces.
– Reactjs.org
Det minste React-eksempelet
import React from "react";
import ReactDOM from "react-dom";
ReactDOM.render(
<h1>Hei verden!</h1>,
document.getElementById("root"),
);
Det minste React-eksempelet
En syntaksutvidelse for JavaScript (JavaScript + XML)
Kompilerer JSX ned til noe som nettleseren forstår
JavaScript-funksjoner
Komp A
Komp B
❌
En ganske ny React-feature (introdusert i versjon 16.8)
Lar oss bruke tilstand og sideeffekter i funksjons-komponenter
Kjennetegnes ved at funksjonene har "use" som prefix
En ganske ny React-feature
Kjennetegnes ved at funksjonene har "use" som prefix
De mest vanlige hookene er:
useState
useEffect
Custom Hooks
Gjør det enklere å gjenbruke tilstandslogikk på tvers av komponenter
Ingen kompliserte livssyklusmetoder (som componentDidUpdate)
Ingen binding av "this"
Ingen breaking changes (kan trygt brukes parallelt med eksisterende kode)
Slipper konvertering av funksjonskomponenter til klassekomponenter
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
this.onButtonClick = this.onButtonClick.bind(this);
}
componentDidMount() {
document.title = `You clicked ${this.state.count} times`;
}
componentDidUpdate() {
document.title = `You clicked ${this.state.count} times`;
}
onButtonClick() {
this.setState({ count: this.state.count + 1 });
}
render() {
return (
<div>
<p>You clicked {this.state.count} times</p>
<button onClick={this.onButtonClick}>Click me</button>
</div>
);
}
}
const App = () => {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]);
function onButtonClick() {
setCount(prevState => prevState + 1);
}
return (
<div>
<p>You clicked {count} times</p>
<button onClick={onButtonClick}>Click me</button>
</div>
);
};
useState ✅
useEffect ✅
useContext ✅
useReducer
useRef
useCallback
useMemo
useImperativeHandle
useLayoutEffect
useDebugValue
Du kan også lage egne Hooks (såkalte Custom Hooks
som samler flere Hooks).
useReducer ✅
useRef ✅
useCallback ⛔️
useMemo ⛔️
useImperativeHandle ⛔️
useLayoutEffect ⛔️
useDebugValue ⛔️
Du kan også lage egne Hooks (såkalte Custom Hooks ✅ som samler flere Hooks).
ℹ️
Bruk ESLint og installer eslint-plugin-react-hooks (denne utvidelsen sørger for at du ikke bryter disse to reglene).
Brukes til tilstandslogikk
Brukes til tilstandslogikk
Erstatter livssyklusmetodene componentDidMount, componentDidUpdate og componentWillUnmount
useEffect(() => {
document.title = `You clicked ${count} times`;
});
componentDidMount() {
document.title = `You clicked ${this.state.count} times`;
}
componentDidUpdate() {
document.title = `You clicked ${this.state.count} times`;
}
useEffect(() => {
document.title = `You clicked ${count} times`;
}, []);
Trigging av effekter kan utelates
ℹ️
Denne effekten trigges ved mount og unmount.
Trigging av effekter kan utelates
ℹ️
Denne effekten trigges ved mount og unmount.
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]);
ℹ️
Denne effekten trigges kun når count endrer seg.
useEffect(() => {
document.title = `You clicked ${count} times`;
}, []);
import React, { createContext } from "react";
const texts = {
nb: { hello: 'Hei' },
en: { hello: 'Hello' },
};
export const LanguageContext = createContext(texts.nb);
import React, { useContext } from "react";
import LanguageContext from "./LanguageContext";
export const LocalizedHello = ({ name }) => {
const { hello } = useContext(LanguageContext);
return <h1>{hello} {name}!</h1>
};
export const App = props => (
<LanguageContext.Provider value={texts.en}>
<LocalizedHello name="Ola Nordmann" />
</LanguageContext.Provider>
);
import React, { useReducer } from "react";
const initialState = { count: 0 };
function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
throw new Error();
}
}
function Counter({initialState}) {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.count}
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
<button onClick={() => dispatch({ type: 'decrement' })}>-</button>
</>
);
}