如何将回调函数传递给父级

时间:2019-09-05 07:57:48

标签: javascript reactjs composition

假设我们有一个Container组件,如下所示。

class Container extends React.Component {
    handleClose = () => {
        // need to ask 'Content' is it okay with closing
        const isContentAgree = /* */;
        if (isContentAgree) this.props.onClose();
    };

    render () {
        const {content: Content} = this.props;
        return (
            <button onClick={this.handleClick}>Close</button>
            <Content {/* some container-specific props */} />
        );
    }
}

用法:

<Container content={SomeComponent}/>

在这种情况下,如何将回调函数从SomeComponent传递到Container?单击容器中的按钮并返回布尔值时,将调用此回调。

4 个答案:

答案 0 :(得分:1)

您需要将isContentAgree保留在state中,并且可以通过函数将isContentAgree切换到子组件。

class Container extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
              isContentAgree: false
            }
        }

        toggleContentAgree = (e) => {
            this.setState({ isContentAgree: e.target.value })
        }

        handleClose = () => {
            // need to ask 'Content' is it okay with closing
            const isContentAgree = this.state.isContentAgree;
            if (isContentAgree) this.props.onClose();
        };

        render () {
            const {content: Content} = this.props;
            return (
                <button onClick={this.handleClose}>Close</button>
                <Content toggleContentAgree={this.toggleContentAgree} />
            );
        }
    }

答案 1 :(得分:1)

您只需将回调函数作为prop传递给组件。

<Content onHide={handleClose} />

在组件中,必须根据需要调用props.onHide函数。

答案 2 :(得分:0)

您可以使用:

React.cloneElement(SomeComponent, [props...])

并作为“道具”传递更新容器状态的功能。

答案 3 :(得分:0)

您应该使用商店(Redux / Mobx / ContextAPI)进行操作。这是理想的方法。

但是...

您仍然可以传递回调函数:

class Container extends React.Component {
    render () {
        const {content: Content, callback} = this.props;
        return (
            <button onClick={this.handleClick}>Close</button>
            <Content onSomething={callback} {/* ... */} />
        );
    }
}

<Container content={SomeComponent} callback={someCallbackFunction}/>