如何识别触发 React+Flux 状态变化的组件?

How to Identify components that trigger changes to state in React+Flux?

标识触发状态更改的组件的规范 React+Flux 方法是什么?

我有一个应用程序允许用户使用 HSL 颜色创建调色板 space。

这是我的应用程序的组件结构:

Container (this component gets state and passes it down the chain)
 | PalettePicker
   | ColorPicker
     | Slider (this component fires action)
     | Slider
     | Slider
   | (As many ColorPickers as colors)
 | ImageSamples (not relevant, but dependent on palette)

下面是 ColorPicker 组件:

每个 ColorPicker 包含 3 个 Slider 组件,这些组件触发更新商店的事件。然后商店更新调色板并将整个调色板传递给 Container 组件,后者将它作为 props 传递给它的子组件。

这是我在 Store 中处理滑块更改事件的函数(我正在使用 Reflux):

sliderChange: function(newValue) {
    var modifiedPalette = this.palette;
    modifiedPalette[newValue.colorIndex][newValue.colorPartsIndex] = newValue.value;
    this.trigger(modifiedPalette)
}

我的调色板是一组 HSL 颜色值,所以类似于:

[ [350, 100, 50], [340, 100, 40], ... ]

A "color" 是上面的 3 项数组之一,我将颜色数组中的每个项目称为 "color part",因为它代表颜色的 H、S 或 L颜色.

将颜色和颜色部分索引作为道具向下传递似乎不雅。我目前正在构建这样的组件:

colorPickers = palette.map(function(color, i) {
    return (
        <ColorPicker 
             key={i}
             colorIndex={i}
             color={color}
        />
    )
});

据我所知,我需要将 colorIndex 作为道具传递,以便我的子组件可以知道它映射到调色板中的哪种颜色,以便我可以将该知识传递给商店.

惯用的 React+Flux 方法是什么?

我建议不要让 ColorPicker 组件自己调用任何操作,而是将其作为 "onChange" 道具传递。它不需要知道它是什么索引。 您可以绑定 onChange 函数,以便它传递索引:

colorPickers = palette.map(function(color, i) { 
   return ( 
      <ColorPicker key={i} 
          onChange={this.changeColor.bind(this, i)} 
          color={color} 
      /> 
   ) 
});

changeColor 函数如下所示:

changeColor : function(colorIndex,  colorArray) {...}

它应该接收整个颜色(数组)并用它和索引触发适当的 Reflux 动作。 这样 ColorPicker 只需要用改变的新颜色触发 onChange 函数。

对颜色选择器中的每个滑块执行相同的操作。向它传递一个已经绑定到其 partIndex 的 onChange 函数。当该函数被触发时,ColorPicker 应该构造一个新的颜色数组,并调用它自己的 onChange 属性。

希望已经足够清楚了。动机是——每个组件都应该有一个简单的回调函数,并且只输出它负责的内容。它不需要知道任何其他细节。 与其向下传递越来越多无用的索引属性,不如传递有界回调。 它将简化您的组件,并让您的高级组件处理构建 Flux 操作本身的细节。