React-Refs
React unterstützt eine ganz besondere EigenschaftRef, mit der Sie an jede von render() ausgegebene Komponente binden können.
Diese besondere Eigenschaft ermöglicht es Ihnen, auf die entsprechende zugrunde liegende Instanz zu verweisen, die von render() zurückgegeben wird, sodass Sie jederzeit die richtige Instanz erhalten.
In React bieten Refs eine Möglichkeit, auf DOM-Elemente oder Komponenteninstanzen zuzugreifen. Mithilfe von Refs können Sie DOM-Elemente direkt manipulieren oder Instanzen von Kindkomponenten abrufen; geeignet für Szenarien wie Fokussteuerung, Textauswahl, Medienwiedergabe, Auslösen erzwungener Animationen oder Integration von DOM-Bibliotheken von Drittanbietern.
Nutzung
Verwenden Sie React.createRef oder useRef, um Refs zu erstellen und darauf zuzugreifen.
React.createRef wird typischerweise in Klassenkomponenten verwendet, während useRef ein Hook ist, der typischerweise in Funktionskomponenten verwendet wird.
Darüber hinaus kann das Binden von this in Event-Handler-Funktionen mithilfe der Klassen-Eigenschaftssyntax erfolgen, um zu vermeiden, dass bei jedem Rendern eine neue Funktion erstellt wird.
- Erstellen einer Ref: Verwenden Sie sie im Konstruktor einer Klassenkomponente
React.createRefErstellen Sie ein Ref-Objekt und weisen Sie es einer Eigenschaft der Komponenteninstanz zu. - Binden der Ref: In der
renderMethode, binden Sie das Ref-Objekt an das DOM-Element, auf das verwiesen werden soll. - Zugriff auf die Ref: In anderen Methoden der Komponente, über
this.myInputRef.currentauf das gebundene DOM-Element zugreifen und dessen Eigenschaften und Methoden manipulieren.
Vollständiges Beispiel
Sie können dies verwenden, um die aktuelle React-Komponente zu erhalten, oder ref verwenden, um eine Referenz auf die Komponente zu erhalten, wie im folgenden Beispiel gezeigt:
React-Beispiel
Selbst ausprobieren »
Im Beispiel haben wir eine Referenz auf die zugrunde liegende Instanz des Eingabefelds erhalten, und nach dem Klicken auf die Schaltfläche erhält das Eingabefeld den Fokus.
Wir können auch die Methode getDOMNode() verwenden, um das DOM-Element zu erhalten.
Refs erstellen
React stellt die Methode React.createRef zum Erstellen von Refs bereit.
Beispiel
import ReactDOM from 'react-dom';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
componentDidMount() {
this.myRef.current.focus();
}
render() {
return <input type="text" ref={this.myRef} />;
}
}
const root = ReactDOM.createRoot(document.getElementById("root"));
// Rendere die MyComponent-Komponente
root.render(<MyComponent />);
Callback-Refs
Eine andere Möglichkeit, Refs zu erstellen, ist die Verwendung einer Callback-Funktion. Dieser Ansatz war vor React 16.3 üblich; jetzt wird React.createRef stärker empfohlen.
Beispiel
constructor(props) {
super(props);
this.setMyRef = element => {
this.myRef = element;
};
}
componentDidMount() {
if (this.myRef) {
this.myRef.focus();
}
}
render() {
return <input type="text" ref={this.setMyRef} />;
}
}
const root = ReactDOM.createRoot(document.getElementById("root"));
// Rendere die MyComponent-Komponente
root.render(<MyComponent />);
Zugriff auf DOM-Elemente mit Refs
Mithilfe von Refs können Sie direkt auf DOM-Elemente zugreifen und sie manipulieren.
Beispiel
constructor(props) {
super(props);
this.myRef = React.createRef();
}
handleClick = () => {
this.myRef.current.style.backgroundColor = 'yellow';
};
render() {
return (
<div>
<input type="text" ref={this.myRef} />
<button onClick={this.handleClick}>Hintergrund ändern</button>
</div>
);
}
}
const root = ReactDOM.createRoot(document.getElementById("root"));
// Rendere die MyComponent-Komponente
root.render(<MyComponent />);
Zugriff auf Instanzen von Kindkomponenten mit Refs
Refs können auch verwendet werden, um auf die Instanzmethoden oder Eigenschaften von Kindkomponenten zuzugreifen.
Beispiel
focusInput = () => {
this.inputRef.current.focus();
};
constructor(props) {
super(props);
this.inputRef = React.createRef();
}
render() {
return <input type="text" ref={this.inputRef} />;
}
}
class ParentComponent extends React.Component {
constructor(props) {
super(props);
this.childRef = React.createRef();
}
handleClick = () => {
this.childRef.current.focusInput();
};
render() {
return (
<div>
<ChildComponent ref={this.childRef} />
<button onClick={this.handleClick}>Eingabe des Kindes fokussieren</button>
</div>
);
}
}
const root = ReactDOM.createRoot(document.getElementById("root"));
// Rendere die MyComponent-Komponente
root.render(<MyComponent />);
Verwendung des useRef-Hooks (Funktionskomponenten)
In Funktionskomponenten kann der useRef-Hook verwendet werden, um Refs zu erstellen.
Beispiel
import ReactDOM from 'react-dom';
const MyComponent = () => {
const inputRef = useRef(null);
const handleClick = () => {
inputRef.current.focus();
};
return (
<div>
<input type="text" ref={inputRef} />
<button onClick={handleClick}>Eingabe fokussieren</button>
</div>
);
};
const root = ReactDOM.createRoot(document.getElementById("root"));
// Rendere die MyComponent-Komponente
root.render(<MyComponent />);
Zusammenfassung
- Refs erstellen: Verwendung in Klassenkomponenten
React.createRef, Verwendung in FunktionskomponentenuseRefHook. - Zugriff auf DOM-Elemente: Direkter Zugriff auf DOM-Elemente und deren Manipulation über Refs.
- Zugriff auf Instanzen untergeordneter Komponenten: Zugriff auf Methoden oder Eigenschaften der Instanz einer untergeordneten Komponente über Refs.
- Anpassen der exponierten Instanzwerte: Verwenden Sie
useImperativeHandleundforwardRef, um den Instanzwert anzupassen, den eine untergeordnete Komponente für ihre übergeordnete Komponente bereitstellt. - Refs im Concurrent Mode: Refs funktionieren im Concurrent Mode weiterhin normal und können kombiniert werden mit
useTransitionund anderen Hooks, die mit dem Concurrent Mode zusammenhängen.