Ich arbeite an einer Stoppuhr-App mit ReactJS und Electron. Ich habe eine Timer-Komponente, die die Zeit verfolgt und die Uhr & Kontrollen anzeigt.Aufruf der Funktion einer Komponente von einer anderen, nicht verwandten Komponente in React
Die Bedienelemente bestehen aus drei Tasten: Play, Pause und Stop. Diese Button-Komponenten haben keinerlei Bezug zur Timer-Komponente.
Meine Frage ist: Wenn ich eine handleStopClick()
Funktion in der Timer-Komponente habe, wie kann ich es aus der StopButton-Komponente aufrufen?
Hinweis: Derzeit gibt es keine Wiedergabe/Pause-Funktion. Der Timer startet einfach, wenn er montiert ist und ein einzelner Stop-Knopf sollte ihn löschen. Ich füge den Rest hinzu, wenn ich das aussortiert habe. Hier
ist Timer.jsx:
import '../assets/css/App.css';
import React, { Component } from 'react';
import PlayButton from './PlayButton'; // No function
import PauseButton from './PauseButton';
import StopButton from './StopButton';
class Timer extends Component {
constructor(props) {
super(props);
this.state = {
isRunning: false,
secondsElapsed: 0
};
}
getHours() {
return ('0' + Math.floor(this.state.secondsElapsed/3600)).slice(-2);
}
getMinutes() {
return ('0' + Math.floor(this.state.secondsElapsed/60) % 60).slice(-2);
}
getSeconds() {
return ('0' + this.state.secondsElapsed % 60).slice(-2);
}
handleStopClick() {
clearInterval(this.incrementer);
}
componentDidMount() {
this.isRunning = true;
console.log(this.isRunning);
var _this = this; // reference to component instance
this.incrementer = setInterval(() => {
_this.setState({
secondsElapsed: (_this.state.secondsElapsed + 1)
});
}, 1000)
}
playOrPauseButton() {
if (this.isRunning) {return <PauseButton />}
else {return <PlayButton />}
}
render() {
return (
<div>
{this.playOrPauseButton()}
<StopButton /> <hr />
{this.getHours()} : {this.getMinutes()} : {this.getSeconds()}
</div>
);
}
}
export default Timer;
Und StopButton.jsx:
import '../assets/css/App.css';
import React, { Component } from 'react';
import Timer from './Timer';
class StopButton extends Component {
handleClick() {
console.log('this is: ', this);
Timer.handleStopClick() // here's where I'd like to call Timer's function
}
render() {
return (
<button onClick={(e) => this.handleClick(e)}>
■
</button>
);
}
}
export default StopButton;
Ich glaube nicht, ich habe keine Eltern-Kind-Beziehungen mit meinen Komponenten. Sie sind einfach zwei separate .jsx-Dateien, nach meinem Verständnis. Wird "parentStopClick" definiert, instanziiert und auf einmal einem Wert zugewiesen? –
Hmm ... Ich bekomme einen 'Uncaught TypeError: this.props.parentStopClick ist kein Funktion' Fehler, wenn ich jetzt auf die Stop-Schaltfläche klicke –
Die Eltern-Kind-Beziehung kommt vom Rendern' StopButton' in 'Timer' - das ist wie du Requisiten von "Timer" runterlassen kannst. Da 'StopButton' in ES2015-Klassensyntax geschrieben ist, müssen Sie' super() 'in seiner [Konstruktormethode] (http://stackoverflow.com/a/34076378/7864431) aufrufen, wenn Sie Requisiten auf der Instanz referenzieren möchten ('this.props'). –