好的我现在正在学习React.JS。考虑以下情况。有一个根组件将模型保持为状态。它的一个孩子是一个复杂的控件,负责编辑部分模型。有一些规则:某些用户的操作以一种方式修改部件(具体而言,设置列表以包含一个单击的项目),其他操作以其他方式修改它(例如,只需将该项添加到列表)。当然,这些规则不是由业务逻辑强加的,它只是我设计特定子组件的方式。现在我必须决定如何将孩子的UI元素连接到模型,反之亦然。
1)我可以让孩子无国籍。让它接受当前模型状态作为道具,根据道具呈现其UI,并在点击时,向父母发送一个事件(通过道具中的一些回调)"嘿,我已经点击过这种方式&#34 ;。父级可以检查事件并应用setState(model => replace_list_single_entry(model,event.id))或setState(model => add_entry_to_list(model,event.id))。 缺点:父母必须了解特定于组件实现的逻辑,而实际上我应该能够切换到另一个组件与另一个实现。封装,元件驱动设计和低耦合等等。
2)我可以让组件计算父级的新状态(至少在某种形式,可能不是模型中的一个),将它发送到某个props.onChange,然后父级可以简单地将state设置为适应这个计算的状态。 我认为严重的缺点,因为setState是异步的并且可以批处理,所以可能会发生事件丢失。看,孩子将用户的动作解释为"将ID1添加到列表",获取其props.list,制作它的另一个列表和ID1,并将该列表发送给父母,使setState;当该setState仍然处于待处理状态时,用户再次单击以添加另一个ID2,但子项的props.list仍然相同,因此子项向父项发送包含ID2但不包含ID1的新计算列表。父亲使用这个新列表调用setState,最终ID1从列表中丢失。
3)我可以发送父母而不是从我的道具计算的状态,但是状态计算器。家长将此计算器应用于某些"道具"对象,它从当前状态填充,就像传递给孩子们的道具一样。 (我的意思是,这可能只是模型中的一些属性,但可能是预先处理的东西)由此产生的"道具"然后重新集成到模型中。 缺点:它看起来过于复杂。但实际上,这可能是最佳选择。
4)我可以使组件有状态,有自己的描述其UI控件的状态,并在每次设置状态完成后,将更新后的状态发送给父级。然而,就缺点而言,这与方法(2)没有什么不同,并且增加了一些更多的关注 - 诚然,可以解决, - 就像保持内部状态最终 - 与父母的状态一致。
那么,这个技巧的正确方法是什么?
答案 0 :(得分:0)
这对我来说真的没有任何意义。
我的意思是,模式“<Child onChange="{event=>this.setState(event.data)}>
”&gt; (或类似的东西)很常见,当一些新手问“我如何影响孩子的父母状态?”时,每个人都急于建议。但是当我说“这种方法有很大的缺点,我该如何避免它们?”时,每个人都保持沉默是神秘的。那么他们如何编写代码呢?
确定唯一的解决方案,假设没有经验丰富的用户可以给我一个详尽的答案,似乎是“不要让父母的状态依赖于孩子,让组件只负责模型的非重叠部分,而是将子映射映射到已映射到父级的子节“。
即使采用这种方法实际上也不是分解。