【问题标题】:Calling one component's function from another, unrelated component in React在 React 中从另一个不相关的组件调用一个组件的函数
【发布时间】:2017-04-13 20:45:41
【问题描述】:

我正在使用 ReactJS 和 Electron 开发秒表应用程序。我有一个 Timer 组件,它跟踪时间并显示时钟和控件。

控件将由三个按钮组成:播放、暂停和停止。这些 Button 组件与 Timer 组件完全无关。

我的问题是:如果我在 Timer 组件中有一个handleStopClick() 函数,我如何从 StopButton 组件中调用它?

注意:目前没有播放/暂停功能。定时器在安装时简单地启动,一个停止按钮应该清除它。等我整理好之后再补充。

这是 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;

还有 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)}>
                &#9632;
            </button>
        );
    }
}

export default StopButton;

【问题讨论】:

    标签: reactjs electron jsx


    【解决方案1】:

    您可以将handleStopClick 方法传递给您的StopButton 组件的onClick 处理程序:

    constructor(props) {
        ...
        this.handleStopClick = this.handleStopClick.bind(this);
    }
    
    render() {
        return (
            ...
            <StopButton onClick={this.handleStopClick}/>
        );
    }
    

    或者,当单击StopButton 时,您似乎还有其他想要做的事情,您可以将其作为普通道具传递并在子组件的handleStopClick 方法中引用它:

    // Timer
    
    render() {
        return (
            ...
            <StopButton parentStopClick={this.handleStopClick}/>
        );
    }
    
    // StopButton
    
    handleStopClick() {
        ...
        this.props.parentStopClick();
    }
    

    【讨论】:

    • 我认为我的组件没有任何父子关系。据我了解,它们只是两个单独的 .jsx 文件。 parentStopClick 是否同时被定义、实例化和赋值?
    • 嗯...当我现在单击“停止”按钮时,我收到 Uncaught TypeError: this.props.parentStopClick is not a function 错误
    • 父子关系来自于在Timer 中渲染StopButton - 这就是你可以从Timer 向下传递道具的方式。由于StopButton 是用 ES2015 类语法编写的,因此如果要引用实例上的 props (this.props),则必须在其 constructor method 中调用 super()
    • 谢谢。我在上面插入了您的建议并收到错误:Uncaught TypeError: this.props.parentStopClick is not a function 当我单击停止按钮时。你有什么想法吗?
    • 这可能与绑定有关 - 我之前的评论提到了 StopButton 构造函数方法,但如果你没有在 @ 的构造函数中绑定 parentStopClick 函数,你可以得到 TypeError 987654342@ 组件。 This SO post 有一些信息可能会对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-07-13
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多