React/Flux实现技术不清楚父组件何时需要在子组件上拉字符串
React/Flux implementation technique is unclear for when a parent component needs to pull strings on child component
我遇到了一种不太做作的情况,而且我在使用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
});
}
},
我让WidgetDetails
和render()
渲染了一些类似的东西:
<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
属性。
有两种方法。任一
- 父级上的调用处理程序。然后通过道具将新道具传给孩子。如果我没有记错的话,这就是react hello世界教程所采用的方法
- 通过setState更改视图中的状态
在您的情况下,方法2似乎真的很有意义。您基本上是在尝试跟踪视图数据。
顺便说一句,永远不要直接更新状态。使用setState。reactions虚拟dom的全部意义在于,它针对虚假更新进行了优化,所以你会没事的。还有生命周期方法componentShouldUpdate,以防您想要更精细的控制。
为了完整起见,我应该补充一点,还有第三种使用全局存储的方法。这就是反应通量所增加的。但同样,在你的情况下,这可能是过度杀戮。
- 是否有任何JavaScript UI组件可以显示字符串之间的差异
- 传递给Angular2组件的字符串始终未定义
- 如何使用Angular 1.5组件将属性求值为字符串,这是一个自定义函数
- 从 Javascript 中的 rgb 字符串中获取颜色组件
- 使用字符串元素列表作为 Select2 组件的源
- React 组件中的字符串插值,其中包含从服务器返回的字符串
- 如何将字符串转换为URI组件
- 未捕获的错误:不变冲突:元素类型无效:需要字符串(对于内置组件)或类/函数,但得到:对象
- react router问题未捕获错误:不变冲突:元素类型无效:应为字符串(用于内置组件)
- 用Angular 1.5的组件绑定字符串
- 输出解码组件字符串不工作
- 用React.js组件替换部分html字符串并渲染(不带dangerouslySetInnerHTML)
- 如何在javascript中匹配包含动态组件的字符串
- 为什么Ext flash组件连接两个字符串来形成这个url ?
- Mithril.js:为什么“组件模板必须返回一个虚拟元素,而不是数组、字符串等”?的意思
- React控制的组件输入值为空字符串
- 绑定到Ember.js中包含自定义组件的字符串
- 如何将React组件放入HTML字符串中
- 元素类型无效:期望是字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义
- 如何从字符串名称渲染react组件