将道具从孙子传递给父母

Mic*_*ach 4 javascript flux reactjs

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

<App />
  <BreadcrumbList>
    <BreadcrumbItem />
  <BreadcrumbList/>
<App /> 
Run Code Online (Sandbox Code Playgroud)

问题是,当我点击时<BreadcrumbItem />,我想改变状态<App />

我使用回调来传递道具,<BreadcrumbList/>但这就是我得到了多远.有没有pattaren如何轻松地将道具传递给竞争树?

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

Ant*_*gan 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 ;
Run Code Online (Sandbox Code Playgroud)

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

 <BreadcrumbItem embiggenToggle={this.props.embiggenToggle}>
Run Code Online (Sandbox Code Playgroud)

...和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;
Run Code Online (Sandbox Code Playgroud)

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

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


编辑:根据要求,我将扩大模糊:"你可以放弃任何东西".

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

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;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.谢谢你的upvote.

  • 如果这个评论有用,请upvote,我正在努力增加我的SO代表和任何帮助或反馈将不胜感激.谢谢. (2认同)