React(JSX)中没有通量的父级通信

时间:2016-05-20 23:24:56

标签: javascript reactjs react-jsx jsx

我是React的新手,我正在努力解决我认为简单的问题。这是我构建的组件的图片。

Color Picking Component

我想要实现的目标似乎微不足道,但实际上我读过的每篇文章都解释了要做的事情告诉我一些不同的东西,并没有一个解决方案有效。它分解为:当用户点击标签时,它会构建一个托盘并循环遍历一系列颜色以构建颜色按钮。单击颜色按钮时,需要将单击的颜色传递给其父组件并运行函数以更新其颜色。我已经读过关于焊剂,事件冒泡,将“this”绑定到属性,并且这些解决方案似乎都没有起作用。对于像我这样的新手来说,React文档基本上没用。我想在这一点上避免像flux这样的复杂事件结构,因为我将一些简单的组件附加到我最初没有在React中编写的现有应用程序中。

另外,PS,这个代码在JSX中,对我来说比直接JS反应更有意义。在此先感谢您的帮助!

var colorsArray = ["#ED5851", "#9CCC64", "#337AEC", "#ff7a45", "#7E58C2", "#FFEB3B", "#78909C", "#FFFFFF", "#213a4b"];

var EditDrawer = React.createClass({
    updateColor: function() {
        console.log("New Color: " + i);
    },
    render: function(){
        var passTarget = this;
        return (
            <div className="container-fluid animated fadeIn extra-fast-animation tag-edit-drawer">
                <div className="row">
                    <div className="col-xs-12">
                        {colorsArray.map(function(object, i){
                            return <ColorButton buttonColor={object} key={i} />;
                        })}
                    </div>
                </div>
            </div>
        );
    }
})

var ColorButton = React.createClass({
    render: function(){
        var buttonStyle = {
            backgroundColor: this.props.buttonColor,
        };
        return (
            <div className="tag-edit-color-button" style={buttonStyle} >
            </div>
        )
    }
})

3 个答案:

答案 0 :(得分:6)

回调函数应该有效。正如您在之前的评论中所提到的,您可以使用抓取的this来访问孩子的updateColor函数:

var passTarget = this;
...
...
return <ColorButton 
  buttonColor={object} 
  key={i} 
  update={passTarget.updateColor} />

或者正如波格丹提到的,你可以在你的回调函数之后将它传递给地图:

{colorsArray.map(function(object, i){
  return <ColorButton 
           buttonColor={object} 
           key={i} 
           update={this.updateColor} />;
}, this)}

然后,您的<ColorButton />组件应该能够运行简单的onClick函数:

onClick={this.props.update}

然后你可以简单地利用父组件中的普通事件目标来捕获被点击的按钮的颜色:

updateColor: function(e) {
  console.log(e.target.style.backgroundColor);
}

这是一个完整的DEMO来演示。

答案 1 :(得分:3)

您可以将回调函数从父组件传递给子组件,如下所示:

 <ColorButton buttonColor={object} key={i} onColorSelect={this.updateColor}/>

(当使用React.createClass时,所有类方法都已绑定到this,因此您无需调用.bind(this))。

然后,从ColorButton组件,您可以将此回调称为this.props.onColorSelect(...)

JS Bin示例:http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js

答案 2 :(得分:1)

好的,这在 React 中非常简单,不使用fluxredux,类似于将道具从父级传递给子级,这里我们可以使用这样的回调函数:

var colorsArray = ["#ED5851", "#9CCC64", "#337AEC", "#ff7a45", "#7E58C2", "#FFEB3B", "#78909C", "#FFFFFF", "#213a4b"];


var EditDrawer = React.createClass({
    updateColor: function(i) {
        alert("New Color: " + i);
    },
    render: function(){
        return (
            <div className="container-fluid animated fadeIn extra-fast-animation tag-edit-drawer">
                <div className="row">
                    <div className="col-xs-12">
                        {colorsArray.map(function(object, i){
                            return <ColorButton buttonColor={object} key={i} updateColor={this.updateColor}/>;
                        }, this)}
                    </div>
                </div>
            </div>
        );
    }
});


var ColorButton = React.createClass({
    updateColor: function() {
        this.props.updateColor(this.props.buttonColor);
    },
    render: function(){
        var buttonStyle = {
            backgroundColor: this.props.buttonColor,
        };
        return (
            <div className="tag-edit-color-button" 
            style={buttonStyle}
            onClick={this.updateColor}>
              this.props.buttonColor
            </div>
        )
    }
});