将函数放在这样的渲染中是一种不好的做法吗?
每次渲染都会创建这些函数,从而导致性能下降吗?性能有多大?是否有某个链接可以衡量这个或可靠的来源,说这很糟糕?
这是否会以任何方式导致不必要的渲染?我听说PureComponent
特别不是一个好主意。
无法澄清这是否合适。
class MyComponent extends Component {
...
render() {
const myFunc1 = () => {};
const myFunc2 = () => {};
const myFunc3 = () => {};
const myFunc4 = doSomething(() => {});
return (
<div>hello world</div>
);
}
}
答案 0 :(得分:3)
将函数放在这样的渲染中是一种不好的做法吗?
是的
每次渲染都会创建这些函数,从而导致性能下降吗?
是
性能有多大?
它可以从完全可以忽略不计(大多数简单组件)到绝对关键(如果您经常在复杂的应用程序上重新渲染整个树)。
是否有某个链接可以衡量这个或可靠来源说这是坏事?
这是否会以任何方式导致不必要的渲染?我听说这对PureComponent来说尤其不是一个好主意。
实际上,由于函数将在每次渲染时创建,如果将它们传递给PureComponent,它会认为函数已更改并将再次渲染。
无法澄清这是否合适。
我希望这会有所帮助。
答案 1 :(得分:1)
更像是一种不好的做法。它不会破坏您的代码,但可能会导致一些严重的性能问题。来自React Docs
此语法的问题是创建了不同的回调 每次组件渲染。在大多数情况下,这很好。然而, 如果这个回调作为prop传递给较低的组件,那些 组件可能会进行额外的重新渲染。我们一般建议 在构造函数中绑定或使用属性初始化器语法, 避免这种性能问题。
所以你在这个例子中所拥有的很好,因为你并没有将它作为道具传递下去。如果您将myFunc4
作为道具传递给div,那么您会看到一些性能问题。
答案 2 :(得分:0)
将函数放在这样的渲染中是一种不好的做法吗?
嗯,它肯定不是良好的练习,但从表现的角度来看,它完全取决于项目。
每次渲染都会创建这些函数,从而导致性能下降吗?性能有多大?
是,这些功能是在每次render
来电时创建的,如果你做的事情比今年的第600个求职玩具稍微复杂一点,那么你正在打电话你的render
反复快速(例如在60 FPS渲染周期中),新创建的函数对象将对性能产生次要影响,因为垃圾收集器必须更频繁地运行。 / p>
这又是依赖于项目和基于意见的,但是我们有一个规则,就是更喜欢在任何渲染调用之外创建非原始对象(或者与渲染直接关联的任何生命周期方法,例如{{1} })。
这是否会以任何方式导致不必要的渲染?
简单地在componentDidUpdate
内创建函数对象本身不会导致额外的不必要的渲染,但正如我所提到的,函数对象是在每次render
调用时创建的,这可能比你可能一开始就预料到了。
如果您还将这样的函数对象作为回调或处理程序传递给子组件,请记住,对于对props进行浅层引用检查的render
实现将触发,因为每个渲染都会传递给你一个不同的函数对象引用。