React: zdarzenia - podstawy
Opublikowano ptk 07 sierpnia 2020 w reactjs • 2 min read
Zdarzenia w React obsługiwane są w podobny sposób jak w HTML -> oznacza to, że inlinowo wpisywane są "nasłuchiwacze" (używając camelCase) do którego przekazywany jest atrybut w nawiasach klamrowych -> przekazywanie funkcji jako props
<button onClick={buttonClick}>Button</button>
Metoda, do której się odwołujemy poprzez atrybut może znaleźć swoje miejsca w ramach stworzonego komponentu lub jego rodzica (istotnej jest aby była osiągalna/możliwa do wywołania).
Pozytywnie na wydajność wpływa umieszczanie funkcji po za komponentem - gdy renderowany jest komponent wielokrotnie to funkcja nie musi być tworzona na nowo.
Zdarzenia w komponentach klasowych
W przypadku komponentów klasowych istotne jest pamiętanie o odwołaniu się do słowa kluczowego this
class Droid extends Component {
helloDroid() {
console.log("Hi R2D2!");
}
render(){
return (
<>
<h2>Greet Droid by clicking below!</h2>
<button onClick={this.handleClick}>
Start!
</button>
);
}
}
Słowo kluczowe this jest zależne od kontekstu, w przypadku gdy dany element powinien mieć dostęp do całości komponentu (np w celu skorzystania z props) można zastosować funkcję strzałkową [jej zastosowania wymaga użycia dodatkowej wtyczki @babel/plugin-proposal-class-properties (w klasie ES6 nie ma możliwości zastosowania funkcji strzałkowej)].
W przeciwnym razie należy korzystać z wywołania bind
- w tym przypadku funkcja odpowiadająca za dane zdarzenie będzie musiała zostać przypisana do stanu
class Droid extends React.Component {
constructor(props) {
super(props);
this.state = [];
// Poniższe wiązanie jest niezbędne do prawidłowego przekazania `this` przy wywołaniu funkcji
this.handleClick = this.handleClick.bind(this);
}
[...]
Konfiguracja wtyczki Babel: plugin-proposal-class-properties
Konfiguracja @babel/plugin-proposal-class-properties w .babelrc
{
"presets": ["@babel/preset-env", "@babel/preset-react"],
"plugins": [
["@babel/plugin-proposal-class-properties", { "loose": true }]
]
}
!! W funkcji strzałkowej this nie ulega zmianie i odwołuje się do elementu najwyższego rzędu
Porównanie zachowania się this - greetDroid
(funkcja strzałkowa) zadziała podczas gdy helloDroid
nie będzie w stanie odwołać się do props
import React, {Component} from "react";
import ReactDOM from "react-dom";
class Droid extends Component {
helloDroid() {
console.log(`Hi ${this.props.droidName}`);
}
greetDroid= () => {
console.log(`Hi ${this.props.droidName}`);
}
render(){
return (
<>
<h2>Greet Droid by clicking below!</h2>
<button onClick={this.helloDroid}>
Funkcja
</button>
<button onClick={this.greetDroid}>
Funkcja strzałkowa
</button>
);
}
}
ReactDOM.render(
<Droid droidName='C3PO'/>,
document.getElementById("app")
);
Zdarzenia w komponentach funkcyjnych
Zdarzenia w komponentach funkcyjnych wyglądają podobnie do tych stosowanych w komponentach klasowych
import React from "react";
import ReactDOM from "react-dom";
const Droid = ({droidName}) => {
const greetDroid = () => {
console.log(`Hi ${droidName}`);
}
return (
<>
<h2>Greet Droid by clicking below!</h2>
<button onClick={greetDroid}>
Start!
</button>
);
}
ReactDOM.render(
<Droid droidName='C3PO'/>,
document.getElementById("app")
);
Inlinowe wywołanie funkcji z argumentami
funkcje powiązane z konkretnymi zdarzeniami mogą być również wywoływane inlinowo oraz poprzez przekazanie odpowiednich argumentów
import React from "react";
import ReactDOM from "react-dom";
const App = () => {
const greetDroid = (droidName) => {
alert(`Hi ${droidName}`);
}
return (
<>
<h2>Greet Droid by clicking below!</h2>
<button onClick={()=>greetDroid('C3PO')}>
C3PO
</button>
<button onClick={()=>greetDroid('R2D2')}>
R2D2
</button>
);
}
ReactDOM.render(
<App/>,
document.getElementById("app")
);
Nazwy najczęściej stosowanych wydarzeń
Nazwa zdarzenia | Opis |
---|---|
onClick | kliknięcie |
onDoubleClick | podwójne kliknięcie |
onMouseEnter | najazd myszką |
onMouseLeave | opuszczenie myszki |
onKeyDown | wciśnięcie klawisza (strzałka w dół) |
onKeyPress | wciśnięcie klawisza (dowolnego) |
onKeyUp | wciśnięcie klawisza (strzałka w górę) |
onSubmit | po wysłaniu formularza |
onChange | detekcja zmiany |
onFocus | skupienie |
onBlur | zmiana skupienia |
onLoad | gdy się załaduje |
Zatrzymanie domyślnej akcji
Zatrzymanie domyślnej akcji stosuje się poprzez odwołanie się do eventu, który musi zostać przekazany do funkcji jako argument
const Link = (e) => {
function clickLink(e){
e.preventDefault();
}
return (
<>
<a href="#" onClick={clickLink}>Link</a>
);
}
Źródła: