React-Props
In React sind Props (Eigenschaften) ein Mechanismus, um Daten von einer übergeordneten Komponente an eine untergeordnete Komponente zu übergeben. Props sind schreibgeschützt; untergeordnete Komponenten können sie nicht direkt ändern. Stattdessen sollte die übergeordnete Komponente sie verwalten und aktualisieren.
Der Hauptunterschied zwischen State und Props istprops. Props sind unveränderlich, während sich State abhängig von Benutzerinteraktionen ändern kann. Aus diesem Grund müssen einige Container-Komponenten State definieren, um Daten zu aktualisieren und zu ändern. Untergeordnete Komponenten können Daten nur über Props weitergeben.
Props verwenden
Syntax zum Übergeben von Props:
<ComponentName propName={propValue} />
Das folgende Beispiel zeigt, wie Props in einer Komponente verwendet werden:
React-Beispiel
Ausprobieren »
Im Beispiel wird das Attribut name über props.name abgerufen.
Standard-Props
Sie können Standardwerte für Props mithilfe der defaultProps-Eigenschaft der Komponentenklasse festlegen, wie im Beispiel gezeigt:
React-Beispiel
Ausprobieren »
Mehrere Props
Sie können mehrere Eigenschaften an eine untergeordnete Komponente übergeben.
Beispiel
return (
<div>
<h2>{props.name}</h2>
<p>Alter: {props.age}</p>
<p>Standort: {props.location}</p>
</div>
);
};
const App = () => {
return (
<UserCard name="Alice" age={25} location="New York" />
);
};
ReactDOM.render(<App />, document.getElementById('root'));
propTypes Validierung
propTypes ist ein von React bereitgestelltes Werkzeug zur Typprüfung von Komponenten-Props.
Du kannst die Bibliothek prop-types verwenden, um eine Typprüfung der Komponenten-Props durchzuführen.
In React wird propTypes als statische Eigenschaft einer Komponente definiert. Zuerst musst du das Paket prop-types installieren:
npm install prop-types
Dann importiere prop-types in deiner Komponentendatei und definiere die Eigenschaft propTypes. Hier ist ein Beispiel:
Beispiel
const Greeting = (props) => {
return <h1>Hello, {props.name}!</h1>;
};
Greeting.propTypes = {
name: PropTypes.string.isRequired
};
const App = () => {
return (
<div>
<Greeting name="Alice" />
{/* <Greeting /> // Diese Zeile verursacht eine Konsolenwarnung, weil name erforderlich ist */}
</div>
);
};
ReactDOM.render(<App />, document.getElementById('root'));
Callback-Funktionen als Props übergeben
Du kannst Funktionen als Props an untergeordnete Komponenten übergeben, und untergeordnete Komponenten können diese Funktionen aufrufen, um mit der übergeordneten Komponente zu kommunizieren.
Beispiel
constructor(props) {
super(props);
this.state = { message: '' };
}
handleMessage = (msg) => {
this.setState({ message: msg });
};
render() {
return (
<div>
<ChildComponent onMessage={this.handleMessage} />
<p>Nachricht vom Kind: {this.state.message}</p>
</div>
);
}
}
const ChildComponent = (props) => {
const sendMessage = () => {
props.onMessage('Hello from Child!');
};
return (
<div>
<button onClick={sendMessage}>Nachricht senden</button>
</div>
);
};
ReactDOM.render(<ParentComponent />, document.getElementById('root'));
Props destrukturieren
In Funktionskomponenten kannst du Code vereinfachen, indem du Props destrukturierst.
Beispiel
return <h1>Hello, {name}!</h1>;
};
const App = () => {
return <Greeting name="Alice" />;
};
ReactDOM.render(<App />, document.getElementById('root'));
Zusammenfassung
- Props übergeben und verwenden: Die übergeordnete Komponente übergibt Daten an die untergeordnete Komponente, und die untergeordnete Komponente durch
propsempfängt. - Standard-Props: Verwende
defaultPropsum die Standardeigenschaftswerte der Komponente festzulegen. - PropTypes-Validierung: Verwenden Sie
prop-typesBibliothek zur Durchführung der Typprüfung von Props. - Übergeben von Callback-Funktionen: Die Elternkomponente kann Funktionen als Props an Kindkomponenten übergeben, um die Kommunikation zwischen Komponenten zu ermöglichen.
- Destrukturierung von Props: Destrukturieren Sie Props in Funktionskomponenten, um den Code zu vereinfachen.
State und Props
Das folgende Beispiel zeigt, wie State und Props zusammen in einer Anwendung verwendet werden. Wir können State in der Elternkomponente festlegen und ihn über Props an die Kindkomponente übergeben. In der render-Funktion legen wir name und site fest, um die von der Elternkomponente übergebenen Daten zu erhalten.
React-Beispiel
Ausprobieren »
Props-Validierung
React.PropTypes wurde nach React v15.5 in dieprop-types-Bibliothek verschoben.
<script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/prop-types/15.8.1/prop-types.min.js" type="application/javascript"></script>
Props-Validierung verwendetpropTypes, was sicherstellt, dass unsere Anwendungskomponenten korrekt verwendet werden. React.PropTypes bietet viele Validatoren, um zu prüfen, ob die eingehenden Daten gültig sind. Wenn ungültige Daten an Props übergeben werden, gibt die JavaScript-Konsole eine Warnung aus.
Das folgende Beispiel erstellt eine Mytitle-Komponente. Die title-Prop ist erforderlich und muss ein String sein. Nicht-String-Typen werden automatisch in Strings konvertiert:
React 16.4 Beispiel
Ausprobieren »
React 15.4 Beispiel
Ausprobieren »
Natürlich können wir mehr einführenPropTypesValidatoren und wie man sie einsetzt. Im Folgenden sind einige häufig verwendetePropTypesValidator-Beschreibungen:
Grundlegende Datentypen
PropTypes.string: ZeichenkettePropTypes.number: NumberPropTypes.boolean: BooleanPropTypes.object: ObjectPropTypes.array: ArrayPropTypes.func: FunctionPropTypes.symbol:Symbol
Spezielle Typen
PropTypes.node: Alles, was gerendert werden kann: Zahlen, Strings, Elemente oder Arrays (einschließlich dieser Typen)PropTypes.element: React-ElementPropTypes.instanceOf(Class): Eine Instanz einer Klasse
Kombinierte Typen
PropTypes.oneOf(['option1', 'option2']): Enum-Typ, der Wert muss einer der angegebenen Optionen seinPropTypes.oneOfType([PropTypes.string, PropTypes.number]): Einer von mehreren TypenPropTypes.arrayOf(PropTypes.number): Ein Array eines bestimmten TypsPropTypes.objectOf(PropTypes.number): Ein Objekt, das aus einem bestimmten Typ bestehtPropTypes.shape({ key: PropTypes.string, value: PropTypes.number }): Ein Objekt mit einer spezifischen Form
Andere
PropTypes.any: Beliebiger TypPropTypes.exact({ key: PropTypes.string }): Ein Objekt mit spezifischen Schlüsseln und ohne zusätzliche Schlüssel
Die folgenden sind einige Beispielcodeausschnitte, die zeigen, wie verschiedenePropTypesValidatoren:
Beispiel
import ReactDOM from 'react-dom/client';
import PropTypes from 'prop-types';
class MyComponent extends React.Component {
static propTypes = {
title: PropTypes.string.isRequired, // Muss ein String sein und ist erforderlich
age: PropTypes.number, // Optionale Zahl
isAdmin: PropTypes.bool, // Optionaler boolescher Wert
user: PropTypes.shape({ // Muss ein Objekt mit einer bestimmten Form sein
name: PropTypes.string,
email: PropTypes.string
}),
items: PropTypes.arrayOf(PropTypes.string), // Muss ein Array aus Strings sein
callback: PropTypes.func, // Optionale Funktion
children: PropTypes.node, // Optionaler renderbarer Inhalt
options: PropTypes.oneOf(['option1', 'option2']), // Muss einer der spezifischen Werte sein
};
render() {
return (
<div>
<h1>{this.props.title}</h1>
{this.props.age && <p>Alter: {this.props.age}</p>}
{this.props.isAdmin && <p>Admin</p>}
{this.props.user && (
<div>
<p>Name: {this.props.user.name}</p>
<p>E-Mail: {this.props.user.email}</p>
</div>
)}
{this.props.items && (
<ul>
{this.props.items.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
)}
{this.props.callback && (
<button onClick={this.props.callback}>Klick mich</button>
)}
{this.props.children}
{this.props.options && <p>Option: {this.props.options}</p>}
</div>
);
}
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<MyComponent
title="Hallo, Welt!"
age={30}
isAdmin={true}
user={{ name: "Max Mustermann", email: "[email protected]" }}
items={['Element 1', 'Element 2', 'Element 3']}
callback={() => alert('Button geklickt!')}
options="option1"
>
<p>Dies ist ein untergeordnetes Element</p>
</MyComponent>
);