我知道如果render()方法返回false,shouldComponentUpdate()将阻止调用它。如果我在render()方法中使用了一些昂贵的逻辑,那么shouldComponentUpdate()就是一个非常有用的东西,因为我可以阻止render()调用。
但是,如果我的render()方法只返回Element,而不执行任何代价高昂的代码,那会怎么样呢?
在render()调用时,shouldComponentUpdate()中的比较(让我们以PureComponent的实现为例)和内置的React diffing有什么不同吗?
发布于 2018-11-12 16:28:09
主要的区别是React.PureComponent在旧的道具和新的道具之间以及新的状态和新的道具之间做了一个简单的比较,但是内置的React diffing(协调)简单地比较了新旧的DOM树,但是请阅读上面的这篇文章,它会解决你的疑问。
发布于 2018-11-12 16:32:13
React告诉你在最大限度上避免场景,这将导致性能问题。React在更新组件元素方面非常聪明,在需要的地方使用key,react将匹配更新并更新DOM。React本身会比较以前的道具和新的道具,并更新dom。
使用shouldComponentUpdate()让React知道组件的输出是否不受当前状态或属性更改的影响。默认行为是在每次状态更改时重新渲染,并且在绝大多数情况下,您应该依赖默认行为。
根据react,组件只有在状态改变时才会重新呈现。
此方法仅作为性能优化而存在。不要依赖它来“阻止”渲染,因为这可能会导致错误。考虑使用内置的PureComponent,而不是手动编写shouldComponentUpdate()。PureComponent执行属性和状态的浅层比较,减少了跳过必要更新的机会。
来源:https://reactjs.org/docs/react-component.html#shouldcomponentupdate
如果你仍然想要使用它,你需要衡量一下它的下行和上行。我认为你应该完全避免它,因为通过比较你可能会把事情搞砸的可能性更大。
发布于 2018-11-12 16:45:38
PureComponent中的ShouldComponentUpdate()将对当前和以前的属性和状态进行简单的比较。跳过整个渲染过程,包括在此组件及以下组件上调用render()。这完全避免了和解过程。这意味着react不需要更新V-DOM,也不需要与真正的DOM进行比较。与肤浅的比较相比,这是一项昂贵的任务。
https://stackoverflow.com/questions/53257997
复制相似问题