React/Flux实现技术不清楚父组件何时需要在子组件上拉字符串

React/Flux implementation technique is unclear for when a parent component needs to pull strings on child component

本文关键字:组件 字符串 何时需 React 实现 Flux 技术 不清楚      更新时间:2023-09-26

我遇到了一种不太做作的情况,而且我在使用React最佳实践实现它时遇到了困难。特别是它会产生以下错误:

未捕获错误:不变冲突:setProps(…):您在具有父级的组件上调用了setProps。这是一个反模式,因为道具在渲染时会得到反应性更新。相反,更改所有者的render方法,将正确的值作为道具传递给创建它的组件。

情况是这样的。父组件包含一个子组件。父组件有用于UI的事件处理程序,为了使行为正常工作,子组件内部的某些东西需要通过对高度样式的CSS更改来呈现其HTML。皱纹就在这里,通常信息会向上流动或保持不变,但在这里我需要改变孩子的一些东西。

父组件(Widget)呈现以下内容:

<div class="Widget">
  <div class="WidgetGrabBar" onMouseDown={this.handleMouseDown}>
  <WidgetDetails heightProp={this.props.detailsHeight} />
</div>

在Widget的其他地方,我有

componentDidMount: function() { 
  document.addEventListener('mousemove', this.handleMouseMove);
  document.addEventListener('mouseup', this.handleMouseUp);
},
componentDidUnmount: function() {
  document.removeEventListener('mousemove', this.handleMouseMove);
  document.removeEventListener('mouseup', this.handleMouseUp);
},      
<...>
handleMouseDown: function(e) {                                                   
  e.preventDefault(); 
  this.props.actuallyDragging = true;                                                   
},
handleMouseUp: function(e) {
  this.props.actuallyDragging = false;
},       
handleMouseMove: function(e) {
  e.preventDefault();
  if (this.props.actuallyDragging) {
    // update the prop! I need to send an urgent package of information to my child!! jQuery or findDOMElement() followed by DOM traversal is forbidden!!!
    this.setProps({
      detailsHeight: this.props.detailsHeight + e.deltaY
    });
  }                                                                                        
},                                                                                    

我让WidgetDetailsrender()渲染了一些类似的东西:

<div class="WidgetDetails" style={height: this.props.heightProp}>
   {detail_items_move_along_nothing_to_see_here}
</div>

我认为推出jQuery来获取.WidgetDetails以篡改其style属性是错误的,是非React的方法。真正的反模式。

但现在有人告诉我,我不能改变我的道具。或者,为了拥有新道具,我不得不扔掉所有东西,包括洗澡水。我不会那样做;我的道具包含详细项目的内容。也许制作另一个全新的副本是昂贵的。

我正试图让React参与到这项渲染工作中来,以达到新的高度。我该怎么做呢?这个错误基本上是强制Props现在应该是不可变的吗?错误告诉我,我必须在组件链上更高的位置使用这个高度。我可以想象从上面回调,但这感觉非常错误。我需要向下传递信息,而不是向上传递。

也许我应该用state。但是更改state会强制父组件Widget进行渲染。这不是我想要的。DOM中只有一个奇异的地方需要重新渲染,那就是child组件的div的style属性。

有两种方法。任一

  1. 父级上的调用处理程序。然后通过道具将新道具传给孩子。如果我没有记错的话,这就是react hello世界教程所采用的方法
  2. 通过setState更改视图中的状态

在您的情况下,方法2似乎真的很有意义。您基本上是在尝试跟踪视图数据。

顺便说一句,永远不要直接更新状态。使用setState。reactions虚拟dom的全部意义在于,它针对虚假更新进行了优化,所以你会没事的。还有生命周期方法componentShouldUpdate,以防您想要更精细的控制。

为了完整起见,我应该补充一点,还有第三种使用全局存储的方法。这就是反应通量所增加的。但同样,在你的情况下,这可能是过度杀戮。