在 Functional Component 中,state 改变会触发整个function重跑也就是渲染了。但我们都希望尽可能减少重新渲染。(特别是长列表)
因为没有了生命周期函数shouldComponentUpdate
的替代者就是React.memo
事情源于想使用 virtual list 优化长列表渲染。选择了 antd 依赖的 rc-virtual-list 它的children是一个render prop 用来渲染 list item。 问题是怎样才能memo到这个 list item 也就是 render prop 呢?
https://codesandbox.io/s/dark-moon-svrgr?file=/src/App.tsx
这是一个小demo,点击 tigger 触发 state 变化就会看到,每次都会Item重新渲染一次, console.debug 上打了下log。
作为对比可以去掉注释掉的的简单使用map的列表, 可以看到它就不会在 tigger 时重新渲染(没有第二次的log)。
看了一眼 rc-virtual-list 使用这个render prop 的方式
正当我以为没办法的时候我看到了这篇文章: https://nervjs.github.io/taro/docs/next/virtual-list/
凭什么他就可以,组件不也是函数吗? 然后看了一眼他的用法
好吧。。。一个是返回组件的函数, 一个是个组件。还是有差别的。
所以有没有办法memo掉 render prop 呢😭另外用个memoize的库 ? (没试过这操作。。)