属性作为从父级接收的初始值,然后复制到状态?或者不使用状态,但总是从商店读取?

时间:2016-02-17 14:35:43

标签: reactjs flux

上下文

作为React / Flux的新手,我有时会发现自己处于我的React组件通过其属性从父组件接收值(例如,对于文本框中显示的浮点参数)的情况。这发生在父组件的渲染调用中,它从商店获取值并通过其属性将其传递给子组件。

然后,当用户更改GUI中的值(在具有文本框的子组件中)时,这将导致将Flux操作作为已更改的值作为有效负载发送到调度程序。然后,调度程序通过已注册的回调调用存储,这些回调使用新值更新其数据。然后,商店发出更改事件,并通知子组件商店已更改。子组件从存储中获取新值,并需要通过调用setState来触发重新呈现,其中新状态包含新值。为了使其工作,我需要在我的参数的子组件状态中有一个浮点字段,以便React可以将旧状态与新状态进行比较。

在子组件的构造函数中,我将初始参数值(从父组件进入)复制到初始状态。 这感觉有点奇怪......

提案

另一种方法可能是根本不使用状态,并且始终在渲染函数中从存储中读取所有内容,但是没有剩下的状态,React可以检查是否需要重新渲染?并且调用forceUpdate似乎也有点苛刻......

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

从道具设置状态是一个反模式,你应该尽可能避免。此外,在这种情况下,不需要强制重新渲染。

如果您的父组件被通知存储中的更改,它还会将此值传递给子组件,然后子组件会自动重新呈现。在子组件中,您应该只从this.props获取值,并在输入更改时调用从父组件作为prop传递的回调。然后父组件调度一个动作,因为它首先知道商店。

答案 1 :(得分:0)

  

我需要在子参数的状态中为我的参数设置一个浮点字段,以便React可以将旧状态与新状态进行比较。

我认为这是你的误解所在。

React不会比较状态以确定它是否应该重新渲染。相反,当它接收新的状态或道具时,它会在内部触发它的渲染功能,而不会将任何结果发布到显示器上。完成此虚拟渲染后,它会将渲染函数的结果与当前显示的渲染进行比较。

比较的是渲染结果,而不是状态或道具。因此,您绝对可以添加/删除州内的项目(通过this.setState),并查看您在dom中的影响。

所以在一天结束时,为了专门解决您的问题,我会从Store发送您的数据 - > ParentComponent.state - > ChildComponent.prop。您可以依赖更新的Parent.state来触发该级别的重新呈现,然后生成更新的Child.prop以触发该级别的重新呈现。