繁体   English   中英

从孩子反应父访问状态

[英]React parent access state from child

如何在 React 中从父级内部的子级显示状态?

var Form = React.createClass({
    render: function() {
        return (
        <form>
            <h1>***CHILD STATE CHECKED***</h1>
            {this.props.children}
        </form>
        )
    }
})

var Checkbox = React.createClass({
    getInitialState: function() {
        return {
            checked: true
        }   
    },

    toggle: function() {
        this.setState({
            checked: !this.state.checked
        });
    },

    render: function() {
        return (
            <div onClick={this.toggle} aria-checked={this.state.checked} role="checkbox"></div>
        );
    }
})

ReactDOM.render(
    <Form>
        <Checkbox />
    </Form>,
    document.querySelector('#app')
);

在其父组件中(尤其是在父组件中的此标记内)显示子组件状态的最佳方式是什么? 如果没有“丑陋的技巧”,这可能吗?
当复选框被选中时,我想向表单添加一些节点或其他组件。

不要在复选框中调用切换。 将回调从 Form 类传递到 CheckBox 类。

在表单类中:

return(
        <CheckBox onClick={this.onClick} />
)

    onClick(){
        console.log('Checkbox clicked');
    } 

在 CheckBox 类中:

    <div onClick={this.props.onClick} aria-checked={this.state.checked} role="checkbox">  

在父类中管理状态,而不是在子类中。

尽管如果在父状态中管理此 CheckBox 的状态的答案是正确的,但在一些更复杂的情况下,您可能仍需要将状态从子组件传递到组件:概念类似,您需要从parent to child ,它将像回调一样使用,您将在其中处理该孩子的状态:

var Form = React.createClass({
    handleChildStateChange: function(newChildState) {
        // handle the child state change here
    }

    render: function() {
        const updatedChildren = React.Children.map(this.props.children,
            (child) => {
                return React.cloneElement(child, { updateParent: this.handleChildStateChange });
        });
        return (
            <form>
                <h1>***CHILD STATE CHECKED***</h1>
                {updatedChildren}
            </form>
        )
    }
})

然后,当更新子组件中的状态时,以新状态作为参数调用传递的函数(由于状态的异步特性,我在这里使用函数式 setState ):

var Checkbox = React.createClass({
    getInitialState: function() {
        return {
            checked: true
        }   
    },

    toggle: function() {
        this.setState((state) => {
            state.checked = !state.checked;
            this.props.updateParent(state);
            return state;
        });
    },

    render: function() {
        return (
            <div onClick={this.toggle} aria-checked={this.state.checked} role="checkbox"></div>
        );
    }
})

最后,您使用的渲染保持不变:

ReactDOM.render(
    <Form>
        <Checkbox />
    </Form>,
    document.querySelector('#app')
);

如果您想了解更多关于将道具从孩子传递给父母的信息,这篇文章可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM