我有一个名为<Events events={Array} activeEventId={String} />
的组件。 Events
组件呈现<Event event={Object} isActive={Bool} />
个组件的列表,例如
render () {
let activeEventId,
events;
events = this.props.events;
activeEventId = this.props.activeEventId;
return <div>
{events.map(function(event) {
return <div key={event.id} >
<Event event={event} isActive={event.id === activeEventId} />
</div>;
})}
</div>;
}
每次更改activeEventId
都会重新创建Event
的完整列表。
如何更改只有Event
道具已更改的isActive
才会重新渲染的实现?
编辑:Events
和Event
组件都是纯粹的,因为它们只依赖于它们的道具,并且根本不使用状态。
答案 0 :(得分:1)
您可以将event
对象和activeEventId
值作为道具传递给Event
组件。然后,您可以实现shouldComponentUpdate
来检查它是否应该重新渲染。
shouldComponentUpdate: function(nextProps, nextState){
//check if activeEventId changed
return nextProps.activeEventId != this.props.activeEventId
}
答案 1 :(得分:0)
您可以使用React生命周期方法之一来实现它,它是shouldComponentUpdate
您必须检入shouldComponentUpdate,如果您返回false,则必须调用组件的render方法,然后使用shouldComponentUpdate
来调用您的render方法以获取更多信息如果你想根据条件实现它,那么你有一个标记可以保存true和false的值,你可以在你的渲染方法中应用
{isRender==true? <Event event={event} isActive={event.id === activeEventId} />:null}
答案 2 :(得分:0)
您可以采取两种方法:
1)在Event组件上实现shouldComponentUpdate
。这是一个fiddle,您的示例使用了基本的shouldComponentUpdate
方法。在日志中,您可以看到只有2个事件被重新渲染(变为活动的事件和不再激活的事件)。如果代码中的Event
组件被破坏,您可能无法正确生成密钥,请确保它们在渲染之间保持一致。
2)假设您正在使用某些Flux变体,您可以让您的Event
组件在商店中侦听并将isActive
标志保持在其状态中,并在存储触发时更新它相应的变化。这样效率更高一些,因为它不会重复调用EventList.render
甚至Event.shouldComponentUpdate
。只有实际更改的事件才会通过更新状态和重新呈现来响应更改。然而,这会引入更多的复杂性,因为它会强制您将状态放在子组件中,这总是您想要避免的。我绝对会尝试使用1),除非你真的需要优化每一位。