将道具从孙子传递给父母

时间:2015-05-29 13:20:53

标签: javascript reactjs flux

我有以下React.js应用程序结构:

<App />
  <BreadcrumbList>
    <BreadcrumbItem />
  <BreadcrumbList/>
<App /> 

问题是,当我点击<BreadcrumbItem />时,我想要更改<App />

中的状态

我使用回调将道具传递给<BreadcrumbList/>,但这就是我得到了多远。 是否有任何专家如何轻松地将道具传递给竞争树?

如何在不进行任何回调链接的情况下将道具传递给<App />

2 个答案:

答案 0 :(得分:8)

如果您正在做一些简单的事情,那么通常最好通过组件层次结构传递状态更改,而不是专门为此目的创建存储(无论它是什么)。我会做以下事情:

BreadcrumbItem

var React = require('react/addons');
var BreadcrumbItem = React.createClass({

embiggenMenu: function() {
    this.props.embiggenToggle();
},

render: function() {
    return (
            <div id="embiggen-sidemenu" onClick={this.embiggenMenu} />
    );
}
});

module.exports = BreadcrumbItem ;

然后通过BreadcrumbList组件将其传递给父级.....

 <BreadcrumbItem embiggenToggle={this.props.embiggenToggle}>

...和UP到App,然后用它来设置状态......

var React = require('react/addons');

var App = React.createClass({

embiggenMenu: function() {
    this.setState({
        menuBig: !this.state.menuBig
    });
},

render: function() {
    return (

        <div>

            <BreadcrumbList embiggenToggle={this.embiggenMenu} />

        </div>

        )
    }
});
module.exports = BreadcrumbItem;

此示例切换一个简单的布尔值,但您可以传递任何您喜欢的内容。我希望这会有所帮助。

我没有对此进行过测试,但它已经(很快)从实际工作示例中删除了。

编辑: 正如它所要求的那样,我将扩展模糊:“你可以放弃任何东西”。

如果您正在制作基于数组的导航菜单,并且需要将所选项目传递给父级,那么您将执行以下操作

var React = require('react/addons');

var ChildMenu = React.createClass({


getDefaultProps: function () {
    return {
        widgets : [
            ["MenuItem1"],
            ["MenuItem2"],
            ["MenuItem3"],
            ["MenuItem4"],
            ["MenuItem5"],
            ["MenuItem6"],
            ["MenuItem7"]
        ]
    }
},

handleClick: function(i) {
    console.log('You clicked: ' + this.props.widgets[i]);
    this.props.onClick(this.props.widgets[i]);
},

render: function() {
    return (
        <nav>
            <ul>
                {this.props.widgets.map(function(item, i) {
                    var Label = item[0];

                    return (
                        <li
                            onClick={this.handleClick.bind(this, i)}
                            key={i}>

                            {Label}
                        </li>
                    );
                }, this)}
            </ul>
        </nav>
    );
}
});

module.exports = ChildMenu;

然后,您将在父级中执行以下操作:

var React = require('react/addons');

var ChildMenuBar = require('./app/top-bar.jsx');

var ParentApp = React.createClass({

widgetSelectedClick: function(selection) {
    //LOGGING
    //console.log('THE APP LOGS: ' + selection);

    //VARIABLE SETTING
    var widgetName = selection[0];

    //YOU CAN THEN USE THIS "selection"
    //THIS SETS THE APP STATE
    this.setState({
        currentWidget: widgetName
    });
},

render: function() {
        return (
                <ChildMenu onClick={this.widgetSelectedClick} />
        );
    }
});

module.exports = ParentApp;

我希望这会有所帮助。感谢upvote。

答案 1 :(得分:2)

如果您使用Flux模式,您可以使用 AppStore 来收听 BREADCRUMB_CLICK 事件。因此,当您单击BreadCrumbItem时,您可以执行一个分派 BREADCRUMB_CLICK 事件的操作。当 AppStore 处理该事件时,他会通知应用组件更新您的状态。

了解更多信息:

Flux architecture