【发布时间】:2015-12-22 14:06:29
【问题描述】:
我在使用 React 时一直遇到同样的问题。我觉得我应该使用生命周期方法。 (不仅仅是 componentWillMount 和 componentWillReceiveProps)。但他们似乎从来没有达到我的目的。这里有两个例子:
- 异步加载
我的父组件使用 AJAX 加载一些数据。孙子组件需要这些数据——通过 props 传递。由于时间的关系,当子组件安装或不安装时,数据可能可用。我不知道是否将代码放在我的孙子组件中,这取决于 componentWillMount() 或 componentWillReceiveProps() 中的这些道具。我最终不得不把它放在两者中。 (或者在他们都调用的方法中)。
- 在初始渲染时调用或不调用生命周期方法。我希望他们都被召唤。
我的组件获取了一些数据。 (使用 getStateFromFlux - Fluxxor 提供的一个 mixin)。这在加载数据的循环中发生了好几次,其中设置了各种标志到检索到的数据对象上:比如说卸载、加载和加载。这种状态变化会导致重新渲染。
如果有要显示的内容,我只想渲染和显示数据。所以 - 我的渲染方法有第一行:
if data.loadState != 'loaded'
return '<span />'
好的。好。我想 - 必须有一个生命周期方法来解决这个问题。所以我这样做了:
shouldComponentUpdate: function (nextProps, nextState) {
if nextState.loadState == 'loaded'
return true
else
return false //stops the render. Good.
}
最后我想到了——我使用了生命周期方法。
但是,唉,虽然这确实会在某些情况下停止调用渲染 - 当没有数据时 - 我仍然无法删除关于 hacky 的行
if data.loadState != 'loaded'
return '<span />'
这是因为 shouldComponentUpdate 在初始渲染时没有调用。当这个组件第一次渲染时,没有数据。 loadState 是“卸载”。渲染方法仍然被调用。而且我仍然需要避免显示 UI(带有空数据字段)。
一般而言 - 生命周期方法要么仅在初始渲染时调用,要么仅在后续渲染时调用。对于我的大多数用例来说,这非常无用。我想要一种与它是第一次渲染还是后续渲染无关的方法。
我对 React 缺少什么? (我唯一能想到的是,当您可以确定您的数据时,它被设计为与初始渲染服务器端一起使用 - 然后一旦在浏览器中,生命周期方法就是关于检测更改)。
谢谢
【问题讨论】:
标签: reactjs