【问题标题】:React - how to pass state to another componentReact - 如何将状态传递给另一个组件
【发布时间】:2016-12-05 23:46:53
【问题描述】:

我试图弄清楚如何通知另一个组件有关状态更改。假设我有 3 个组件 - App.jsx、Header.jsx 和 SidebarPush.jsx,而我只想用 onClick 切换一个类。

所以 Header.jsx 文件将有 2 个按钮,单击时会将状态切换为 true 或 false。其他 2 个组件 App.jsx 和 Header.jsx 将需要了解这些状态更改,以便它们可以切换一个类 每当这些状态发生变化时。

App.jsx

import React from 'react';
import Header from 'Header';
import classNames from "classnames";
import SidebarPush from 'SidebarPush';
import PageWrapper from 'PageWrapper';

var MainWrapper = React.createClass({
    render: function() {
        return (
            <div className={classNames({ 'wrapper': false, 'SidebarPush-collapsed': !this.state.sidbarPushCollapsed })}>
                <Header/>
                <SidebarPush/>
                <PageWrapper>
                {this.props.children}
                </PageWrapper>
            </div>
        );
    }
});

module.exports = MainWrapper;

Header.jsx

import React from 'react';
import ReactDom from 'react-dom';


class Header extends React.Component {
    constructor() {
        super();
        this.state = {
            sidbarPushCollapsed: false,
            profileCollapsed: false
        };
        this.handleClick = this.handleClick.bind(this);
    }
    handleClick() {
        this.setState({
            sidbarPushCollapsed: !this.state.sidbarPushCollapsed,
            profileCollapsed: !this.state.profileCollapsed

        });
    }
    render() {
        return (
            <header id="header">
                <ul>
                    <li>
                        <button type="button" id="sidbarPush" onClick={this.handleClick} profile={this.state.profileCollapsed}>
                            <i className="fa fa-bars"></i>
                        </button>
                    </li>
                    <li>
                        <button type="button" id="profile" onClick={this.handleClick}>
                            <i className="icon-user"></i>
                        </button>
                    </li>
                </ul>
                <ul>
                    <li>
                        <button id="sidbarOverlay" onClick={this.handleClick}>
                            <i className="fa fa-indent"></i>
                        </button>
                    </li>
                </ul>
            </header>
        );
    }
};

module.exports = Header;

SidebarPush.jsx

import React from 'react';
import ReactDom from 'react-dom';
import classNames from "classnames";


class SidebarPush extends React.Component {
    render() {
        return (
            <aside className="sidebarPush">
                <div className={classNames({ 'sidebar-profile': true, 'hidden': !this.state.pagesCollapsed })}>
                        ....
                </div>

                <nav className="sidebarNav">
                        ....
                </nav>
            </aside>
        );
    }
}


export default SidebarPush;

【问题讨论】:

    标签: reactjs components state


    【解决方案1】:

    将所有状态和 handleClick 函数从 Header 移动到 MainWrapper 组件。

    然后将值作为 props 传递给需要共享此功能的所有组件。

    class MainWrapper extends React.Component {
        constructor() {
            super();
            this.state = {
                sidbarPushCollapsed: false,
                profileCollapsed: false
            };
            this.handleClick = this.handleClick.bind(this);
        }
        handleClick() {
            this.setState({
                sidbarPushCollapsed: !this.state.sidbarPushCollapsed,
                profileCollapsed: !this.state.profileCollapsed
    
            });
        }
        render() {
            return (
               //...
               <Header 
                   handleClick={this.handleClick} 
                   sidbarPushCollapsed={this.state.sidbarPushCollapsed}
                   profileCollapsed={this.state.profileCollapsed} />
            );
    

    然后在你的 Header 的 render() 方法中,你会使用 this.props:

    <button type="button" id="sidbarPush" onClick={this.props.handleClick} profile={this.props.profileCollapsed}>
    

    【讨论】:

    • 感谢您的回复,这是有道理的。从顶部开始并传递给子组件。您有标题通过手柄单击和配置文件状态的道具,这很好。但是我将如何传递另一个状态(sidbarPushCollapsed)呢?该按钮的点击触发器也在 Header 组件中。
    • 传递 profileCollapsed 的方式相同。你添加任何你想要的作为属性。然后可以通过子组件中的this.props 访问这些属性[查看更新的答案]
    • 哦,好吧,没有意识到我可以像这样附加多个状态。感谢您的帮助!
    • 这行this.handleClick = this.handleClick.bind(this); 是做什么的?
    • @Omer 将该函数绑定到外部类的this 上下文。这样您就可以在不同的方法中执行this.setState() 之类的操作。在此示例中,绑定到 this 绑定到 MainWrapper,它从 React.Component 的扩展接收 setState 方法
    猜你喜欢
    • 2017-11-07
    • 1970-01-01
    • 2019-07-17
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2017-01-26
    相关资源
    最近更新 更多