什么是keep-alive
keep-alive是一个抽象组件:它自身不会渲染一个DOM元素,也不会出现在父组件链中;使用keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。
(以上定义来自vue官方)
总而言之,就是保存组件状态,在需要时可以再调用的一种实现。
感觉是类似于进入一个页面进行一通操作后,返回之后仍然保留之前的操作状态。
写vue已经是很久之前的事了,目前也没有使用vue,所以主要想讨论用react的实现。
随便想想
以前接到的需求有希望在一个查询列表页点击某一条记录的详情后,点击返回再回到列表页时,保留当前页数和查询条件,当时最后还是使用了路由跳转传递参数的方法,在返回后取出参数,重新根据参数定位到特定页。
但是这样不属于keep-alive的概念,因为keep-alive应该是要保存整个组件的状态。
一开始的思路还是围绕着redux,将所有的state都存在一起,开辟一个新字段historyState:{},在某些需要的场景将整个state的快照push到historyState中,然后需要时从historyState和state交换,即可以达到“前进”跟“后退”。
如果需要多个快照,就放到数组里,首尾相连,但是这样子想想就觉得数据庞大的时候……整个state也会非常庞大,肯定不推荐。
思路
从实现react的过程中,也体会到了react的组件本质还是传递虚拟dom调用的function,只要能记录下虚拟dom对象,就相当于记录了整个组件。
善用搜索之后发现,果然现在提出的所有问题之前肯定都有人提出过了,目前已经有了react-keep-alive和react-activation之类的库。
整体的思路是在每次的render()之间增加中间层,用包裹在最外层,它传递了一个keep方法给所有的子孙组件,当有keep-alive的组件发生渲染时,将虚拟dom存储到一个中。
总的来说,还是如何更优化地缓存组件内容,等周末可以写一个实现试一下~