Ich bin neu in React Native (und React) und versuche, einer Komponente eine Funktion als Requisite zu übergeben.
Mein Ziel ist es, eine Komponente zu erstellen, deren OnPress-Funktionalität vom Instanziator der Komponente festgelegt werden kann, um sie wiederverwendbar zu machen.
Hier ist mein Code soweit.
App.js
import React, { Component } from 'react';
import { View } from 'react-native';
import TouchableButton from './components/touchable-button';
export default class App extends Component<Props> {
constructor () {
super();
}
handlePress () {
// this should be called when my custom component is clicked
}
render () {
return (
<View>
<TouchableButton handlePress={this.handlePress.bind(this)}/>
</View>
);
}
}
TouchableButton.js
import React, { Component } from 'react';
import { TouchableHighlight } from 'react-native';
import AppButton from "./app-button";
export default class TouchableButton extends Component {
handlePress;
constructor(props){
super(props);
}
render () {
return (
<TouchableHighlight onPress={
this.props.handlePress
}>
<AppButton/>
</TouchableHighlight>
);
}
}
Ich übergebe die handlePress-Funktion als Requisite handlePress. Ich würde erwarten, dass die Requisiten des TouchableButton diese Funktion enthalten, sie ist jedoch nicht vorhanden.
Beim Schreiben von handlePress={this.handlePress.bind(this)}
übergeben Sie eine Anweisungsausführung (wobei wann und wenn eine Funktion ausgeführt wird). Es wird erwartet, dass die Funktion selbst entweder mit handlePress={this.handlePress}
übergeben wird (und die Bindung im Konstruktor ausgeführt wird) oder handlePress={() => this.handlePress()}
, die eine anonyme Funktion übergibt, die bei ihrer Ausführung handlePress im this
-Klassenkontext ausführt.
// Parent
handleClick( name ){
alert(name);
}
<Child func={this.handleClick.bind(this)} />
// Children
let { func } = this.props;
func( 'VARIABLE' );
Verwenden Sie die arrow-Funktion und kümmern Sie sich nicht um die Bindung von this
.
Ich empfehle vor dem Aufruf der props-Methode den Wert null zu prüfen.
App.js
export default class App extends Component<Props> {
constructor () {
super();
}
handlePress = () => {
// Do what you want.
}
render () {
return (
<View>
<TouchableButton onPress={this.handlePress}/>
</View>
);
}
}
TouchableButton.js
import React, { Component } from 'react';
import { TouchableHighlight } from 'react-native';
import AppButton from "./app-button";
export default class TouchableButton extends Component {
constructor(props){
super(props);
}
handlePress = () => {
// Need to check to prevent null exception.
this.props.onPress?.(); // Same as this.props.onPress && this.props.onPress();
}
render () {
return (
<TouchableHighlight onPress={this.handlePress}>
<AppButton/>
</TouchableHighlight>
);
}
}