React (JSX) 中的子级与父级通信,无需通量

新手上路,请多包涵

我真的是 React 的新手,我正在努力解决在我看来是一个简单的问题。这是我构建的组件的图片。

颜色选择组件

我试图完成的事情似乎微不足道,但实际上我读过的每一篇解释该怎么做的文章都告诉了我一些不同的东西,而且没有一个解决方案有效。它分解为:当用户单击标签时,它会构建一个托盘并循环遍历一系列颜色以构建颜色按钮。单击颜色按钮时,它需要将单击的颜色传递给其父组件并运行一个函数来更新其颜色。我读过有关通量、事件冒泡、将“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>
        )
    }
})

原文由 Chris Patty 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 381
2 个回答

回调函数应该工作。正如您在之前的评论中提到的,您可以使用捕获的 this 从孩子访问 updateColor 函数:

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

或者正如 Bogdan 提到的,您可以在回调函数之后通过 map 传递它:

 {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 来演示。

原文由 Brad Colthurst 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以将回调函数从父组件传递给子组件,就像这样简单:

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

(当使用 React.createClass 时,所有类方法都已经绑定到 this ,所以你不需要调用 .bind(this) )。

然后从 ColorButton 组件你可以调用这个回调 this.props.onColorSelect(...)

JS Bin 示例:http: //jsbin.com/fivesorume/edit ?js,output

原文由 Bogdan Savluk 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题